【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日

相关文章

  • 【GUI开发】用python爬YouTube博主信息,并开发成exe软件!

    目录 一、背景介绍 二、代码讲解 2.1 爬虫 2.2 tkinter界面 2.3 存日志 三、说明 一、背景介绍 你好,我是@马哥python说,一名10年程序猿。 最近我用python开发了一个GUI桌面软件,目的是爬取相关YouTube博主的各种信息,字段包括: 视频标题、视频链接、博主名称、博主链接、国家、telegram链接、whatsapp链接、…

    2023年4月2日
    00
  • pyecharts世界地图用:国家中英文对照表.xlsx

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

    Python开发 2023年4月2日
    00
  • 【爬虫+情感判定+Top10高频词+词云图】”乌克兰”油管热评python舆情分析

    目录 一、分析背景 二、整体思路 三、代码讲解 3.1 爬虫采集 3.2 情感判定 3.3 Top10高频词 3.4 词云图 四、得出结论 五、同步视频演示 六、附完整源码 一、分析背景 乌克兰局势这两天日益紧张,任何战争到最后伤害的都是无辜平民,所以没有真正的赢家!祈祷战争早日结束,世界和平!油管上讨论乌克兰局势的评论声音不断,采用python的文本情感分…

    2023年4月2日
    00
  • 【11个适合毕设的Python可视化大屏】用pyecharts开发拖拽式可视化数据大屏

    你好,我是@马哥python说,一枚10年程序猿。 一、效果演示 以下是我近期用Python开发的原创可视化数据分析大屏,非常适合毕设用,下面逐一展示:(以下是截图,实际上有动态交互效果哦) 以下大屏均为@马哥python说的个人原创,请勿转载。 1.1 影视剧分析大屏 1.2 豆瓣电影分析大屏A 1.3 豆瓣电影分析大屏B 1.4 58同城房源分析大屏 1…

    python 2023年5月10日
    00
  • 【NLP教程】用python调用百度AI开放平台进行情感倾向分析

    目录 一、背景 二、操作步骤 2.1 创建应用 2.2 获取token 2.3 情感倾向分析 三、其他情感分析 四、讲解视频 一、背景 Hi,大家!我是 @马哥python说 ,一名10年程序猿。 今天我来演示一下:通过百度AI开放平台,利用python调用百度接口进行中文情感倾向分析,并得出情感极性分为积极、消极还是中性以及置信度结果。 二、操作步骤 首先…

    python 2023年4月25日
    00
  • 【可视化大屏教程】用Python开发智慧城市数据分析大屏!

    目录 一、开发背景 二、讲解代码 2.1 大标题+背景图 2.2 各区县交通事故统计图-系列柱形图 2.3 图书馆建设率-水球图 2.4 当年城市空气质量aqi指数-面积图 2.5 近7年人均生产总值变化图-面积图 2.6 城市人才占比结构图-柱形图 2.7 城市宣传片视频-大屏左上角位置 2.8 组合以上图表,生成临时大屏 2.9 生成最终大屏 2.10 …

    2023年4月2日
    00
  • 【拖拽可视化大屏】全流程讲解用python的pyecharts库实现拖拽可视化大屏的背后原理,简单粗暴!

    目录 一、设计方案 二、项目背景 三、电影爬虫 3.1 导入库 3.2 发送请求 3.3 解析页面 3.4 存储到csv 3.5 讲解视频 四、数据持久化存储 4.1 导入库 4.2 存入MySQL 4.3 讲解视频 五、开发可视化大屏 5.1 柱形图 5.2 饼图 5.3 词云图 5.4 数据表格 5.5 涟漪散点图 5.6 条形图 5.7 大标题 5.8…

    2023年4月2日
    00
  • 【Python爬虫案例】用python爬1000条哔哩哔哩搜索结果

    目录 一、爬取目标 二、讲解代码 三、同步讲解视频 四、完整源码 一、爬取目标 大家好,我是 @马哥python说 ,一名10年程序猿。 今天分享一期爬虫的案例,用python爬哔哩哔哩的搜索结果,也就是这个页面: 爬取字段,包含:页码, 视频标题, 视频作者, 视频编号, 创建时间, 视频时长, 弹幕数, 点赞数, 播放数, 收藏数, 分区类型, 标签, …

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