1. 分析爬取地址
打开某乎首页,点击热榜
这个就是我们需要爬取的地址,取到地址某乎/api/v3/feed/topstory/hot-lists/total?limit=50&desktop=true
定义好请求头,从Accept往下的请求头全部复制,转换成json
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cookie': '你的请求头中的cookie',
'Sec-Ch-Ua': 'Not/A)Brand\';v=\'99\', \'Google Chrome\';v=\'115\', \'Chromium\';v=\'115',
'Sec-Ch-Ua-Mobile': '?0',
'Sec-Ch-Ua-Platform': 'Windows',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
'X-Ab-Param': '',
'X-Ab-Pb': 'CgInBxIBAA==',
'X-Api-Version': '3.0.76',
'X-Requested-With': 'fetch',
'X-Zse-93': '101_3_3.0',
'X-Zse-96': '2.0_6hUp=vt8=9zOcwtPHcLjutT0sL2PhwOPys0v=fvQr7yneBCmMO2zkvXcYfoc5esu'
}
2. 分析请求结果
通过请求可以看出,hot-lists/total?limit=50&desktop=true
请求后的返回参数直接是json格式,则不需要单独处理
定义好需要抓取的参数按元素获取即可
order_list = [] # 热榜排名
title_list = [] # 热榜标题
desc_list = [] # 热榜描述
url_list = [] # 热榜链接
hot_value_list = [] # 热度值
answer_count_list = [] # 回答数
data_list = json_data['data']
order = 1 # 热榜排名初始值
GET请求接口
response = requests.get(url=url, headers=headers)
json_data = response.json()
循环数组json并赋值
order_list.append(order)
# 热榜标题
title = data['target']['title_area']['text']
print(order, '热榜标题:', title)
title_list.append(title)
desc_list.append(data['target']['excerpt_area']['text'])
url_list.append(data['target']['link']['url'])
hot_value_list.append(data['target']['metrics_area']['text'])
answer_count_list.append(data['feed_specific']['answer_count'])
order += 1```
将结果导出到csv,注意定义一下编码集为utf_8_sig
df = pd.DataFrame(
{
'热榜排名': order_list,
'热榜标题': title_list,
'热榜链接': url_list,
'热度值': hot_value_list,
'回答数': answer_count_list,
'热榜描述': desc_list,
}
)
# 保存结果到csv文件
df.to_csv('知乎热榜.csv', index=False, encoding='utf_8_sig')
### 3. 结果验证
![在这里插入图片描述](https://img-blog.csdnimg.cn/eb0b9fdced6241e9bd7d6e941826b389.png)
### 注意:如果请求返回的json格式乱码,调整请求头Accept-Encoding,去掉br后即可