先說明,本文是水文,跟Python也不要緊的,寫着Python,是由於jb用py寫爬蟲比較多;jquery
本文只是簡單介紹個網站如何爬蟲的思路,文章很短,1分鐘看完,沒啥特別的,完~ajax
爲何要說這事,是由於今早在某羣看到有同窗問,訪問接口沒有數據,是啥問題; 瀏覽器
第一反應就是,請求參數不對,但接着該同窗說,參數都同樣的,仍是沒數據; bash
恰好看到了,就試試吧,打開首頁,是個表情包的網站,夠騷的~ 服務器
常規操做,Chrome F12-network,選擇XHR,如今通常網站都是ajax加載圖片的,因此直接選擇xhr了,刷新網頁,這不就有數據了嗎? 函數
逐個點擊看返回的內容,不難找到圖片地址; post
這樣,接口地址也出來了:測試
http://www.phizhub.com/phiz/get_phiz_list/?category=-1&page=1&last_time=0&page_size=40
複製代碼
後面的參數,不糾結,把這個地址放到Chrome上訪問,發現竟然是沒數據: 網站
行吧,多是由於請求時須要特定的參數,用postman模擬一波,按照上面看到的參數搞一波,發現仍是沒有數據: ui
一開始覺得參數不對或者有遺漏,檢查一遍發現仍是不行,那就說明,多是服務器有檢驗機制了;
先看了一下body,那4個參數都很正常,能夠排除了;
再看看請求頭,看到一個sss
參數跟timestamp
參數,其餘參數看着都正常;
首先,這個sss
可能性很大,由於這命名很奇怪,另外,校驗時間戳,也合理;
刷新幾回網站,發現這兩個參數都是會變化的,所以更加懷疑了;
每次刷新都能正常顯示,當時本身模擬的時候又不行,參數確定是沒錯的,這是否是說明,有時效性限制?
既然有這樣的懷疑,就測試一下吧,刷新網頁,把sss
跟timestamp
的值複製到postman模擬,通過幾回,偶然發現竟然能夠的;
一樣的參數,再post一次,發現就返回空數據了,就證明了時效性校驗的機制,並且這個時效性極短,5秒內!
下面講講這兩個參數的邏輯;
時間戳,通常是當前時間戳,拿去轉化看看,發現就是當前時間,無難度:
問題就在sss
這個玩意,這種狀況只能找源碼,那怎麼看?
首先,返回到這個頁面,此時,紅框裏的就是須要分析的接口;
那把鼠標移動到右側的jquery-1.8.3.min.js
文件,此時會彈出一堆js文件;
逐個找,點擊一個你以爲很大可能跟數據有關的文件,這裏不難看出,就是get_data
,那就點擊右側的js文件吧;
點擊後,直接跳轉到這裏,sss
對應的是代碼的abc
,而abc是get_abc函數生成的,並且須要時間戳作參數;
通常狀況下,瀏覽器默認是非調試狀態,那就點擊右上的按鈕,暫停下吧;
點擊後,會自動打開一個文件,亂七八糟一大堆,不想看;
既然不想看,就返回到剛剛那個js文件吧,而後把鼠標移動到get_abc
函數上;
而後點擊,邏輯不就出來了嗎?
所以,這兩個參數的邏輯以下:
function current_timestamp(){return(new Date).getTime()};
# 當前時間戳
function get_abc(a){return $.md5("phizhub_abc_"+a)}
# sss就是phizhub_abc_+當前13位時間戳拼接而成的md5
複製代碼
故事完,能夠愉快啪啪啪了,腳本沒有,純提供分析思路;
看吧,都說是水文,你還不信?
本文也沒講到啥,只是如今爬蟲的門檻會愈來愈高,而學會怎麼找js源碼,算是當今爬蟲必備的技能了,但願對你有幫助~
謝謝你們~