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


您好,我是@马哥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,即可爬取该问题的对应回答。

四、同步视频

代码演示视频:https://www.bilibili.com/video/BV1BX4y1772v

五、获取完整源码

附完整python源码:【2023知乎爬虫】知友怎么看待《罗刹海市》?爬了上千条知乎回答!


我是@马哥python说 ,一名10年程序猿,持续分享python干货中!

热门相关:总裁别再玩了   未来兽世:买来的媳妇,不生崽   异世修真邪君   本法官萌萌哒   后福