download.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. from random import choice
  2. import json
  3. from lxml import etree
  4. import requests
  5. import re
  6. import os
  7. import time
  8. from pathlib import Path
  9. import subprocess
  10. # from pydub import AudioSegment
  11. def get_user_agent():
  12. user_agents = [
  13. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
  14. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
  15. "Mozilla/4.0 (compatible; MSIE 7.0; AOL 9.5; AOLBuild 4337.35; Windows NT 5.1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
  16. "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)",
  17. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)",
  18. "Mozilla/5.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 1.0.3705; .NET CLR 1.1.4322)",
  19. "Mozilla/4.0 (compatible; MSIE 7.0b; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.2; .NET CLR 3.0.04506.30)",
  20. "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/523.15 (KHTML, like Gecko, Safari/419.3) Arora/0.3 (Change: 287 c9dfb30)",
  21. "Mozilla/5.0 (X11; U; Linux; en-US) AppleWebKit/527+ (KHTML, like Gecko, Safari/419.3) Arora/0.6",
  22. "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.2pre) Gecko/20070215 K-Ninja/2.1.1",
  23. "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9) Gecko/20080705 Firefox/3.0 Kapiko/3.0",
  24. "Mozilla/5.0 (X11; Linux i686; U;) Gecko/20070322 Kazehakase/0.4.5",
  25. "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.8) Gecko Fedora/1.9.0.8-1.fc10 Kazehakase/0.5.6",
  26. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
  27. "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_3) AppleWebKit/535.20 (KHTML, like Gecko) Chrome/19.0.1036.7 Safari/535.20",
  28. "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168 Version/11.52",
  29. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
  30. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER",
  31. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)",
  32. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E; LBBROWSER)",
  33. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 LBBROWSER",
  34. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
  35. "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; QQBrowser/7.0.3698.400)",
  36. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
  37. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; 360SE)",
  38. "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; QQDownload 732; .NET4.0C; .NET4.0E)",
  39. "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
  40. "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
  41. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1",
  42. "Mozilla/5.0 (iPad; U; CPU OS 4_2_1 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148 Safari/6533.18.5",
  43. "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:2.0b13pre) Gecko/20110307 Firefox/4.0b13pre",
  44. "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:16.0) Gecko/20100101 Firefox/16.0",
  45. "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
  46. "Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10",
  47. "MQQBrowser/26 Mozilla/5.0 (Linux; U; Android 2.3.7; zh-cn; MB200 Build/GRJ22; CyanogenMod-7) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
  48. "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1",
  49. "Mozilla/5.0 (Linux; Android 5.1.1; Nexus 6 Build/LYZ28E) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.23 Mobile Safari/537.36",
  50. "Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20",
  51. "Mozilla/5.0 (Linux;u;Android 4.2.2;zh-cn;) AppleWebKit/534.46 (KHTML,like Gecko) Version/5.1 Mobile Safari/10600.6.3 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
  52. "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
  53. ]
  54. return choice(user_agents)
  55. def audio_download(aid):
  56. BASE_DIR = Path(__file__).resolve().parent
  57. headers = {
  58. 'user-agent':get_user_agent(),
  59. 'referer':'https://www.bilibili.com/'
  60. }
  61. file_list = os.listdir(os.path.join(BASE_DIR,'download'))
  62. os.chdir(os.path.join(BASE_DIR,'download'))
  63. if len(file_list) > 5:
  64. latest = [0,file_list[0]]
  65. for f in file_list:
  66. create_time = os.stat(f).st_ctime
  67. if create_time < latest[0]:
  68. latest[0] = create_time
  69. latest[1] = f
  70. os.system('rm \"{}\"'.format(f))
  71. for i in range(5):
  72. try:
  73. response = requests.get('https://www.bilibili.com/video/'+aid,headers=headers)
  74. if response.status_code == 200:
  75. html = etree.HTML(response.text)
  76. # print('获取成功!')
  77. title_lst = html.xpath('//title[@data-vue-meta="true"]/text()')
  78. title = title_lst[0]
  79. str = title
  80. title = re.sub('/', '|', str)
  81. title = re.sub('\"','\'',title)
  82. title = re.sub('#','No.',title)
  83. print(title)
  84. pattern = '<script>window.__playinfo__=(.*?)</script>'
  85. info_text = json.loads(re.findall(string=response.text, pattern=pattern)[0])
  86. audio_url_list = []
  87. audio_url_list.append(info_text['data']['dash']['audio'][0]['baseUrl'])
  88. audio_url_list.append(info_text['data']['dash']['audio'][0]['base_url'])
  89. audio_url_list.extend(info_text['data']['dash']['audio'][0]['backupUrl'])
  90. # print('url获取成功')
  91. break
  92. except Exception as e:
  93. print(e)
  94. time.sleep(0.5)
  95. else:
  96. return "FAIL"
  97. if os.path.exists(os.path.join(BASE_DIR,('download/' + title + '.mp3'))):
  98. print('已存在')
  99. return (title + '.mp3')
  100. for audio_url in audio_url_list:
  101. audio_content = requests.get(audio_url, headers=headers)
  102. if audio_content.status_code == 200:
  103. print('开始下载,下载中...')
  104. download_path = os.path.join(BASE_DIR,'download')
  105. temp_path = os.path.join(BASE_DIR,'temp')
  106. os.chdir(temp_path)
  107. with open('{}.m4s'.format(title), 'wb') as f:
  108. f.write(audio_content.content)
  109. f.flush()
  110. mp3file = title + '.mp3'
  111. m4sfile = title + '.m4s'
  112. # subprocess.run(['ffmpeg', '-i', m4sfile, '-vn', '-ar', '44100', '-ac', '2', '-ab', '192k', '-f', 'mp3', download_path+'/'+mp3file],stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
  113. os.system('ffmpeg -i \"{}\" -vn -ar 44100 -ac 2 -ab 192k -f mp3 \"{}\"'.format(m4sfile,download_path+'/'+mp3file))
  114. # sound = AudioSegment.from_file(title + '.m4s', format="m4s")
  115. # sound.export(title + '.mp3', format="mp3")
  116. # os.rename(mp3file,download_path + '/' + mp3file)
  117. os.chdir(temp_path)
  118. os.system('rm \"{}\"'.format(m4sfile))
  119. os.chdir(download_path)
  120. print(title, '下载完成!')
  121. return (mp3file)
  122. else:
  123. print("FAIL!!!")
  124. def get_urls(bv):
  125. headers = {
  126. 'user-agent':get_user_agent(),
  127. 'referer':'https://www.bilibili.com/'
  128. }
  129. url = 'https://www.bilibili.com/video/' + bv + '/?p=1'
  130. for count in range(3):
  131. try:
  132. response = requests.get(url=url,headers=headers)
  133. j = re.findall('window\.__INITIAL_STATE__=\{(.*?)\};\(function\(\)',response.text)[0]
  134. j = "{" + j + "}"
  135. j = json.loads(j)
  136. # print(j)
  137. # print(j['videoData'])
  138. # print(j['videoData']['pages'])
  139. namelist = []
  140. pagelist = []
  141. urllist = []
  142. url_list = j['videoData']['pages']
  143. for i in url_list:
  144. pagelist.append(i['page'])
  145. namelist.append(i['part'])
  146. urllist.append('https://www.bilibili.com/video/{}/?p={}'.format(bv,i['page']))
  147. ziplist = zip(pagelist,namelist,urllist)
  148. return ziplist
  149. except Exception as e:
  150. print(e)
  151. time.sleep(0.5)
  152. else:
  153. return "FAIL"