目的:爬取知乎鹅髓,蟲(chóng)師主頁(yè)的粉絲信息
1、尋找真實(shí)請(qǐng)求
以蟲(chóng)師的關(guān)注者練習(xí)(注意:需要先登錄)
使用谷歌瀏覽器開(kāi)發(fā)者工具尋找包含關(guān)注人信息的真實(shí)請(qǐng)求京景,以“followers”開(kāi)頭的請(qǐng)求窿冯,返回的是一個(gè)JSON格式的數(shù)據(jù),該數(shù)據(jù)對(duì)應(yīng)“關(guān)注他的人”:
雙擊這個(gè)請(qǐng)求确徙,返回一個(gè)JSON格式的數(shù)據(jù)醒串,可以通過(guò)安裝JSONView插件在瀏覽器中更好地顯示該數(shù)據(jù)
2、代碼爬取
# -*- coding: utf-8 -*-
# __author__ = 'Carina'
import requests
import pandas as pd
import time
# 添加請(qǐng)求頭
headers = {
"authorization": "填上你的authorization",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.162 Safari/537.36",
}
user_data = []
def get_user_data(page): # 實(shí)現(xiàn)翻頁(yè)爬取功能
for i in range(page):
url = "https://www.zhihu.com/api/v4/members/hu-hu-66-21/followers?include=data%5B*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics&offset={}&limit=20".format(i*20)
r = requests.get(url, headers=headers).json()['data'] # 關(guān)注他的人都保存在data下面
user_data.extend(r)
print("正在爬取第%s頁(yè)" % str(i+1))
time.sleep(3) # 爬取時(shí)間間隔
if __name__ == "__main__":
get_user_data(10)
df = pd.DataFrame.from_dict(user_data)
df.to_excel('users.xlsx', "users")
途中遇到的問(wèn)題:
1鄙皇、返回“500 Server Error”芜赌,是由于網(wǎng)站反爬蟲(chóng)的原因
知乎的反爬蟲(chóng)機(jī)制是通過(guò)核對(duì)請(qǐng)求頭信息實(shí)現(xiàn)的
解決辦法:添加hearders請(qǐng)求頭信息解決,根據(jù)Request Headers的選項(xiàng)添加伴逸,對(duì)比知乎的請(qǐng)求頭信息和常見(jiàn)的請(qǐng)求頭信息缠沈,嘗試后發(fā)現(xiàn)authorization和User-Agent是必須要的
請(qǐng)求頭信息承載了關(guān)于客戶端瀏覽器、請(qǐng)求頁(yè)面、服務(wù)器等相關(guān)的信息洲愤,用來(lái)告知服務(wù)器發(fā)起請(qǐng)求的客戶端的具體信息
補(bǔ)充知識(shí)
Pandas庫(kù)的DataFrame的 from_dict() 可以很方便地把爬取到的數(shù)據(jù)保存為DataFrame格式的結(jié)構(gòu)化數(shù)據(jù)
HTTP Hearders:閱讀HTTP響應(yīng)頭和請(qǐng)求頭信息對(duì)照表颓芭,了解請(qǐng)求頭和響應(yīng)頭的概念以及每個(gè)Header所代表的具體含義
更多關(guān)于requests headers的用法,可以查閱requests的官方文檔
JSON:javascript object notation的簡(jiǎn)寫(xiě)柬赐,是一個(gè)輕量級(jí)的數(shù)據(jù)交換格式亡问,易于閱讀和編寫(xiě),是目前前后端最常用的數(shù)據(jù)交互格式之一
連接API進(jìn)行數(shù)據(jù)爬取的時(shí)候肛宋,數(shù)據(jù)的一般返回格式為JSONJSONView插件:使JSON格式的數(shù)據(jù)在谷歌瀏覽器中更好地呈現(xiàn)