原理:動態網頁,即用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循環控制變換字符即可實現自動爬取
上述代碼運行結果:
和該界面對照
以上