专栏首页用户6811391的专栏Python爬虫实战:抓取知乎问题下所有回答

Python爬虫实战:抓取知乎问题下所有回答

好久不见,工作有点忙...虽然每天都是在写爬虫,也解锁了很多爬虫实战新技能,但由于工作里是用 NodeJS,已经好久没动手写 Python 了。

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

最近写了个简单的知乎回答的爬虫,感兴趣的话一起来看看吧。

需求

抓取知乎问题下所有回答,包括其作者、作者粉丝数、回答内容、时间、回答的评论数、回答赞同数以及该回答的链接。

分析

以上图中问题为例,想要拿到回答的相关数据,一般我们可以在 Chrome 浏览器下按 F12 来分析请求;但借助Charles抓包工具可以更直观地获取相关字段:

注意我标注的 Query String 参数中 limit 5 表示每次请求返回 5 条回答,经测试最多可以改成 20;offset 表示从第几个回答开始;

而返回的结果是 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)看这个问题接口没有特别大限制,包括我在代码里的请求也没有带 cookie 直接来抓取的,而且通过修改 limit 参数到 20 来减少请求次数。

爬虫意义

最近也在想爬虫抓取知乎回答的意义在哪,起初是想汇总所有答案来分析下,但实际抓取完想一起阅读,发现在表格中读回答的阅读体验很差,不如直接去刷知乎;但比较明显的价值在于横向对比这几百个回答,回答的赞同、评论以及作者的粉丝情况都一目了然。此外,还可以根据结果做一些词频分析、词云图展示等,这些就是后话了。

爬虫只是获取数据的一种途径,如何解读才是数据的更大价值所在。

我是TED,一个天天写爬虫、但好久没写Python的数据工程师,后续会继续更新一系列自己琢磨的 Python 爬虫项目,欢迎持续关注~

本文分享自微信公众号 - TTTEED(TEDxPY),作者:TEDxPY

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-09-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在知乎上学 Python - 爬虫篇

    知乎是个好地方。虽然近年来,为了吸引更多的用户,知乎的定位与早期略有点偏离。但从内容质量和专业性来说,知乎仍然是国内数一数二的知识型社区。不少同学都是通过知乎发...

    Crossin先生
  • Python爬虫爬取知乎小结

    最近学习了一点网络爬虫,并实现了使用Python来爬取知乎的一些功能,这里做一个小的总结。网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本。我们知...

    小小科
  • Python爬虫爬取知乎小结

    最近学习了一点网络爬虫,并实现了使用Python来爬取知乎的一些功能,这里做一个小的总结。网络爬虫是指通过一定的规则自动的从网上抓取一些信息的程序或脚本。我们知...

    小小科
  • Python | Python爬虫爬取知乎小结

    http://blog.csdn.net/qq_37267015/article/details/62217899

    用户1634449
  • Python爬虫抓取知乎所有用户信息

    專 欄 ❈ 蜗牛仔,Python中文社区专栏作者,怒学Python爬虫,争当爬虫工程师, github地址: https://github.com/xiaob...

    Python中文社区
  • 一幅图讲清楚Python在大数据与人工智能时代的地位

    大数据与人工智能时代,掌握Python基础后,我们可以选择数据分析方向、人工智能方向、全栈开发方向... ? 如果想要追赶 Python 的热潮,应该如何学习呢...

    昱良
  • 一键下载:将知乎专栏导出成电子书

    老是有同学问,学了 Python 基础后不知道可以做点什么来提高。今天就再用个小例子,给大家讲讲,通过 Python 和爬虫,可以完成怎样的小工具。

    Crossin先生
  • Python爬虫 | 一条高效的学习路径

    数据是创造和决策的原材料,高质量的数据都价值不菲。而利用爬虫,我们可以获取大量的价值数据,经分析可以发挥巨大的价值,比如:

    conanma
  • 关于Python爬虫,这里有一条高效的学习路径

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第一 【Python】:排名第三 【算法】:排名第四 ? 如果你仔细观察,就不难发现,懂爬...

    昱良
  • 关于Python爬虫,这里有一条高效的学习路径

    如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编程语言提供越来越多的优秀工具,...

    Python进阶者
  • Python爬虫基础知识:爬虫框架Scrapy的安装说明

    云豆贴心提醒,本文阅读时间4分钟 之前的几篇爬虫基础知识系列内容,已经记录了一些简单的爬虫知识。这些只是处理一些简单问题自然不在话下,但是涉及到一些复杂的问题...

    小小科
  • Python爬虫学习路线

    1.刚上手的时候肯定是先过一遍Python最基本的知识,比如说:变量、数据结构、语法等,基础过的很快,基本上1~2周时间就能过完了,我当时是在这儿看的基础:Py...

    py3study
  • 如何在一个月内学会Python爬取大规模数据

    慕白
  • 知乎大神爬了这些网站的数据,发现价值巨大!

    一个网站背后的数据是一座巨大的宝库,对于如何爬取数据,如何利用好这些数据,很多人还是一头雾水。在知乎的提问“有哪些网站用爬虫爬取能得到很有价值的数据?”中,@何...

    钱塘数据
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的...

    Python中文社区
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的...

    机器学习AI算法工程
  • 不踩坑的Python爬虫:如何在一个月内学会爬取大规模数据

    Python爬虫为什么受欢迎 如果你仔细观察,就不难发现,懂爬虫、学习爬虫的人越来越多,一方面,互联网可以获取的数据越来越多,另一方面,像 Python这样的编...

    昱良
  • 300万知乎用户数据如何大规模爬取?如何做数据分析?

    很早就有采集知乎用户数据的想法,要实现这个想法,需要写一个网络爬虫(Web Spider)。因为在学习 python,正好 python 写爬虫也是极好的选择,...

    机器学习AI算法工程
  • Python爬虫的法律边界(二)小爬怡情,大爬over!

    数据抓取的门槛越来越低,会点程序,或使用网络工具都可以薅点数据,新入行了不少爬虫选手,但是对抓取使用数据的法律风险可能缺少认识。尤其是从去年的《网络安全法》实施...

    一墨编程学习

扫码关注云+社区

领取腾讯云代金券