Bilibili.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. # -*- coding: UTF-8 -*-
  2. import json
  3. import requests
  4. import re
  5. from moviepy.editor import VideoFileClip, AudioFileClip, CompositeVideoClip
  6. url = 'https://www.bilibili.com/video/BV1Pt421u7dL/?spm_id_from=pageDriver&vd_source=f6247aa12dae1ff1bce74ef0af381757'
  7. Audio_format = '.mp3'
  8. Video_format = '.mp4'
  9. Audio_path = 'D:/pyp/bilibili_pachong/bilibili_files/Audio/'
  10. Video_path = 'D:/pyp/bilibili_pachong/bilibili_files/Video/'
  11. Synth_path = 'D:/pyp/bilibili_pachong/bilibili_files/Files/'
  12. def GetResponse(url):
  13. headers = {
  14. 'accept': 'text / html, application / xhtml + xml, application / xml;q = 0.9, image / avif, image / webp, image / apng, * / *;q = 0.8, application / signed - exchange;v = b3;q = 0.7',
  15. 'accept - encoding': 'gzip, deflate',
  16. 'accept - language': 'zh - CN, zh;q = 0.9, en;q = 0.8, en - GB;q = 0.7, en - US;q = 0.6',
  17. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36 Edg/128.0.0.0',
  18. 'Referer':'https://search.bilibili.com/all?vt=44591831&keyword=%E8%B0%81%E7%94%B5%E5%90%89%E4%BB%96%E8%B0%B1&from_source=webtop_search&spm_id_from=333.1007&search_source=2'
  19. }
  20. response = requests.get(url = url,headers = headers)
  21. return response
  22. def GetVideoInfo() -> str:
  23. response = GetResponse(url = url)
  24. html = response.text
  25. info = re.findall('<script>window.__playinfo__=(.*?)</script>', html)[0]
  26. json_data = json.loads(info)
  27. audio_url = json_data['data']['dash']['audio'][0]['baseUrl']
  28. video_url = json_data['data']['dash']['video'][0]['baseUrl']
  29. # title = re.findall('<span data-v-492c8232="" class="title-text">(.*?)</span>', html )
  30. title = re.findall('<title data-vue-meta="true">(.*?)</title>', html )
  31. title = title[0]
  32. # print(title)
  33. if title:
  34. illegal_chars = fr'<|>\/:"*?'
  35. def remove_illegal_chars(title_ill):
  36. for char in illegal_chars:
  37. title_ill = title_ill.replace(char, "")
  38. return title_ill
  39. else:
  40. return None
  41. title = remove_illegal_chars(title)
  42. print("title:",title)
  43. return (title, audio_url, video_url)
  44. def Save(title,audio_url,video_url):
  45. audio_content = GetResponse(url = audio_url).content
  46. video_content = GetResponse(url = video_url).content
  47. with open(Audio_path + title + Audio_format, mode='wb') as audio:
  48. audio.write(audio_content)
  49. with open(Video_path + title + Video_format, mode='wb') as video:
  50. video.write(video_content)
  51. if __name__ == '__main__':
  52. title,audio_url,video_url = GetVideoInfo()
  53. Save(title, audio_url, video_url)
  54. # 加载视频和音频文件
  55. audio_path = fr"{Audio_path}{title}{Audio_format}"
  56. audio_clip = AudioFileClip(audio_path)
  57. video_path = fr"{Video_path}{title}{Video_format}"
  58. video_clip = VideoFileClip(video_path)
  59. # 确保音频和视频长度相同
  60. audio_clip = audio_clip.set_duration(video_clip.duration)
  61. # 将音频设置到视频上
  62. video_clip_with_audio = video_clip.set_audio(audio_clip)
  63. # 输出合并后的文件
  64. video_clip_with_audio.write_videofile(fr"{Synth_path}{title}{Video_format}", codec="libx264", audio_codec="aac")