|
目录
您好,我是@马哥python说,一枚10年程序猿。
一、爬取目标
之前我分享过一篇知乎评论的爬虫教程,但是学习群中的小伙伴强烈要求爬取知乎回答,所以本次分享知乎回答的爬虫。
二、展示爬取结果
老规矩,先展示结果。
最近《罗刹海市》这首歌比较火,就爬这个问题下的回答吧:如何评价刀郎的新歌《罗刹海市》?
爬取了前200多页,每页5条数据,共1000多条回答。(程序设置的自动判断结束页,我是手动break的)
共爬到13个字段,包含:
问题id,页码,答主昵称,答主性别,答主粉丝数,答主主页,答主签名,回答id,回答时间,评论数,点赞数,喜欢数,回答内容
三、讲解代码
3.1 分析页面
我是通过知乎的ajax接口爬的。打开一个知乎问题,Chrome浏览器按F12进入开发者模式之后,多往下翻几页回答,就会找到目标请求地址,如下:
每翻一次页,就会出现一个请求,请求中含5条回答数据。
3.2 开发爬虫
首先,导入需要用到的库:- import requests
- import time
- import pandas as pd
- import os
- import re
- import random
复制代码 定义一个请求头:- # 请求头
- headers = {
- 'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
- }
复制代码 这里,我仅设置了user-agent足矣。(如果数据量仍未满足且遇到反爬,请尝试增加cookie等其他请求头解决)
定义请求地址(含指定问题id):- # 请求地址
- url = 'https://www.zhihu.com/api/v4/questions/{}/feeds?include=data%5B%2A%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cattachment%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Cis_labeled%2Cpaid_info%2Cpaid_info_content%2Creaction_instruction%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%3Bdata%5B%2A%5D.mark_infos%5B%2A%5D.url%3Bdata%5B%2A%5D.author.follower_count%2Cvip_info%2Cbadge%5B%2A%5D.topics%3Bdata%5B%2A%5D.settings.table_of_content.enabled&limit=5&offset=0&order=default&platform=desktop'.format(
- v_question_id)
复制代码 发送请求,并接收数据:- # 发送请求
- r = requests.get(url, headers=headers)
- # 接收返回数据
- j_data = r.json()
复制代码 定义一些空列表用于存放解析后数据:- author_name_list = [] # 答主昵称
- author_gender_list = [] # 答主性别
- follower_count_list = [] # 答主粉丝数
- author_url_list = [] # 答主主页
- headline_list = [] # 答主签名
- answer_id_list = [] # 回答id
- answer_time_list = [] # 回答时间
- answer_content_list = [] # 回答内容
- comment_count_list = [] # 评论数
- voteup_count_list = [] # 点赞数
- thanks_count_list = [] # 喜欢数
复制代码 以"回答内容"字段为例:- for answer in answer_list:
- # 回答内容
- try:
- answer_content = answer['target']['content']
- answer_content = clean_content(answer_content)
- except:
- answer_content = ''
- answer_content_list.append(answer_content)
复制代码 其他字段同理,不再赘述。
把数据保存为Dataframe并进一步保存到csv文件:- # 数据保存为Dataframe格式
- df = pd.DataFrame(
- {
- '问题id': v_question_id,
- '页码': page,
- '答主昵称': author_name_list,
- '答主性别': author_gender_list,
- '答主粉丝数': follower_count_list,
- '答主主页': author_url_list,
- '答主签名': headline_list,
- '回答id': answer_id_list,
- '回答时间': answer_time_list,
- '评论数': comment_count_list,
- '点赞数': voteup_count_list,
- '喜欢数': thanks_count_list,
- '回答内容': answer_content_list,
- }
- )
- # 保存到csv文件
- df.to_csv(v_result_file, mode='a+', index=False, header=header, encoding='utf_8_sig')
复制代码 保存到csv时加上encoding='utf_8_sig'参数,防止产生乱码问题。
至此,核心代码逻辑讲解完毕。完整代码还包括:转换时间格式、转换性别、正则表达式清洗回答内容、循环内判断结束页等功能,详见文末获取。
代码中,question_id换成任意知乎问题id,即可爬取该问题的对应回答。
四、同步视频
代码演示视频:
五、获取完整源码
附完整python源码:【2023知乎爬虫】知友怎么看待《罗刹海市》?爬了上千条知乎回答!
我是@马哥python说 ,一名10年程序猿,持续分享python干货中!
来源:https://www.cnblogs.com/mashukui/p/zhihu_answer.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|