工具:python3,pycharm,火狐浏览器
模块:json,requests,time
登录知乎,进入专栏。
进入后随便选择一个专栏,我们选择一个粉丝比较多的。点击进去。
其实,我们可以爬取这个专栏的所有文章,打开开发者工具F12,点击刷新
找到这条数据,点击响应可以看到json数据,仔细观察这些数据,我们就会发现正好是这个专栏里作者的所有文章。但我们今天并不获取。如果想获取的话,可以自己实现,方法简单,同获取评论信息原理一样。
进入正题,获取一篇文章的评论,我们随意打开一篇评论比较多的文章。
可以看到许多评论信息,我们要抓取的就是评论者的id,昵称,以及评论内容。
在这个页面打开开发者工具,按F12,并进行刷新。找到这条数据。点击响应查看一下
我们找到要获取的内容了!
我们会发现一个问题,会发现这条数据的请求网址会很长,https://www.zhihu.com/api/v4/articles/19991701/comments?include=data[*].author,collapsed,reply_to_author,disliked,content,voting,vote_count,is_parent_author,is_author,algorithm_right&order=normal&limit=20&offset=0&status=open
这样写到代码会很不方便。我们一看便知?后面携带的是参数。我们点击参数会发现一些数据。
我们可以在请求的时候携带这些数据。用paramsrequests.get(url,params=date,headers=headers)
这样请求的时候网址就可以写成:https://www.zhihu.com/api/v4/articles/19991701/comments
很显然这里有20条数据,并不是所有数据。我们点击评论的下一页。
发现第二页的数据,这样也能获取到第二页的评论信息 了。看一下参数有什么变化。
发现offset变化了,这是因为每页有20条数据。
我们点击评论的第三页,发现offset变成40了。这样就好办多了。
完整代码:
import requests
import json
import time
def content(a):
url="https://www.zhihu.com/api/v4/articles/19991701/comments"
date={
'include':'data[*].author,collapsed,reply_to_author,disliked,content,voting,vote_count,is_parent_author,is_author,algorithm_right',
'limit':'20',
'offset':str(a),
'order':'normal',
'status':'open'
}
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:57.0) Gecko/20100101 Firefox/57.0'}
html=requests.get(url,params=date,headers=headers)
#print(html.json()['data'])
for i in html.json()['data']:
content=i['content']
id=i['author']['member']['id']
name=i['author']['member']['name']
print(name+str(id)+":"+content)
#数据写入文档的过程中可能出现UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position XXX: illegal multibyte sequence
#使用try,except忽略,并不影响数据的写入。
with open("pinglun.txt",'a')as f:
try:
f.write(name+str(id)+":"+content)
except:
print("")
if __name__ == '__main__':
for i in range(0,4):
content(i*20)
time.sleep(5)
data用于拼接url,headers用于模拟浏览器,获取到的json数据可以直接取到。将获取的数据采用追加“a”的方式写入到txt中。
数据写入文档的过程中可能出现UnicodeEncodeError: ‘gbk’ codec can’t encode character ‘\uXXX’ in position XXX: illegal multibyte sequence,使用try,except忽略,并不影响数据的写入。
time.sleep()控制爬取速度。
代码写的有些简陋,主要说明思路
来源:CSDN
作者:乐亦亦乐
链接:https://blog.csdn.net/qq_41251963/article/details/82873326