原理:動態網頁,即用js代碼實現動態加載數據,就是可以根據用戶的行為,自動訪問服務器請求數據,重點就是:請求數據,那么怎么用python獲取這個數據了?
瀏覽器請求數據方式:瀏覽器向服務器的api(例如這樣的字符串:http://api.qingyunke.com/api.php?key=free&appid=0&msg=關鍵詞)發送請求,服務器返回json,然后解析該json,就得到請求數據了
同理:用Python向api發送請求,獲得json,解析json,得到數據
即關鍵在於得到api
api獲取:
1.用瀏覽器打開目標網頁eg:https://www.zhihu.com/topic/19561718/top-answers

將鼠標放在上圖圖示位置,將顯示該用戶的一些信息,這些信息就是動態加載出來的。當鼠標放在該位置時,瀏覽器向服務器api發出請求,得到json,再解析便得到下圖所示數據

在該網頁反鍵選擇檢查源代碼,按圖示點開選項:

然后將鼠標移動到網頁界面用戶上(箭頭位置),會發現右邊多出兩個請求信息,如圖:

點擊下面一個,紅色方框內的鏈接,就是要找的api接口

直接用瀏覽器打開該api即可看到json,如下圖

下面用python代碼請求該api並解析
import requests
import json
#api
url='https://www.zhihu.com/api/v4/members/wisphilo?include=allow_message%2Cis_followed%2Cis_following%2Cis_org%2Cis_blocking%2Cemployments%2Canswer_count%2Cfollower_count%2Carticles_count%2Cgender%2Cbadge%5B%3F(type%3Dbest_answerer)%5D.topics'
#header的目的是模擬請求,因為該api設置了反爬取
header={
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
}
doc=requests.get(url,headers=header)#發起請求
doc.encoding='utf-8'#設置編碼為utf-8
data=json.loads(doc.text)#將json字符串轉為json
#根據位置查找數據
print('用戶名:',data.get('name'))
print('個人描述:',data.get('headline'))
print('職務:'+data.get('employments')[0].get('job').get('name'))
print('回答:',data.get('answer_count'))
print('文章:',data.get('articles_count'))
print('關注者:',data.get('follower_count'))
另外查找數據最好用在線json格式化再查找,不然很難看出自己要的數據在哪eg:

一般網頁的api都有規律可尋,用for循環控制變換字符即可實現自動爬取
上述代碼運行結果:

和該界面對照

以上
