首先,我们先要爬取的页面是这个,获取以下视频的详细信息(播放量,点赞数,作者等)
打开开发者工具,直接全局搜索第一个视频关键词“猫”,进入对应包中,查看详细信息。
我们发现响应数据都由json字符串构成。查看对应参数和url
我们猜测ps可能为个数,pn为页数,wts为时间戳,其他不知道。
再往下滑获取接下来视频的信息
查看参数
对比两张图的参数,我们可以确定:ps为视频数量,pn为页数,web_location为定值,
w_rid为变量(可能涉及js加密),wts为时间戳(等会用time.time()获取)
1.先解决w_rid的问题:
先搜索w_rid
发现第一个js里面有md5关键词,猜测为md5加密,我们进入第一个js里
接着搜索w_rid
只有一个匹配项,我们打上断点,刷新页面
很明显w_rid是采用了md5加密,里面参数的值是m+o的两个字符串,查看u
var m=u.join("&"),m是u列表里用&分开构成的一个字符串
接着我们在控制台获取m,o的值
再发一次请求对比里面参数有什么变化
ok我们可以发现m里的值wts为时间戳为变量,其他为定值,o本身也为定值。这样就很简单了。
2.写入md5相关代码
3.发送请求,获取json数据,提取json数据里的信息
对应的url
数据获取
4.保存数据到csv文件
保存成功
5.源码
import time import hashlib import csv import requests wts=int(time.time()) #u=['ids=2837%2C2836%2C2870%2C2953%2C2954%2C2955%2C2956%2C5672', 'pf=0', 'wts=1710828406'] u=[ 'ids=2837%2C2836%2C2870%2C2953%2C2954%2C2955%2C2956%2C5672', 'pf=0', f'wts={wts}' ] m='&'.join(u) o='ea1db124af3c7062474693fa704f4ff8' string=m+o md=hashlib.md5(string.encode())#創建md5對象 w_rid=md.hexdigest() fp=open('./B站Top100综合热门视频.csv','a',encoding='utf-8',newline='') csv_writer=csv.DictWriter(fp,fieldnames=['标题','视频号','作者','点赞','投币','转发','播放量','评论']) csv_writer.writeheader() for page in range(1,6): url=f'https://api.bilibili.com/x/web-interface/popular?ps=20&pn={page}&web_location=333.934&w_rid={w_rid}&wts={wts}' headers={ 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0' } json_data=requests.get(url=url,headers=headers).json() list=json_data['data']['list'] for li in list: title=li['title']#标题 aid=li['stat']['aid']#视频号 owner=li['owner']['name']#作者 favorite = li['stat']['favorite'] # 点赞 coin=li['stat']['coin']#投币 share=li['stat']['share']#转发 view = li['stat']['view'] # 播放量 reply=li['stat']['reply']#评论 dic={ '标题':title, '视频号':aid, '作者':owner, '点赞':favorite, '投币':coin, '转发':share, '播放量':view, '评论':reply } csv_writer.writerow(dic)