百度好看视频爬虫:解析JSON数据,下载视频
import requests
import os
import json
from moviepy.editor import VideoFileClip, AudioFileClip
from bs4 import BeautifulSoup
# 数据的抓取
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': 'BAIDUID_BFESS=41E64B4A4FE7E58286910E4CD6451D99:FG=1; __bid_n=188ae9b0787832d3fa4207; FPTOKEN=yN+gTGvaRHGRBrB2gcFYNfqb8znvTKQWVkm3NVzVNa8JauDDh4YgYldv5FXR1QbQf2Z6sD6YZfDi9ramXHt2XWIu7JcEe6JRMKShF7z0hOK9/EjpQOMYK/KrIIDzn1a8WG2KJuANDoF9uXhFiRh7s0lCgFsL8sEgc/GYlDOe4/6LIXnmDAFHIrPFPf7rDkWJxnccNFENixJJa0urzlcTiRzZnCQz4WpNaJhB5l1x3nSjAg+A6k3h3sk8YRJq+TObVt80JTwOjrchFAr5lO+pfkAV9nUJ/BdbhBcAK1bo7tWBkEm8Ox/4SpLFnwUjJgZ+2PX8JVpP872WibfP8/IYLfsmgPkVelgRfGtXOzcYQFecZRvho1WYjw/NPsqs2j1AZ4L3MsvfhvT0mAMmx0Ejpg==|6GtBgaCkbbg14uotso6iGjBE0BOmRdmpA3RM2xU+iPM=|10|151c74c42cd5e5842f643f6f329cc41d; jsdk-uuid=372c0a47-11fc-4013-b583-113dd66bed45; Hm_lvt_4aadd610dfd2f5972f1efee2653a2bc5=1689932808; BDUSS=Q0eVU1em9RY3dzc3lZd0tFTnRaSVlSZ01zcVRta2l4aWtvcnJ0fkJiQXI0ZUZrSVFBQUFBJCQAAAAAAQAAAAEAAACGrpNCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtUumQrVLpkOU; BDUSS_BFESS=Q0eVU1em9RY3dzc3lZd0tFTnRaSVlSZ01zcVRta2l4aWtvcnJ0fkJiQXI0ZUZrSVFBQUFBJCQAAAAAAQAAAAEAAACGrpNCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACtUumQrVLpkOU; hkpcSearch=%u4F60%u7684%u540D%u5B57; PC_TAB_LOG=video_details_page; COMMON_LID=7bd2af4edb27287b3ac8b2cfcd2e7c7a; Hm_lpvt_4aadd610dfd2f5972f1efee2653a2bc5=1689933044; ariaDefaultTheme=undefined; ab_sr=1.0.1_NjFhZjE2ZmNiMjUwMzI1ZGIzN2VlZWVkZmQ3NDExM2M5MzMxOGMzYjJlNWNkNTVmMDg5ZmI2NGYxMDU1Yjk4YjEwNGM3OTlkNTY1MjU1Mjk3YTMyNWQ1ZjEwN2ZhOGZjNTNjYzU4OThkYjBiZTg3NzczMmMxZGE0ZjcxYWNlMmE3NDgxNzIwM2I5MDU5ODFiYzNhZmQ0ODMzNGQ1MjVhYQ==; reptileData=%7B%22data%22%3A%22889395e71af63ebf453cab9a1aaa0d0095f41f8d61f3714d6ad1a0cb5581229bad74f17646eb7578fba710523aeff1c1917424ebd7ca2fc18dc7c6d8aef1319a838942f1ae317b2fd22cf8e1aa9542ea54d1daeacce7307a89cfda3ef3e2bfbb%22%2C%22key_id%22%3A%2230%22%2C%22sign%22%3A%22891a9956%22%7D; RT='z=1&dm=baidu.com&si=46e6622b-7276-41cc-a209-ce37f0bd2058&ss=lkcee0u7&sl=4&tt=8be&bcn=https%3A%2F%2Ffclog.baidu.com%2Flog%2Fweirwood%3Ftype%3Dperf&ld=4802&ul=4gn5&hd=4gt2'',
}
response = requests.get(base_url, headers=headers) # 第一次请求
print(response.status_code)
data = response.text
print(data)
# 数据解析, jsonload转换为python格式
json_data = json.loads(data)
print(json_data)
json_list = json_data['data']['list']
print(json_list)
for data in json_list:
video_title = data['title'] + '.mp4'
# 确认play_url字段是否存在
video_url = data.get('play_url')
if video_url:
print(video_title, video_url)
print('正在下载:', video_title)
# 第二次请求
video_data = requests.get(video_url, headers=headers).content
with open(r'./视频/' + video_title, 'wb') as f:
f.write(video_data)
print('下载完成
')
else:
print('play_url字段不存在')
错误原因:
上述代码的错误原因是在解析JSON数据时,没有正确获取到play_url字段。可能是因为JSON数据结构发生了变化,play_url字段不存在。
解决方法:
- 打印JSON数据: 使用
print(json_data)打印出JSON数据,查看其中的结构,确认play_url字段是否存在。 - 检查字段是否存在: 使用字典的
get方法来获取play_url字段,并检查该字段是否存在。如果不存在,则打印提示信息,避免出现KeyError异常。
代码优化:
- 使用
get方法获取play_url字段,避免出现KeyError异常。 - 添加判断语句,检查
play_url字段是否存在,如果不存在,则打印提示信息。
总结:
代码中使用get方法获取字段,并添加判断语句,可以有效地解决JSON解析中出现KeyError的问题。同时,代码也进行了优化,增强了代码的健壮性和可读性。
温馨提示:
- 建议定期检查JSON数据结构,确保代码能够正常运行。
- 对于抓取的网站,建议遵守网站的Robots协议,避免对网站造成负面影响。
- 使用爬虫时,请注意数据隐私和版权问题。
原文地址: https://www.cveoy.top/t/topic/fRkU 著作权归作者所有。请勿转载和采集!