import requests import re import json from moviepy.editor import VideoFileClip, AudioFileClip headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/114.0', "referer": "https://message.bilibili.com/" } def get_url_html(url): req = requests.get(url, headers=headers) htmltext = req.text get_json(htmltext) def get_json(htmltxt): r = re.findall(r'<script>window.__playinfo__=(.*?)</script>', htmltxt)[0] js = json.loads(r) print(js) audiourl = js["data"]["dash"]["audio"][0]["base_url"] videourl = js["data"]["dash"]["video"][0]["base_url"] download(audiourl, videourl) def download(audiourl, videourl): res = requests.get(url=audiourl, headers=headers) print('音频爬取中,等待....') with open("未命名.mp3", "wb") as f: f.write(res.content) res = requests.get(url=videourl, headers=headers) print('视频爬取中,等待....') with open("未命名.mp4", "wb") as f: f.write(res.content) merge_audio_video("未命名.mp3", "未命名.mp4", "下载.mp4") print('合并完毕!') def merge_audio_video(audio_path, video_path, output_path): audio = AudioFileClip(audio_path) video = VideoFileClip(video_path) video = video.set_audio(audio) video.write_videofile(output_path, codec="libx264", audio_codec="aac") if __name__ == "__main__": url=input("请输入B站视频播放链接:") get_url_html(url)
时间: 2024-01-03 11:03:46 浏览: 151
这段代码是一个用于从B站视频链接中爬取音频和视频,并将它们合并成一个新的视频文件的程序。具体来说,它使用了requests库来发送HTTP请求,re库来进行正则表达式匹配,json库来解析JSON数据,以及moviepy库用于处理音频和视频文件。
首先,它定义了一个名为`headers`的字典,用于设置HTTP请求的头部信息,包括User-Agent和referer。然后,它定义了一个名为`get_url_html`的函数,用于获取指定B站视频链接的HTML内容,并将HTML内容传递给`get_json`函数进行处理。
在`get_json`函数中,它使用正则表达式从HTML内容中提取出包含视频信息的JSON数据,并将其转化为Python对象。然后,它从JSON数据中获取音频和视频的下载链接,并将这些链接传递给`download`函数进行下载。
在`download`函数中,它使用requests库下载音频和视频文件,并分别保存到本地文件中。然后,它调用`merge_audio_video`函数将音频和视频合并成一个新的视频文件,并保存为"下载.mp4"。
最后,在`if __name__ == "__main__":`条件下,它通过用户输入获取B站视频链接,并调用`get_url_html`函数开始执行爬取和合并操作。
请注意,这段代码依赖于requests、re、json和moviepy库,需要在运行之前确保这些库已经安装。另外,合并音频和视频需要一定的时间,可能会根据视频的大小和网络环境而有所不同。
相关问题
帮我优化一下代码:import requests from lxml import html url = "https://www.baidu.com" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers) html_tree = html.fromstring(response.content) titles = html_tree.xpath('//ul[@class="s-hotsearch-content"]/li/a/text()') print(titles)
以下是对给定代码的优化建议:
1. 可以将导入的库放在一起,提高代码的可读性。
2. 可以使用更具体的XPath路径表达式来获取标题,以提高代码的准确性。
3. 可以将获取标题的逻辑提取为一个函数,以便复用和测试。
4. 可以添加适当的错误处理机制,防止因异常情况导致程序中断。
下面是优化后的代码示例:
```python
import requests
from lxml import html
def get_titles(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status() # 检查请求是否成功
html_tree = html.fromstring(response.content)
titles = html_tree.xpath('//ul[@class="s-hotsearch-content"]/li/a/text()')
return titles
except requests.exceptions.RequestException as e:
print("请求出错:", e)
return []
url = "https://www.baidu.com"
titles = get_titles(url)
print(titles)
```
通过将获取标题的逻辑封装为函数,并添加了错误处理机制,可以提高代码的可读性和健壮性。这样,在其他地方需要获取标题时,只需调用该函数即可。
import requests import re import os session = requests.Session() # (1) 爬取m3u8文件的链接 url = "https://www.9tata.cc/play/14999-1-0.html" headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36' } res = session.get(url, headers=headers, verify=False) m3u8_link = re.search('now="(.*?m3u8)"', res.text).group(1) print(m3u8_link)
这段代码的功能是爬取一个网站的某个视频的m3u8文件链接。其中,requests模块用于发送HTTP请求和接收HTTP响应,re模块用于正则表达式匹配,os模块用于文件操作。
首先,创建一个Session实例,可以保持会话并在请求之间共享cookie。然后,发送GET请求到指定的URL,并设置请求头部信息。 verify=False表示忽略SSL证书验证,这在爬取一些HTTPS网站时可能会用到。
接着,使用正则表达式从响应文本中提取m3u8文件链接,并打印输出。注意,re.search返回的是一个Match对象,需要使用group(1)方法获取第一个匹配分组的内容。
阅读全文