url地址解析

  1. # -*- coding:utf-8 -*-
  2. import re
  3. import requests
  4. import json
  5. from jsonpath import jsonpath
  6. headers = {
  7. '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',
  8. }
  9. def get_down_url(url):
  10. mp4_urls = []
  11. if re.search(r'av\d*', url):
  12. aid = re.search(r'av(\d*)', url).group()[2:]
  13. cid_url = 'https://www.bilibili.com/widget/getPageList?aid={}'.format(aid)
  14. cid_resp = requests.get(url=cid_url, headers=headers).json()
  15. cid = jsonpath(cid_resp, "$..cid")[0]
  16. bilbil_url = 'https://www.xbeibeix.com/api/bilibiliapi.php?aid={}&cid={}'.format(aid, cid)
  17. mp4_resp = requests.get(url=bilbil_url, headers=headers)
  18. # 响应时间
  19. # print(mp4_resp.elapsed)
  20. mp4_url = jsonpath(mp4_resp.json(), "$['url']")[0]
  21. mp4_urls.append(mp4_url)
  22. return mp4_urls
  23. else:
  24. bv_path = (re.search(r'BV\w*', url).group())
  25. av_url = 'https://api.bilibili.com/x/web-interface/view?bvid={}'.format(bv_path)
  26. av_resp = requests.get(url=av_url).json()
  27. aid = jsonpath(av_resp, "$['data']['aid']")[0]
  28. if re.search(r'\?p=\d*', url):
  29. p_tag = re.search(r'\?p=\d*', url).group()
  30. pid = int(re.search(r'\d+', p_tag).group()) - 1
  31. cid = jsonpath(av_resp, "$['data']['pages'][{}]['cid']".format(pid))[0]
  32. bilbil_url = 'https://www.xbeibeix.com/api/bilibiliapi.php?aid={}&cid={}'.format(aid, cid)
  33. mp4_resp = requests.get(url=bilbil_url, headers=headers)
  34. mp4_url = jsonpath(mp4_resp.json(), "$['url']")[0]
  35. mp4_urls.append(mp4_url)
  36. else:
  37. cids = jsonpath(av_resp, "$['data']['pages'][*]['cid']")
  38. for cid in cids:
  39. bilbil_url = 'https://www.xbeibeix.com/api/bilibiliapi.php?aid={}&cid={}'.format(aid, cid)
  40. mp4_resp = requests.get(url=bilbil_url, headers=headers)
  41. mp4_url = jsonpath(mp4_resp.json(), "$['url']")[0]
  42. mp4_urls.append(mp4_url)
  43. return mp4_urls
  44. def down_mp4(port, key, video_urls):
  45. # video_urls = [
  46. # "https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo/60_634b1aeaeb595b2e6fba89229ab2ad6a.mp4",
  47. # "https://gss3.baidu.com/6LZ0ej3k1Qd3ote6lo7D0j9wehsv/tieba-smallvideo/60_b102d23686622da5134068cb3616b562.mp4"
  48. # ]
  49. aria2_url = "http://localhost:{}/jsonrpc".format(port)
  50. for index, videoss in enumerate(video_urls):
  51. jsonreq = json.dumps({
  52. "jsonrpc": "2.0",
  53. "method": "aria2.addUri",
  54. "id": index,
  55. "params": [
  56. "token:{}".format(key),
  57. [video_urls[index]],
  58. {}
  59. ]
  60. })
  61. c = requests.post(url=aria2_url, data=jsonreq)
  62. if __name__ == '__main__':
  63. # aav_url = 'https://www.bilibili.com/video/av200764552'
  64. bv_url = 'https://www.bilibili.com/video/BV1g4411H78N?p=1'
  65. bv_url2 = 'https://www.bilibili.com/video/BV1AQ4y1N71n/?spm_id_from=333.788.videocard.1'
  66. # down_mp4(2800, 'werqrqrasfatertg', get_down_url(bv_url2))
  67. get_down_url(bv_url)

图形界面配置

  1. # -*- coding:utf-8 -*-
  2. from PySide2.QtWidgets import QApplication
  3. from PySide2.QtUiTools import QUiLoader
  4. from PySide2.QtCore import QFile
  5. from bilbil import get_down_url, down_mp4
  6. class Stats:
  7. def __init__(self):
  8. qfile_stats = QFile(r'.\down_url.ui')
  9. qfile_stats.open(QFile.ReadOnly)
  10. qfile_stats.close()
  11. self.ui = QUiLoader().load(qfile_stats)
  12. self.ui.pushButton.clicked.connect(self.handleCalc)
  13. self.ui.pushButton_2.clicked.connect(self.down_aria2)
  14. def handleCalc(self):
  15. url = self.ui.lineEdit.text()
  16. if url:
  17. mp4_urls = get_down_url(url)
  18. for mp4_url in mp4_urls:
  19. self.ui.plainTextEdit.appendPlainText(mp4_url)
  20. def down_aria2(self):
  21. videos_urls = []
  22. video_url = self.ui.plainTextEdit.toPlainText()
  23. videos_urls.append(video_url)
  24. down_mp4(2800, 'werqrqrasfatertg', videos_urls)
  25. app = QApplication([])
  26. stats = Stats()
  27. stats.ui.show()
  28. app.exec_()

图形界面

down_url.ui

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>Form</class>
  4. <widget class="QWidget" name="Form">
  5. <property name="geometry">
  6. <rect>
  7. <x>0</x>
  8. <y>0</y>
  9. <width>590</width>
  10. <height>398</height>
  11. </rect>
  12. </property>
  13. <property name="windowTitle">
  14. <string>Form</string>
  15. </property>
  16. <layout class="QVBoxLayout" name="verticalLayout">
  17. <item>
  18. <layout class="QGridLayout" name="gridLayout">
  19. <item row="1" column="2" colspan="2">
  20. <widget class="QPlainTextEdit" name="plainTextEdit"/>
  21. </item>
  22. <item row="0" column="3">
  23. <widget class="QPushButton" name="pushButton">
  24. <property name="text">
  25. <string>发送</string>
  26. </property>
  27. </widget>
  28. </item>
  29. <item row="0" column="0">
  30. <widget class="QLabel" name="label">
  31. <property name="text">
  32. <string>请输入url</string>
  33. </property>
  34. <property name="wordWrap">
  35. <bool>false</bool>
  36. </property>
  37. <property name="indent">
  38. <number>14</number>
  39. </property>
  40. </widget>
  41. </item>
  42. <item row="1" column="0">
  43. <widget class="QLabel" name="label_2">
  44. <property name="text">
  45. <string>MP4下载地址为</string>
  46. </property>
  47. <property name="indent">
  48. <number>1</number>
  49. </property>
  50. </widget>
  51. </item>
  52. <item row="0" column="2">
  53. <widget class="QLineEdit" name="lineEdit"/>
  54. </item>
  55. </layout>
  56. </item>
  57. <item>
  58. <widget class="QPushButton" name="pushButton_2">
  59. <property name="text">
  60. <string>使用aria2下载</string>
  61. </property>
  62. </widget>
  63. </item>
  64. </layout>
  65. </widget>
  66. <resources/>
  67. <connections/>
  68. </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

5、相关链接
链接 链接 链接 链接