原理解析

B站最近使用BV号取代了原有的AV号,👴的青春结束了,为了找回青春特地编写该程序。

任意打开B站的一个视频,可以发现URL栏已经变成了BV号

但是输入原来的AV号依然可以访问比如av170001

查看网页的源代码,可以看到在箭头处看到第一行的AV号以及下一行的封面图链接

最后根据表单提供的BV号返回对应的AV号和封面图链接即可

准备工作

  1. 安装Python3.6以上并下载pip

  2. 安装项目所需要的第三方库

    pip install django #安装Django框架的库

    pip install requests #安装爬虫所需要的库

  3. 创建Django项目与APP

django-admin startproject BiliBili #创建项目

cd BiliBili #进入项目

django-admin startapp Get #创建APP

Django配置

  1. settings.py配置
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'Get',
]
  1. Get文件夹中创建三个文件夹

Rep # 存放Python爬虫文件

static #存放CSS JS IMG文件

templates #存放html文件

  1. 创建reptile.py文件(爬虫代码)
import re
import requests

url = "https://www.bilibili.com/video/"

def get_html(bv):
    htmlurl = url+bv
    html = requests.get(htmlurl)
    html = html.text

    img = re.findall(r'<meta data-vue-meta="true" itemprop="image" content="(.*?)">', html, re.S)
    av = re.findall(r'<meta data-vue-meta="true" itemprop="url" content="https://www.bilibili.com/video/(.*?)/">', html, re.S)

    return av[0], img[0]
  1. 配置views.py文件
from django.shortcuts import render

from .Rep import reptile as rep

# Create your views here.

def get_html(request):
    if request.method == 'POST':
        name = request.POST.get('text')

        av, img = rep.get_html(name)
        return render(request, template_name='index.html', context={
            'av': av, 'img': img
        })
    return render(request, 'index.html')
  1. 配置urls.py文件
from django.contrib import admin
from django.urls import path
from Get import views
urlpatterns = [
    path('admin/', admin.site.urls),
    path('', views.get_html),
]
  1. 配置setting.py文件(位于最下面)
STATIC_URL = '/static/'
STATICFILES_DIRS = (
    os.path.join(BASE_DIR, 'static'),
)
  1. 配置index.html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>Hello</h1>
    <form action="/" method="post">
        {% csrf_token %}
        <input type="text" name="text" value="">
        <input type="submit" value="提交">

    </form>
    <h2>该视频的av号为{{av}}</h2>
    <img src="{{img}}">
</body>
</html>

关于Django配置的一些参数可以看之前的博客

Django连接MySQL并在网页中显示数据

运行

python runserver manage.py 0.0.0.0:8000 
#0.0.0.0 可以在网络中被访问
#8000指定端口号

效果图

常见问题

Python版本问题

Linux中内置Python2所以需要更新,而更新后例如宝塔等依赖还需要Python2支持,所以在输入命令时需要将python改成python3

Django版本问题

使用pip直接下载Django后,启动运行会报错,所以可降低版本

pip install django==2.1.8

提交表单出现403错误

是因为post提交时为了防止CSRF攻击,需设置一个Token来验证

在表单代码中加入{% csrf_token %}

样例代码已加入

python manage.py migrate’ to apply them.错误

输入命令

python manage.py migrate

仓库链接

如有错误,感谢各位大佬指出


一只小菜鸡