url地址解析
# -*- coding:utf-8 -*-import reimport requestsimport jsonfrom jsonpath import jsonpathheaders = {'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_urlselse: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()) - 1cid = 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_urlsdef 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 QApplicationfrom PySide2.QtUiTools import QUiLoaderfrom PySide2.QtCore import QFilefrom bilbil import get_down_url, down_mp4class 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 |
