爬虫进阶(三)
總第69篇
01|背景介紹:
我們前面的幾篇推文都是針對網頁版的內容進行抓取,但是有的時候當我們想要的數據沒有網頁版只有APP端時,這個時候該怎么辦呢?是人工去摘抄我們想要的數據嗎?我們肯定不想這么做,我們想想怎樣網頁版和APP版有什么不同,是什么原因導致我們不能夠按以往的方式來正常抓取數據。
要想找到原因,我們需要重溫一下網頁版爬蟲的基本流程,查看一下APP版的爬蟲是卡在哪里了,通過對比發現,網頁版爬蟲的第一步就是獲取目標URL,但是APP版就卡在第一步,我們沒法獲取APP版的URL。
那么我們只要解決了APP版URL的這個問題就可以解決APP版爬取數據的問題了。
接下來尋找能夠獲取APP版URL的工具,看看有沒有前人已經造好這樣的輪子,在搜索的過程中發現真有這樣神奇的工具,那就是Fiddler這個輪子。
02|Fiddler是什么:
(Fiddler官網圖片)
漢譯及百度:Fiddler是一個http協議調試代理工具,它能夠記錄并檢查所有你的電腦和互聯網之間的http通訊(通俗一點就是它可以記錄你所有訪問的網站情況),設置斷點,查看所有的“進出”Fiddler的數據包擴:cookie,html,js,css等文件。
03|Fiddler的下載與安裝:
這里也不重復造輪子了,也直接采用前人的造好的輪子。
天真無邪CSDN博客:http://blog.csdn.net/jiangwei0910410003/article/details/19806999
04|獲取目標URL:
把Fiddler安裝好以后,在手機上下載好目標APP,然后就可以開始操作了。這里我們以獲取收趣APP中熱門板塊為例。
當我們打開APP中的該頁面時,會出現好多api.shouqu.me,Fiddler會把一個頁面分成好多URL,我們的重點是找出我們真正需要的那個URL。
(眾多api.shouqu.me)
我的邏輯是先找出Content-Type為application對應的api.shouqu.me,然后依次點擊前幾個出現的內容。
(帶有Content-Type的api)
具體查看哪個URL是目標URL,可以通過下圖的界面(Fiddler右側界面)來獲取,該界面由request和response兩部分組成。
當選中左側界面的一個URL時,右側界面會出現下圖一這種顯示。點擊紅色框內的部分就會出現圖二的內容,通過將圖二中的內容和圖三中的內容進行對比發現,該URL就是我們想要的目標 URL。
(圖一)
(圖二)
(圖三)
05|請求URL:
獲得目標URL以后我們需要利用request來請求URL,在這里我們需要注意請求方式(post/get),同時也需要設置headers,這兩部分內容均可以在Fiddler客戶端的右側界面中的上半部分獲取。
找到這些以后開始編寫代碼了,代碼如下:
import requests headers={ ? ?"User-Agent":"okhttp/3.6.0", ? ?"Content-Type": "application/x-www-form-urlencoded", } url="http://api.shouqu.me/api_service/api/v1/daily/dailyMark" response=requests.post(url,headers=headers) response.text運行代碼以后出現下面的結果,并沒有出現預想的結果。
試了好幾次,上網查了很久發現是URL的問題,是因為目標url復制的有問題,詳細參考下面的博文:
Fiddler抓包——get請求:http://www.cnblogs.com/yoyoketang/p/6765199.html
Fiddler抓包——post請求:http://www.cnblogs.com/yoyoketang/p/6771696.html
經過上面的兩篇文章以后我們對URL進行了修改,具體如下:
import requests headers={ ? "token": "3591fabd529e94af851cc995083257b415c6b9054dc", ?"Content-Type": "application/x-www-form-urlencoded", ? "Content-Length": "173", ? ?"Host": "api.shouqu.me", ? "Connection": "Keep-Alive", ?"Accept-Encoding": "gzip", ? "User-Agent": "okhttp/3.6.0", } url="http://api.shouqu.me/api_service/api/v1/daily/dailyMark/s?osv=5.1&dem=Meizu&imei=868746026657881&userId=10127480&pageSize=20&mac=68%3A3e%3A34%3A26%3A24%3A01&apv=2.0.3.1&lastUpDate=1496455596&pageNo=1&pThemeid=0&os=android&model=MX5" response=requests.post(url,headers=headers) response.text運行代碼以后出現了ConnectionError,并沒有得到預想的結果。
又經過一段時間的上網查閱以后,發現是因為User-Agent的問題。在上面的代碼中我們可以看出User-Agent:”okhttp/3.6.0”,而實際中是“Mozilla/5.0 (Linux; Android 6.0.1; MI 4LTE Build/MMB29M; wv) AppleWebKit/537.36 (KHTML, like Gecko) ”這種的。我們需要把前面這種切換成后面這種。切換到后面這種形式以后就可以正常request了,具體轉化參考博文:
http://www.open-open.com/lib/view/open1480922472121.html
一般情況下,顯示的User-Agent都是正常的不需要進行轉化,特別APP(比如收趣)需要,下面列舉一個不需要進行轉化的,以知乎APP為例。
import requests headers={ ? "Authorization": "Bearer 2.0ABBM1DS23QgAUIJWoZwSCwwAAABgAlVN6C5HWQDE7mp84KUOjpcKU2mlsS8vSN75mg", ? ?"User-Agent": "Futureve/4.52.1 Mozilla/5.0 (Linux; Android 5.1; MX5 Build/LMY47I; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/44.0.2403.146 Mobile Safari/537.36 Google-HTTP-Java-Client/1.22.0 (gzip)", ? "Cookie": "acw_tc=AQAAAAzKO0a/WAYA07x4q1ddrDhjA2Ck; aliyungf_tc=AQAAAPDogxwrKAYA07x4qwvl2q8qsrho"} url="https://api.zhihu.com/topstory?action=pull&before_id=29&limit=10&action_feed=True&session_token=27f6e12ef281be55176934dcaf29bba0" response=requests.get(url,headers=headers) response.text通過上面的代碼對知乎APP進行數據獲取,我們可以得到下圖這樣的結果,很明顯這是得到正確的的響應。
接下來就是利用BS庫進行解析獲取里面的內容即可,與以往的爬蟲一致,由于版面過長就不進行贅述了。
你還可以看以下文章:
爬蟲進階(一)
爬蟲進階(二)
總結
- 上一篇: python——pkl文件(Python
- 下一篇: 我们还是毕业了