Python采集B站法外狂徒张三所有视频(含JS逆向解密)
一、环境与模块准备1. 环境使用- Python 3.8
- PyCharm(或其他IDE)
2. 模块使用- requests:用于发送HTTP请求。
- csv:用于将数据保存为CSV格式。
- datetime:用于处理时间戳。
- hashlib:用于生成MD5哈希值,用于B站API的签名。
- time:用于获取当前时间戳。
二、爬虫实现基本流程1. 数据来源分析- 明确需求:采集B站UP主“法外狂徒张三”(mid=517327498)的所有视频信息,包括标题、播放量、评论、弹幕、上传时间等。
- 抓包分析:
打开浏览器开发者工具(F12)。
在“Network”选项卡中筛选XHR请求。
找到视频列表API请求,如:
https://api.bilibili.com/x/space/wbi/arc/search?mid=517327498&ps=30&tid=0&pn=1&keyword=&order=pubdate&platform=web&web_location=1550101&order_avoided=true&w_rid=c9a9f931486961175b1e8138d695680e&wts=1690027894
注意参数w_rid和wts,其中w_rid是MD5签名,wts是当前时间戳。
2. 代码实现步骤- 发送请求:模拟浏览器访问API链接。
- 获取数据:从响应中提取JSON数据。
- 解析数据:提取视频标题、播放量、评论等字段。
- 保存数据:将数据写入CSV文件。
三、代码实现import timeimport requestsimport csvimport datetimeimport hashlib# 初始化CSV文件f = open('法外狂徒张三视频信息.csv', mode='w', encoding='utf-8', newline='')csv_writer = csv.DictWriter(f, fieldnames=[ '标题', '描述', 'BV号', '播放量', '弹幕', '评论', '时长', '上传时间'])csv_writer.writeheader()# 请求头,模拟浏览器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'}# 循环获取多页数据for page in range(1, 11): # 假设获取前10页 # 构造签名参数 string = f'keyword=&mid=517327498&order=pubdate&order_avoided=true&platform=web&pn={page}&ps=30&tid=0&web_location=1550101&wts={int(time.time())}' md5_hash = hashlib.md5(string.encode('utf-8')).hexdigest() # API请求参数 params = { 'mid': '517327498', 'ps': '30', 'tid': '0', 'pn': page, 'keyword': '', 'order': 'pubdate', 'platform': 'web', 'web_location': '1550101', 'order_avoided': 'true', 'w_rid': md5_hash, 'wts': int(time.time()) } # 发送请求 url = 'https://api.bilibili.com/x/space/wbi/arc/search'
response = requests.get(url, params=params, headers=headers) data = response.json() # 解析数据 for video in data['data']['list']['vlist']: # 转换时间戳为日期 upload_time = datetime.datetime.fromtimestamp(video['created']).strftime('%Y-%m-%d') video_info = { '标题': video['title'], '描述': video['description'], 'BV号': video['bvid'], '播放量': video['play'], '弹幕': video['video_review'], '评论': video['comment'], '时长': video['length'], '上传时间': upload_time } csv_writer.writerow(video_info) print(video_info)f.close()四、关键点说明签名生成:
B站API需要w_rid(MD5签名)和wts(时间戳)。
签名规则:将参数按固定顺序拼接成字符串,计算MD5值。
分页处理:
通过pn参数控制页码,循环获取多页数据。
数据解析:
响应数据为JSON格式,通过data['data']['list']['vlist']提取视频列表。
时间处理:
使用datetime模块将时间戳转换为可读日期。
五、注意事项反爬机制:
B站可能对频繁请求进行限制,建议添加延迟(如time.sleep(1))。
如遇403错误,可能需要更新User-Agent或使用代理IP。
合法性:
爬取数据需遵守B站robots.txt协议,避免高频请求影响服务器。
数据存储:
CSV文件默认保存在脚本同目录下,可修改路径。
六、扩展功能下载视频:
可通过视频BV号调用you-get或yt-dlp工具下载。
增量更新:
记录上次爬取时间,仅获取新发布视频。
异常处理:
添加try-except块捕获网络请求或解析错误。
通过以上代码和说明,你可以完整采集“法外狂徒张三”的所有视频信息。如需进一步优化或扩展功能,可结合实际需求调整代码。