翼度科技»论坛 编程开发 python 查看内容

【2023知乎爬虫】知友怎么看待《罗刹海市》?爬了上千条知乎回答!

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
目录

您好,我是@马哥python说,一枚10年程序猿。
一、爬取目标

之前我分享过一篇知乎评论的爬虫教程,但是学习群中的小伙伴强烈要求爬取知乎回答,所以本次分享知乎回答的爬虫。
二、展示爬取结果

老规矩,先展示结果。
最近《罗刹海市》这首歌比较火,就爬这个问题下的回答吧:如何评价刀郎的新歌《罗刹海市》?

爬取了前200多页,每页5条数据,共1000多条回答。(程序设置的自动判断结束页,我是手动break的)
共爬到13个字段,包含:
问题id,页码,答主昵称,答主性别,答主粉丝数,答主主页,答主签名,回答id,回答时间,评论数,点赞数,喜欢数,回答内容
三、讲解代码

3.1 分析页面

我是通过知乎的ajax接口爬的。打开一个知乎问题,Chrome浏览器按F12进入开发者模式之后,多往下翻几页回答,就会找到目标请求地址,如下:

每翻一次页,就会出现一个请求,请求中含5条回答数据。
3.2 开发爬虫

首先,导入需要用到的库:
  1. import requests
  2. import time
  3. import pandas as pd
  4. import os
  5. import re
  6. import random
复制代码
定义一个请求头:
  1. # 请求头
  2. headers = {
  3.     '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',
  4. }
复制代码
这里,我仅设置了user-agent足矣。(如果数据量仍未满足且遇到反爬,请尝试增加cookie等其他请求头解决)
定义请求地址(含指定问题id):
  1. # 请求地址
  2.     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(
  3.         v_question_id)
复制代码
发送请求,并接收数据:
  1. # 发送请求
  2. r = requests.get(url, headers=headers)
  3. # 接收返回数据
  4. j_data = r.json()
复制代码
定义一些空列表用于存放解析后数据:
  1. author_name_list = []  # 答主昵称
  2. author_gender_list = []  # 答主性别
  3. follower_count_list = []  # 答主粉丝数
  4. author_url_list = []  # 答主主页
  5. headline_list = []  # 答主签名
  6. answer_id_list = []  # 回答id
  7. answer_time_list = []  # 回答时间
  8. answer_content_list = []  # 回答内容
  9. comment_count_list = []  # 评论数
  10. voteup_count_list = []  # 点赞数
  11. thanks_count_list = []  # 喜欢数
复制代码
以"回答内容"字段为例:
  1. for answer in answer_list:
  2.     # 回答内容
  3.     try:
  4.         answer_content = answer['target']['content']
  5.         answer_content = clean_content(answer_content)
  6.     except:
  7.         answer_content = ''
  8.     answer_content_list.append(answer_content)
复制代码
其他字段同理,不再赘述。
把数据保存为Dataframe并进一步保存到csv文件:
  1. # 数据保存为Dataframe格式
  2. df = pd.DataFrame(
  3.     {
  4.         '问题id': v_question_id,
  5.         '页码': page,
  6.         '答主昵称': author_name_list,
  7.         '答主性别': author_gender_list,
  8.         '答主粉丝数': follower_count_list,
  9.         '答主主页': author_url_list,
  10.         '答主签名': headline_list,
  11.         '回答id': answer_id_list,
  12.         '回答时间': answer_time_list,
  13.         '评论数': comment_count_list,
  14.         '点赞数': voteup_count_list,
  15.         '喜欢数': thanks_count_list,
  16.         '回答内容': answer_content_list,
  17.     }
  18. )
  19. # 保存到csv文件
  20. 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

举报 回复 使用道具