网页视频抓取工具 知乎(需求抓取知乎问题下所有回答的爬虫意义在哪?)

优采云 发布时间: 2021-12-26 15:09

  网页视频抓取工具 知乎(需求抓取知乎问题下所有回答的爬虫意义在哪?)

  好久不见,工作有点忙……虽然每天都在写爬虫,也解锁了很多爬虫的新技能,但是因为工作中用到NodeJS,所以好久没有写Python了。

  对于解决需求问题,无论是Python还是NodeJS,只是语法和模块不同,分析思路和解决方案基本一致。

  我最近写了一个简单的爬虫,知道答案。如果你有兴趣,我们一起来看看。

  需要

  爬取知乎问题下的所有回答,包括作者、作者粉丝数、回答内容、时间、回复评论数、回答批准数、回答链接.

  分析

  以上图中的问题为例。如果我们想要得到答案的相关数据,一般可以在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爬虫项目我会继续更新。欢迎继续关注~

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线