【爬虫】如何爬取某一知乎用户的所有回答?(一)

关于这个问题,我大致有三个思路,今天就先来分享第一种思路。


所要用到的第三方库

requests库1

实现思路

  1. 找到请求数据的链接。

    先随便打开一个人的知乎界面,这里我用的是我自己的知乎界面。然后打开F12,点击网络来获取传输的数据包。

【爬虫】如何爬取某一知乎用户的所有回答?(一)

由于现在的大部分网站都是采取异步加载,所以可以等页面加载完毕后再打开F12开始录制网络活动,然后通过点击使需要的数据加载,这时候获取的数据包就较少,很容易找到所需要的数据链接。
【爬虫】如何爬取某一知乎用户的所有回答?(一)

在查看它的响应后,发现它就是我们要找的链接。但是这个链接不能用requests请求到,需要用另一个第三方库selenium,但这不是我今天要讲的内容。

  1. 所以我们要换一种思路,既然不能直接通过回答页面的数据得到链接,我们可以通过知乎的动态页面尝试获得相关数据。【爬虫】如何爬取某一知乎用户的所有回答?(一)

    此时我们获得所需要的链接:https://www.zhihu.com/api/v3/moments/wu-suo-wei-68-48-93/activities?limit=7&session_id=1371935543945793536&after_id=1607954290&desktop=true,这个链接可以精简为:https://www.zhihu.com/api/v3/moments/wu-suo-wei-68-48-93/activities,其中的"wu-suo-wei-68-48-93"很明显是页面的url(https://www.zhihu.com/people/wu-suo-wei-68-48-93)中的参数,直接复制即可。这个链接返回的是json2数据,直接可以从中解析出我们所需要的数据。

  2. 现在我们就可以开始代码实现了。

代码实现

import requests
import time

def getZhihuerAnswers(userName, savePath):
    url = "https://www.zhihu.com/api/v3/moments/{0}/activities".format(peopleName)
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"
    }

    while True:
        res = requests.get(url=url,headers=headers)
        jsonObj = res.json()

        if jsonObj["data"] == []:	#如果列表为空,则证明已经爬取完成,结束循坏
            break
        else:
            activities = jsonObj["data"]
            for activity in activities:
                if activity["action_text"] == "回答了问题"	#判断是否为回答
                    pass
                else:
                    continue

        url = jsonObj["paging"]["next"]		#设置下一次爬取的url
        time.sleep(2)	#控制爬取速度,防止被反爬
    
    #保存方式,需要自己实现
    with open(savePath, "w+", encoding="utf-8") as f:
        f.write()


if __name__ == "__main__":
    getZhihuerAnswers()

注意:

  1. 此代码不能直接运行,获取的数据和保存数据的方式需要根据自己的需要补充完善。

拓展

  1. 可以采取多线程或多进程或协程的方式加快速度,但是速度过快会有被封的风险。
  2. 保存方式可以选择直接用txt文件或者用csv文件,也可以用数据库保存。
  3. 尽量在爬取完一部分数据后再保存,因为保存数据的IO操作会严重影响爬虫的速度。如果你要爬取所有数据后再保存,应该增加一部分异常处理的代码,防止因为反爬报错导致前功尽弃。

注释


  1. 官方文档:Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 (python-requests.org) ↩︎

  2. json的菜鸟教程:https://www.runoob.com/json/json-tutorial.html ↩︎

上一篇:论文阅读:Automated acquisition of structured, semantic models of manipulation activities from human VR d


下一篇:mybatis笔记<二> 整合spring