【2023知乎爬虫】我用Python爬虫爬了2386条知乎评论!

您好,我是 @马哥python说,一枚10年程序猿。

一、爬取目标

前些天我分享过一篇微博的爬虫:
https://www.cnblogs.com/mashukui/p/16414027.html
但是知乎平台和微博平台的不同之处在于,微博平台的数据用于分析社会舆论热点事件是极好的,毕竟是个偏娱乐化的社交平台。但知乎平台的评论更加客观、讨论内容更加有深度,更加有专业性,基于此想法,我开发出了这个知乎评论的爬虫。

二、展示爬取结果

我在知乎上搜索了5个关于”考研“的知乎回答,爬取了回答下方的评论数据,共计2300+条数据。

https://www.zhihu.com/question/291278869/answer/930193847
https://www.zhihu.com/question/291278869/answer/802226501
https://www.zhihu.com/question/291278869/answer/857896805
https://www.zhihu.com/question/291278869/answer/910489150
https://www.zhihu.com/question/291278869/answer/935352960

爬取字段,含:
回答url、页码、评论作者、作者性别、作者主页、作者头像、评论时间、评论内容、评论级别。

部分数据截图:
爬取结果

三、爬虫代码讲解

3.1 分析知乎页面

任意打开一个知乎回答,点开评论界面:
【2023知乎爬虫】我用Python爬虫爬了2386条知乎评论!

同时打开chrome浏览器的开发者模式,评论往下翻页,就会找到目标链接:
【2023知乎爬虫】我用Python爬虫爬了2386条知乎评论!
作为爬虫开发者,看到这种0-19的json数据,一定要敏感,这大概率就是评论数据了。猜测一下,每页有20条评论,逐级打开json数据:
【2023知乎爬虫】我用Python爬虫爬了2386条知乎评论!
基于此数据结构,开发爬虫代码。

3.2 爬虫代码

首先,导入用到的库:

import requests
import time
import pandas as pd
import os

从上面的截图可以看到,评论时间created_time是个10位时间戳,因此,定义一个转换时间的函数:

def trans_date(v_timestamp):
	"""10位时间戳转换为时间字符串"""
	timeArray = time.localtime(v_timestamp)
	otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
	return otherStyleTime

作者的性别gender是0、1,所以也定义一个转换函数:

def tran_gender(gender_tag):
	"""转换性别"""
	if gender_tag == 1:
		return '男'
	elif gender_tag == 0:
		return '女'
	else:  # -1
		return '未知'

准备工作做好了,下面开始写爬虫。
请求地址url,从哪里得到呢?
打开Headers,找到Request URL,直接复制下来,然后替换:
【2023知乎爬虫】我用Python爬虫爬了2386条知乎评论!
先提取出一共多少评论,用于计算后面的翻页次数:

url0 = 'https://www.zhihu.com/api/v4/answers/{}/root_comments?order=normal&limit=20&offset=0&status=open'.format(answer_id)
r0 = requests.get(url0, headers=headers)  # 发送请求
total = r0.json()['common_counts']  # 一共多少条评论
print('一共{}条评论'.format(total))

计算翻页次数,直接用评论总数除以20就好了:

# 判断一共多少页(每页20条评论)
max_page = int(total / 20)
print('max_page:', max_page)

下面,再次发送请求,获取评论数据:

url = 'https://www.zhihu.com/api/v4/answers/{}/root_comments?order=normal&limit=20&offset={}&status=open'.format(answer_id,str(offset))
r = requests.get(url, headers=headers)
print('正在爬取第{}页'.format(i + 1))
j_data = r.json()
comments = j_data['data']

现在,所有数据都在comments里面了,开始for循环遍历处理:
字段过多,这里以评论作者、评论性别为例,其他字段同理:

for c in comments:  # 一级评论
	# 评论作者
	author = c['author']['member']['name']
	authors.append(author)
	print('作者:', author)
	# 作者性别
	gender_tag = c['author']['member']['gender']
	genders.append(tran_gender(gender_tag))

其他字段不再赘述。
需要注意的是,知乎评论分为一级评论和二级评论(二级评论就是一级评论的回复评论),所以,为了同时爬取到二级评论,开发以下逻辑:(同样以评论作者、评论性别为例,其他字段同理)

if c['child_comments']:  # 如果二级评论存在
	for child in c['child_comments']:  # 二级评论
		# 评论作者
		print('子评论作者:', child['author']['member']['name'])
		authors.append(child['author']['member']['name'])
		# 作者性别
		genders.append(tran_gender(child['author']['member']['gender']))

待所有字段处理好之后,把所有字段的列表数据拼装到DataFrame,to_csv保存到csv文件里,完毕!

df = pd.DataFrame(
	{
		'回答url': answer_urls,
		'页码': [i + 1] * len(answer_urls),
		'评论作者': authors,
		'作者性别': genders,
		'作者主页': author_homepages,
		'作者头像': author_pics,
		'评论时间': create_times,
		'评论内容': contents,
		'评论级别': child_tag,
	}
)
# 保存到csv文件
df.to_csv(v_result_file, mode='a+', index=False, header=header, encoding='utf_8_sig')

完整代码中还涉及到避免数据重复、字段值拼接、判断翻页终止等细节逻辑,详细了解请见文末。

四、同步视频

演示视频:
https://www.zhihu.com/zvideo/1545723927430979584


五、完整源码

附:此处点击完整源码


更多爬虫源码: 点击前往

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:【2023知乎爬虫】我用Python爬虫爬了2386条知乎评论! - Python技术站

(0)
上一篇 2023年4月2日 下午5:08
下一篇 2023年4月2日

相关文章

  • pyecharts世界地图用:国家中英文对照表.xlsx

    用pyecharts画Map或者Geo,需要用到的国家中英文对照表: 英文 中文 Zimbabwe 津巴布韦 Zambia 赞比亚 Yugoslavia 南斯拉夫 Yemen 也门 Western Sahara 西撒哈拉 Wallis and Futuna 瓦利斯群岛和富图纳群岛 W. Sahara 西撒哈拉 Vietnam 越南 Venezuela 委内瑞…

    Python开发 2023年4月2日
    00
  • 【Python爬虫技巧】快速格式化请求头Request Headers

    你好,我是 @马哥python说 。我们在写爬虫时,经常遇到这种问题,从目标网站把请求头复制下来,粘贴到爬虫代码里,需要一点一点修改格式,因为复制的是字符串string格式,请求头需要用字典dict格式:下面介绍一种简单的方法。首先,把复制到的请求头放到一个字符串里: # 请求头 headers = “”” Accept: text/html,applica…

    2023年4月2日
    00
  • 【保姆级Python入门教程】马哥手把手带你安装Python、安装Pycharm、环境配置教程

    您好,我是 @马哥python说 ,一枚10年程序猿。 我的社群中小白越来越多,咨询讨论的问题很多集中在python安装上,故输出此文,希望对大家起步有帮助。 下面开始,先安装Python,再安装pycharm,咱一步一步来。 一、安装Python解释器 1、打开python官网下载地址:https://www.python.org/downloads/ 「…

    Python开发 2023年4月2日
    00
  • 【GUI开发案例】用python爬百度搜索结果,并开发成exe桌面软件!

    目录 一、背景介绍 1.1 老版本 1.2 爬取目标 1.3 软件运行截图 1.4 爬取数据 1.5 实现思路 二、代码讲解 2.1 爬虫 2.2 软件界面 2.3 日志模块 三、软件运行演示 四、完整源码 一、背景介绍 你好,我是 @马哥python说 ,一名10年程序猿。 1.1 老版本 之前我开发过一个百度搜索的python爬虫代码,具体如下:【pyt…

    2023年4月2日
    00
  • 【股票爬虫教程】我用100行Python代码,爬了雪球网5000只股票,还发现一个网站bug!

    目录 一、爬取目标 二、分析网页 三、爬虫代码 四、同步视频 五、get完整源码 一、爬取目标 您好,我是@马哥python说,今天继续分享爬虫案例。 爬取网站:雪球网的沪深股市行情数据具体菜单:雪球网 > 行情中心 > 沪深股市 > 沪深一览 爬取字段,含:股票代码,股票名称,当前价,涨跌额,涨跌幅,年初至今,成交量,成交额,换手率,市盈…

    2023年4月2日
    00
  • 【爬虫+情感判定+Top10高频词+词云图】“刘畊宏“热门弹幕python舆情分析

    目录 一、背景介绍 二、代码讲解-爬虫部分 2.1 分析弹幕接口 2.2 讲解爬虫代码 三、代码讲解-情感分析部分 3.1 整体思路 3.2 情感分析打标 3.3 统计top10高频词 3.4 绘制词云图 3.5 情感分析结论 四、同步演示视频 五、附完整源码 一、背景介绍 最近一段时间,刘畊宏真是火出了天际,引起一股全民健身的热潮,毕竟锻炼身体,是个好事!…

    2023年4月2日
    00
  • 【爬虫+情感判定+Top10高频词+词云图】“谷爱凌”热门弹幕python舆情分析

    目录 一、背景介绍 二、代码讲解-爬虫部分 2.1 分析弹幕接口 2.2 讲解爬虫代码 三、代码讲解-情感分析部分 3.1 整体思路 3.2 情感分析打标 3.3 统计top10高频词 3.4 绘制词云图 3.5 情感分析结论 四、同步讲解视频 五、附完整源码 一、背景介绍 最近几天,谷爱凌在冬奥会赛场上夺得一枚宝贵的金牌,为中国队贡献了自己的荣誉! 针对此…

    2023年4月2日
    00
  • 【python爬虫案例】爬取微博任意搜索关键词的结果,以“唐山打人”为例

    目录 一、爬取目标 二、展示爬取结果 三、讲解代码 四、同步视频 4.1 演示视频 4.2 讲解视频 五、附:完整源码 一、爬取目标 大家好,我是马哥。 今天分享一期python爬虫案例,爬取目标是新浪微博的微博数据,包含: 页码, 微博id, 微博bid, 微博作者, 发布时间, 微博内容, 转发数, 评论数, 点赞数 经过分析调研,发现微博有3种访问方式…

    Python开发 2023年4月2日
    00
合作推广
合作推广
分享本页
返回顶部