知乎爬虫与数据分析(一)数据爬取篇

您所在的位置:网站首页 沙滩排球绝版了吗知乎文章 知乎爬虫与数据分析(一)数据爬取篇

知乎爬虫与数据分析(一)数据爬取篇

2024-07-14 10:51| 来源: 网络整理| 查看: 265

注:代码完整版可移步Github——https://github.com/florakl/zhihu_spider。

知乎爬虫与数据分析(二)pandas+pyecharts数据可视化分析篇(上) 知乎爬虫与数据分析(三)pandas+pyecharts数据可视化分析篇(下)

目录 0 项目介绍1 数据爬取1.1 明确数据需求1.2 爬取代码

0 项目介绍

对自媒体而言,如果想要自己的观点获得更多人认同,除去创作内容本身的含金量外,创作时机、创作形式等因素也同样关键。以知乎为例,如果你有诸如: ①在问题提出后多久去发表回答更容易火起来? ②是不是高赞答主一般都自带粉丝?小透明还有戏吗? ③想知道高赞回答通常有多少字?分多少段?配多少张图?有哪些常用的高频词汇? 等等疑问,不妨花上几分钟看一看这篇文章。我将爬取知乎相关数据,简单分析高赞回答的共同特征与规律,来尝试回答上述问题。

项目流程比较简单:数据爬取——数据处理与可视化分析——总结。 本篇主要简述数据爬取,具体分析请看后两篇。

1 数据爬取 1.1 明确数据需求

基本数据来源:

爬取知乎根话题下的M个精华问题,以及问题下的N个回答

基本数据维度:

问题——标题、标签、提问内容、提问时间、关注数、回答数、评论数等回答——赞数、回答时间、内容、评论数、答主粉丝数等其他——爬取时间等

这是一般情况下会用到的数据维度,而针对最初提到的三个问题,实际对数据的需求有所区别。 ①随机选择数个热门问题,爬取该问题下所有回答的创建时间和赞数即可。 ②③则需要爬取多个精华问题下的部分高赞回答(比如前10个),并基于回答的赞数、评论数、粉丝数、回答内容等数据分析。

1.2 爬取代码

代码参考: 爬虫实战之分布式爬取知乎问答数据 Python网络爬虫实战:爬取知乎话题下 18934 条回答数据 知乎 API v4 整理 (1)先编写一个通用的url请求函数,将响应对象存储为json格式。这里使用headers伪装浏览器来爬数据。可能是我爬取的数据量不大,没有被封ip,所以未使用IP代理池。

def url_get(url): headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36", "Connection": "keep-alive", "Accept": "text/html,application/json,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8"} html = requests.get(url, headers=headers, timeout=20) code = html.status_code if code == 200: res = html.json() return res else: # print('Status Code:', code) return None

(2)针对问题①,分批爬取单个问题下的所有回答,存入txt文件。

def question_info_get(qid): q_url = f'https://www.zhihu.com/api/v4/questions/{qid}?include=answer_count' q_res = url_get(q_url) if q_res: total = q_res['answer_count'] # 回答数 title = q_res['title'] # 问题标题 created_time = q_res['created'] # 创建时间 return total, title, created_time def answer_time_get(qid, interval, offset, q_time): voteup = [] ans_time = [] ans_url = f'https://www.zhihu.com/api/v4/questions/{qid}/answers?include=content,comment_count,voteup_count&limit={interval}&offset={offset}&sort_by=default' ans_res = url_get(ans_url) answers = ans_res['data'] for answer in answers: voteup.append(answer['voteup_count']) ans_time.append(answer['created_time']) # ans_time.append(answer['created_time'] - q_time) return voteup, ans_time def data_get(qid, number): total, title, created_time = question_info_get(qid) interval = 20 offset = 0 voteup = [] ans_time = [] while offset 1000的问题。 在这里插入图片描述 (3)问题②③需要爬取的数据维度更广(虽然后续分析时并未全部用上)。和(2)不同的是这里没法手动输入大量的问题编号qid,需要直接从页面中获取。

def qid_get(interval, offset): # 知乎根话题下的精华问题 tid = 19776749 url = f'https://www.zhihu.com/api/v4/topics/{tid}/feeds/essence?limit={interval}&offset={offset}' res = url_get(url) qids = [] if res: for question in res['data']: try: qid = question['target']['question']['id'] qids.append(qid) except KeyError: print('qid无法读取,跳过该问题') return qids

有了qid就能继续爬数据了,从问题到回答再到答主信息。爬取中会出现一些特殊情况,比如进入用户信息页面采集答主粉丝数信息时,需要考虑已注销、匿名用户、账号停用等特例。

def question_info_get(qid): # 爬取问题相关信息 q_url = f'https://www.zhihu.com/api/v4/questions/{qid}?include=answer_count,comment_count,follower_count,excerpt,topics' q_res = url_get(q_url) if q_res: answer_count = q_res['answer_count'] if answer_count


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3