【爬虫】如何爬取某一知乎用户的所有回答?(一)
作者:互联网
关于这个问题,我大致有三个思路,今天就先来分享第一种思路。
所要用到的第三方库
requests库1
实现思路
-
找到请求数据的链接。
先随便打开一个人的知乎界面,这里我用的是我自己的知乎界面。然后打开F12,点击网络来获取传输的数据包。
由于现在的大部分网站都是采取异步加载,所以可以等页面加载完毕后再打开F12开始录制网络活动,然后通过点击使需要的数据加载,这时候获取的数据包就较少,很容易找到所需要的数据链接。
在查看它的响应后,发现它就是我们要找的链接。但是这个链接不能用requests请求到,需要用另一个第三方库selenium,但这不是我今天要讲的内容。
-
所以我们要换一种思路,既然不能直接通过回答页面的数据得到链接,我们可以通过知乎的动态页面尝试获得相关数据。
此时我们获得所需要的链接: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数据,直接可以从中解析出我们所需要的数据。
-
现在我们就可以开始代码实现了。
代码实现
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()
注意:
- 此代码不能直接运行,获取的数据和保存数据的方式需要根据自己的需要补充完善。
拓展
- 可以采取多线程或多进程或协程的方式加快速度,但是速度过快会有被封的风险。
- 保存方式可以选择直接用txt文件或者用csv文件,也可以用数据库保存。
- 尽量在爬取完一部分数据后再保存,因为保存数据的IO操作会严重影响爬虫的速度。如果你要爬取所有数据后再保存,应该增加一部分异常处理的代码,防止因为反爬报错导致前功尽弃。
注释
官方文档:Requests: 让 HTTP 服务人类 — Requests 2.18.1 文档 (python-requests.org) ↩︎
json的菜鸟教程:https://www.runoob.com/json/json-tutorial.html ↩︎
标签:activities,一知乎,https,url,爬虫,爬取,www,com,链接 来源: https://blog.csdn.net/weixin_45734205/article/details/118495036