url地址解析
# -*- coding:utf-8 -*-
import re
import requests
import json
from jsonpath import jsonpath
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36',
}
def get_down_url(url):
mp4_urls = []
if re.search(r'av\d*', url):
aid = re.search(r'av(\d*)', url).group()[2:]
cid_url = 'https://www.bilibili.com/widget/getPageList?aid={}'.format(aid)
cid_resp = requests.get(url=cid_url, headers=headers).json()
cid = jsonpath(cid_resp, "$..cid")[0]
bilbil_url = 'https://www.xbeibeix.com/api/bilibiliapi.php?aid={}&cid={}'.format(aid, cid)
mp4_resp = requests.get(url=bilbil_url, headers=headers)
# 响应时间
# print(mp4_resp.elapsed)
mp4_url = jsonpath(mp4_resp.json(), "$['url']")[0]
mp4_urls.append(mp4_url)
return mp4_urls
else:
bv_path = (re.search(r'BV\w*', url).group())
av_url = 'https://api.bilibili.com/x/web-interface/view?bvid={}'.format(bv_path)
av_resp = requests.get(url=av_url).json()
aid = jsonpath(av_resp, "$['data']['aid']")[0]
if re.search(r'\?p=\d*', url):
p_tag = re.search(r'\?p=\d*', url).group()
pid = int(re.search(r'\d+', p_tag).group()) - 1
cid = jsonpath(av_resp, "$['data']['pages'][{}]['cid']".format(pid))[0]
bilbil_url = 'https://www.xbeibeix.com/api/bilibiliapi.php?aid={}&cid={}'.format(aid, cid)
mp4_resp = requests.get(url=bilbil_url, headers=headers)
mp4_url = jsonpath(mp4_resp.json(), "$['url']")[0]
mp4_urls.append(mp4_url)
else:
cids = jsonpath(av_resp, "$['data']['pages'][*]['cid']")
for cid in cids:
bilbil_url = 'https://www.xbeibeix.com/api/bilibiliapi.php?aid={}&cid={}'.format(aid, cid)
mp4_resp = requests.get(url=bilbil_url, headers=headers)
mp4_url = jsonpath(mp4_resp.json(), "$['url']")[0]
mp4_urls.append(mp4_url)
return mp4_urls
def down_mp4(port, key, video_urls):
# video_urls = [
# "https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo/60_634b1aeaeb595b2e6fba89229ab2ad6a.mp4",
# "https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo/60_b102d23686622da5134068cb3616b562.mp4"
# ]
aria2_url = "http://localhost:{}/jsonrpc".format(port)
for index, videoss in enumerate(video_urls):
jsonreq = json.dumps({
"jsonrpc": "2.0",
"method": "aria2.addUri",
"id": index,
"params": [
"token:{}".format(key),
[video_urls[index]],
{}
]
})
c = requests.post(url=aria2_url, data=jsonreq)
if __name__ == '__main__':
# aav_url = 'https://www.bilibili.com/video/av200764552'
bv_url = 'https://www.bilibili.com/video/BV1g4411H78N?p=1'
bv_url2 = 'https://www.bilibili.com/video/BV1AQ4y1N71n/?spm_id_from=333.788.videocard.1'
# down_mp4(2800, 'werqrqrasfatertg', get_down_url(bv_url2))
get_down_url(bv_url)
图形界面配置
# -*- coding:utf-8 -*-
from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
from PySide2.QtCore import QFile
from bilbil import get_down_url, down_mp4
class Stats:
def __init__(self):
qfile_stats = QFile(r'.\down_url.ui')
qfile_stats.open(QFile.ReadOnly)
qfile_stats.close()
self.ui = QUiLoader().load(qfile_stats)
self.ui.pushButton.clicked.connect(self.handleCalc)
self.ui.pushButton_2.clicked.connect(self.down_aria2)
def handleCalc(self):
url = self.ui.lineEdit.text()
if url:
mp4_urls = get_down_url(url)
for mp4_url in mp4_urls:
self.ui.plainTextEdit.appendPlainText(mp4_url)
def down_aria2(self):
videos_urls = []
video_url = self.ui.plainTextEdit.toPlainText()
videos_urls.append(video_url)
down_mp4(2800, 'werqrqrasfatertg', videos_urls)
app = QApplication([])
stats = Stats()
stats.ui.show()
app.exec_()
图形界面
down_url.ui
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>590</width>
<height>398</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="1" column="2" colspan="2">
<widget class="QPlainTextEdit" name="plainTextEdit"/>
</item>
<item row="0" column="3">
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>发送</string>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>请输入url</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
<property name="indent">
<number>14</number>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>MP4下载地址为</string>
</property>
<property name="indent">
<number>1</number>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLineEdit" name="lineEdit"/>
</item>
</layout>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>使用aria2下载</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
打包成exe
pyinstaller --add-data="C:\Users\Administrator\PycharmProjects\GUI\down_url.ui;down_url.ui" -F -w bilbil_gui.py --noconsole --hidden-import PySide2.QtXml
注意:
1、—add-data=”源地址;目标地址“,源地址为搜索文件的地址,这里使用绝对路径,”;”为os.pathsep(平台路径分割符,window为;其他为:),目标地址填写为down_url.ui,是代码运行时候所在文件夹下的文件名“down_url.ui”,编译完成后把程序所需要的down_url.ui文件拷贝到打包目录中
2、—noconsole 指定不要命令行窗口,否则我们的程序运行的时候,还会多一个黑窗口。
3、--hidden-import PySide2.QtXml
参数是因为这个 QtXml库是动态导入,PyInstaller没法分析出来,需要我们告诉它
4、常见可选参数
可选参数 | 格式举例 | 功能说明 |
---|---|---|
-F |
pyinstaller -F demo.py |
只在dist中生产一个demo.exe文件。 |
-D |
pyinstaller -D demo.py |
默认选项,除了demo.exe外,还会在在dist中生成很多依赖文件,推荐使用。 |
-c |
pyinstaller -c demo.py |
默认选项,只对windows有效,使用控制台,就像编译运行C程序后的黑色弹窗。 |
-w |
pyinstaller -w demo.py |
只对windows有效,不使用控制台。 |
-p |
pyinstaller -p E:\python\Lib\site-packages demo.py |
设置导入路径,一般用不到。 |
-i |
pyinstaller -i D:\file.icon demo.py |
将file.icon设置为exe文件的图标,推荐一个icon网站:icon |