网页视频抓取工具 知乎(代码是最近(2021.09)新写的~需求任务需求分析)
优采云 发布时间: 2021-11-05 23:23网页视频抓取工具 知乎(代码是最近(2021.09)新写的~需求任务需求分析)
最近新写的代码(2021.09)~
需要
任务要求:抓取问题知乎下的所有答案,包括作者、作者粉丝数、回答内容、时间、回复评论数、回答数和回答链接.
分析
以最近关注的“大公司间链接畅通问题”为例。如果想获取答案的相关数据,可以在Chrome浏览器下按F12对请求进行分析;但是在Charles抓包工具的帮助下,你可以改变它。直观获取相关字段:
注意我标记的Query String参数中的limit 5表示每个请求会返回5个回答,测试后最多可以改成20个;偏移是指从答案的数量开始;
返回结果为 Json 格式。每个答案都收录足够的信息。我们只需要过滤并保存我们想要捕获的字段记录。
需要说明的是,content字段返回的内容为答案内容,但其格式是带有网页标签的。搜索之后,我选择了HTMLParser来解析,这样就不用手动处理了。
代码
import requests,json
import datetime
import pandas as pd
from selectolax.parser import HTMLParser
url = 'https://www.zhihu.com/api/v4/questions/486212129/answers'
headers = {
'Host':'www.zhihu.com',
'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.114 Safari/537.36',
'referer':'https://www.zhihu.com/question/486212129'
}
df = pd.DataFrame(columns=('author','fans_count','content','created_time','updated_time','comment_count','voteup_count','url'))
def crawler(start):
print(start)
global df
data= {
'include':'data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,attachment,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,is_labeled,paid_info,paid_info_content,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_recognized;data[*].mark_infos[*].url;data[*].author.follower_count,vip_info,badge[*].topics;data[*].settings.table_of_content.enabled',
'offset':start,
'limit':20,
'sort_by':'default',
'platform':'desktop'
}
#将携带的参数传给params
r = requests.get(url, params=data,headers=headers)
res = json.loads(r.text)
if res['data']:
for answer in res['data']:
author = answer['author']['name']
fans = answer['author']['follower_count']
content = HTMLParser(answer['content']).text()
#content = answer['content']
created_time = datetime.datetime.fromtimestamp(answer['created_time'])
updated_time = datetime.datetime.fromtimestamp(answer['updated_time'])
comment = answer['comment_count']
voteup = answer['voteup_count']
link = answer['url']
row = {
'author':[author],
'fans_count':[fans],
'content':[content],
'created_time':[created_time],
'updated_time':[updated_time],
'comment_count':[comment],
'voteup_count':[voteup],
'url':[link]
}
df = df.append(pd.DataFrame(row),ignore_index=True)
if len(res['data'])==20:
crawler(start+20)
else:
print(res)
crawler(0)
df.to_csv(f'result_{datetime.datetime.now().strftime("%Y-%m-%d")}.csv',index=False)
print("done~")
结果
得到的结果大致如下:
你可以看到有些答案是空的。转到问题并检查它是否是视频答案。没有文字内容。这被忽略了。当然,您可以删除视频链接并将其添加到结果中。
防攀登限制
目前(2021.09)看这个问题,接口没有特别限制,包括我在代码中的请求没有cookies直接捕获,通过修改limit参数为20来减少请求频率。
爬虫意义
最近也在想爬知乎答案的意义在哪里。一开始我想把所有的答案汇总起来分析,但是我真正抓住了之后,就想一起阅读了。我发现阅读表格中的答案的阅读体验很差。直接去知乎;但更明显的价值在于这数百个答案的横向比较。赞、评论、作者粉丝一目了然。另外,你还可以根据结果做一些词频分析、词云图展示等,这些都是接下来要做的事情。
爬虫只是获取数据的一种方式,如何解读是数据更大的价值。
我是TED,每天写爬虫的数据工程师,但好久没写Python了。以后想到的一系列Python爬虫项目会继续更新。欢迎继续关注~