JB的Python之旅-爬取phizhub網站
先說明,本文是水文,跟Python也沒關係的,寫著Python,是因為jb用py寫爬蟲比較多;
本文只是簡單介紹個網站如何爬蟲的思路,文章很短,1分鐘看完,沒啥特別的,完~
講故事啦
為什麼要說這是,是因為今早在某群看到有同學問,訪問介面沒有資料,是啥問題;

第一反應就是,請求引數不對,但接著該同學說,引數都一樣的,還是沒資料;

剛好看到了,就試試吧,開啟首頁,是個表情包的網站,夠騷的~

常規操作, Chrome F12-network,選擇XHR ,現在一般網站都是ajax載入圖片的,所以直接選擇xhr了,重新整理網頁,這不就有資料了嗎?

逐個點選看返回的內容,不難找到圖片地址;

這樣,介面地址也出來了:
http://www.phizhub.com/phiz/get_phiz_list/?category=-1&page=1&last_time=0&page_size=40 複製程式碼
後面的引數,不糾結,把這個地址放到Chrome上訪問,發現居然是沒資料:

行吧,可能是因為請求時需要特定的引數,用postman模擬一波,按照上面看到的引數搞一波,發現還是沒有資料:

一開始以為引數不對或者有遺漏,檢查一遍發現還是不行,那就說明,可能是 伺服器有檢驗機制 了;
先看了一下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 複製程式碼
故事完,可以愉快啪啪啪了,指令碼沒有,純提供分析思路;