python爬取知乎专栏用户评论信息

工具:python3,pycharm,火狐浏览器
模块:json,requests,time

登录知乎,进入专栏。
python爬取知乎专栏用户评论信息_第1张图片

python爬取知乎专栏用户评论信息_第2张图片
进入后随便选择一个专栏,我们选择一个粉丝比较多的。点击进去。

python爬取知乎专栏用户评论信息_第3张图片
其实,我们可以爬取这个专栏的所有文章,打开开发者工具F12,点击刷新
python爬取知乎专栏用户评论信息_第4张图片
找到这条数据,点击响应可以看到json数据,仔细观察这些数据,我们就会发现正好是这个专栏里作者的所有文章。但我们今天并不获取。如果想获取的话,可以自己实现,方法简单,同获取评论信息原理一样。
python爬取知乎专栏用户评论信息_第5张图片
进入正题,获取一篇文章的评论,我们随意打开一篇评论比较多的文章。
python爬取知乎专栏用户评论信息_第6张图片
python爬取知乎专栏用户评论信息_第7张图片
可以看到许多评论信息,我们要抓取的就是评论者的id,昵称,以及评论内容。
在这个页面打开开发者工具,按F12,并进行刷新。找到这条数据。点击响应查看一下
python爬取知乎专栏用户评论信息_第8张图片
我们找到要获取的内容了!
python爬取知乎专栏用户评论信息_第9张图片

我们会发现一个问题,会发现这条数据的请求网址会很长,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这样写到代码会很不方便。我们一看便知?后面携带的是参数。我们点击参数会发现一些数据。
python爬取知乎专栏用户评论信息_第10张图片

我们可以在请求的时候携带这些数据。用paramsrequests.get(url,params=date,headers=headers)
这样请求的时候网址就可以写成:https://www.zhihu.com/api/v4/articles/19991701/comments

很显然这里有20条数据,并不是所有数据。我们点击评论的下一页。python爬取知乎专栏用户评论信息_第11张图片

发现第二页的数据,这样也能获取到第二页的评论信息 了。看一下参数有什么变化。
python爬取知乎专栏用户评论信息_第12张图片
发现offset变化了,这是因为每页有20条数据。
python爬取知乎专栏用户评论信息_第13张图片
我们点击评论的第三页,发现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()控制爬取速度。

代码写的有些简陋,主要说明思路

你可能感兴趣的:(python爬虫)