Python爬虫实战: 批量下载百度好看视频
import requests
import os
import json
from moviepy.editor import VideoFileClip, AudioFileClip
from bs4 import BeautifulSoup
# 目标网页分析
# 通过浏览器开发者工具分析目标网页结构,找到视频数据所在的json接口
# 数据抓取
base_url = 'https://haokan.baidu.com/haokan/ui-search/pc/search/video?pn=2&rn=10&type=video&query=%E4%BD%A0%E7%9A%84%E5%90%8D%E5%AD%97&sign=2753e5d9aa663a17bda4aefe7d70c195&version=1×tamp=1689934533378'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36 Edg/99.0.1150.55',
'referer': 'https://haokan.baidu.com/v?vid=4662423747805012530',
'cookie': '填写你获取的cookie' # 替换成你实际获取的cookie
}
response = requests.get(base_url, headers=headers) # 发送请求
if response.status_code == 200:
data = response.text
else:
print('请求失败,状态码:', response.status_code)
exit()
# 数据解析
try:
json_data = json.loads(data) # 将json格式数据转换为python字典
video_list = json_data['data']['list'] # 根据网页结构提取视频列表
except KeyError:
print('数据解析错误,请检查网页结构是否发生变化')
exit()
# 视频下载
if not os.path.exists('./视频/'):
os.mkdir('./视频/')
for video in video_list:
video_title = video['title'] + '.mp4' # 提取视频标题
video_url = video['url'] # 提取视频播放地址
print(f'正在下载: {video_title},播放地址: {video_url}')
try:
video_data = requests.get(video_url, headers=headers).content # 下载视频内容
with open(f'./视频/{video_title}', 'wb') as f:
f.write(video_data)
print('下载完成\n')
except Exception as e:
print(f'下载失败: {video_title},错误信息: {e}')
错误分析:
原代码出现 KeyError: 'response' 的原因是在获取的json数据中,'data'键的下一级并没有'response'这个键。
代码改进:
- 明确目标数据结构: 通过分析实际返回的json数据,确定视频列表存储在
json_data['data']['list']中。 - 异常处理: 使用
try...except块捕获KeyError异常,防止程序因数据结构变化而崩溃,并给出更友好的提示信息。 - 代码注释: 添加了代码注释,解释每一部分的功能和实现逻辑,提高代码可读性。
- 文件保存: 创建 '视频' 文件夹用于保存下载的视频,避免文件混乱。
- 信息输出: 使用 f-string 格式化输出下载信息,更简洁易读。
注意事项:
- 百度好看视频的网页结构可能发生变化,导致代码失效,需要重新分析网页结构并修改代码。
- 爬取网页信息时请遵守 robots 协议和相关法律法规。
- 下载大量视频可能会占用较多带宽和存储空间,请谨慎操作。
原文地址: https://www.cveoy.top/t/topic/fRlk 著作权归作者所有。请勿转载和采集!