1. 程式人生 > >python爬取知乎專欄使用者評論資訊

python爬取知乎專欄使用者評論資訊

工具: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()控制爬取速度。

程式碼寫的有些簡陋,主要說明思路