如何能正常獲取17track物流網站的物流資訊?

sergiojune發表於2019-04-04

原本昨天就要發文章的了,由於之前的pdd文章被投訴了,刪除了,影響心情的同時也不敢亂髮文章了,所以就暫時歇了一天,也改了另外一個網站,就是今天的物流網站。如果大家某天看不到我發文了,估計我也是被舉報完了,到時想要看的可以去我的GitHub上看。

獻上GitHub:https://github.com/SergioJune/Spider-Crack-JS

對你有用的話,希望能點個star,謝謝

今天網站:https://www.17track.net/zh-cn

這是個物流網站,就是查詢物流的,今天要做的就是根據單號查詢物流,廢話不多說,直接肝。

1. 找到所需資料的 URL 請求

這裡我們查詢一個單號,也可以批量查詢,引數都差不多,長度變了而已,所以演示就只查詢一個單號。

如何能正常獲取17track物流網站的物流資訊?

開啟了開發者工具你慢慢找,很容易就找到這個請求。

如何能正常獲取17track物流網站的物流資訊?

如何能正常獲取17track物流網站的物流資訊?

如何能正常獲取17track物流網站的物流資訊?

需要的資料就是這個快遞軌跡,看到上面的 formdata 好像沒什麼問題,挺容易的,這還有什麼比這爽的,趕緊使用 python 請求一波。

如何能正常獲取17track物流網站的物流資訊?

結果返回了這個,果然沒有想象中的那麼簡單,估計又是在cookie上面做了反爬,那我們就加上cookie試試

如何能正常獲取17track物流網站的物流資訊?

果不其然,真的成功了,經過我的測試,發現需要的cookie 鍵是 Last-Event-ID ,那接下來就是看怎麼生成的了。


2. 尋找生成位置

上面知道了是哪個 cookie 反爬的,最簡單的尋找就是全域性搜尋這個引數來看看有沒有線索。

如何能正常獲取17track物流網站的物流資訊?

果然有,而且檔名字和請求的路徑名有幾分相似,按經驗來說八九不離十就是這個了,點選進去看看。

如何能正常獲取17track物流網站的物流資訊?

格式化就可以看到上圖的程式碼,一眼看去,這程式碼很像我之前這篇請求網頁時,怎麼給我返回了一段 JavaScript 程式碼,都是前面一個大陣列,然後在一個地方把這個陣列的順序,然後通過一個函式來將這個陣列的元素來解密成正常的函式名。接著就是檢測你有沒有展開程式碼之類的,展開了就會記憶體爆破,具體的都可以看看我剛說的這篇文章。

有了上次的經驗,我就直接在瀏覽器上格式化直接除錯了,不把程式碼複製到本地執行了。

瞭解了這麼多,就是開始除錯了,由於我們需要找的 cookie確定是在這個檔案內生成,但是還不知道在哪生成,所以需要除錯下。

涉及到 cookie, 需要先把瀏覽器的cookie清除才行

如何能正常獲取17track物流網站的物流資訊?

點選 clear site data 即可清除,不放心的就點多幾次。

接著就是在除錯欄的右邊的 watch 新增我們監聽的變數,我們需要監聽 cookie 的變化,所以點選 + 號新增 document.cookie 即可。

如何能正常獲取17track物流網站的物流資訊?

接著打斷點的位置就在我們搜尋到 cookie 值的位置上新增即可

如何能正常獲取17track物流網站的物流資訊?

接下來就是重新整理網頁,等待程式跳到斷點的位置

如何能正常獲取17track物流網站的物流資訊?

這時看到 cookie 的值是空的,在 application 上看的 cookie 也是空的

如何能正常獲取17track物流網站的物流資訊?

接著就是按下斷點執行下一行語句,不會的先自行百度,這個除錯肯定得學會的,這裡就不多說了,或者我過兩天有時間寫篇 chrome 除錯供大家參考下。

現在就是漫長的除錯尋找加密的時間了,經過我的查詢,很快就可以看到這個了。

如何能正常獲取17track物流網站的物流資訊?

下面的那句明顯就是設定 cookie 的,可以自己複製語句到 console 上執行一次

如何能正常獲取17track物流網站的物流資訊?

這樣子就找到生成位置了,現在就是檢視右邊的呼叫棧,檢視是在哪個地方開始執行的,看看他們之間的呼叫關係。

如何能正常獲取17track物流網站的物流資訊?


3. 把生成的引數程式碼扣出來

在上面的cookie 生成可以看到是一個陣列,然後使用 join() 來連線起來的

如何能正常獲取17track物流網站的物流資訊?

我們可以觀察這個陣列在哪裡生成和賦值的,也通過呼叫棧可以看到引數生成地方是在這裡


如何能正常獲取17track物流網站的物流資訊?

我們可以先把這個語句所在的函式扣出來

如何能正常獲取17track物流網站的物流資訊?

發現裡面的函式有些 document 物件,又因為這個是主函式,所以可以修剪下,把那些判斷語句和捕捉異常的都給去掉,就是在原檔案中看判斷語句的真假執行的哪個語句就保留,而正常執行不會產生異常,所以把處理異常的也給去掉,就成了這個樣子。

如何能正常獲取17track物流網站的物流資訊?

然後直接使用瀏覽器開啟執行檢視錯誤

如何能正常獲取17track物流網站的物流資訊?

然後對比原檔案中的引數 ,發現這個是我們傳的 formdata,所以為了測試先賦值一個即可。

如何能正常獲取17track物流網站的物流資訊?


接著是這個錯誤,這個未定義,也是在原檔案中看他的定義處即可。可以這樣看

如何能正常獲取17track物流網站的物流資訊?

點選上面箭頭所指的地方即可到達定義。

如何能正常獲取17track物流網站的物流資訊?

直接到達這裡,看到了他的定義,所以直接從這裡扣出來到最後定義完之處即可,再次重新整理,看到變成了另一個錯誤

如何能正常獲取17track物流網站的物流資訊?

也是在原檔案中找定義即可

如何能正常獲取17track物流網站的物流資訊?

這是個解密函式,就是我上文說的將加密陣列元素解密成正常的函式名,直接扣出來即可,同時我們還需要找個陣列,就是第一行的。

如何能正常獲取17track物流網站的物流資訊?

再次重新整理,瀏覽器卡了起來,甚至出現了崩潰

如何能正常獲取17track物流網站的物流資訊?

這就是所謂的記憶體爆破,這時因為裡面有個函式檢測到了你展開了程式碼,所以就來記憶體爆破,這個都是我在請求網頁時,怎麼給我返回了一段 JavaScript 程式碼這裡得到經驗的,如果你需要除錯尋找的話,可以先在我們扣出來的程式碼隨便寫個錯誤,在檔案程式碼出現,然後在第一行加上斷點進行除錯即可,剩下的就是自己一步一步除錯找出記憶體爆破位置了。

如何能正常獲取17track物流網站的物流資訊?

如何能正常獲取17track物流網站的物流資訊?

由於說過了,就不多說了,突破了繼續重新整理也會遇到一些未定義的,也是同樣扣程式碼,就不多說了,這裡說另一個。

如何能正常獲取17track物流網站的物流資訊?

這裡明明已經是定義了,卻顯示未定義,打了斷點一看,原來是函式名字都是亂碼的

如何能正常獲取17track物流網站的物流資訊?

這是因為我們在第一行定義的陣列是亂序的,需要還原下,這個需要自己一步一步除錯檢視原文的,我這裡就直接說了

如何能正常獲取17track物流網站的物流資訊?

裡面可以打上斷點檢視即可。

剩下的還是重複原來的步驟,檢視錯誤,扣程式碼即可,由於篇幅這裡就不多說了,有問題可以去公眾號「日常學python」選單欄加我微信拉進交流群交流。


4. 用 Python 執行獲取結果

這裡還是使用 PyExecjs 庫來執行 JS 獲取cookie值,如果還原成python 語言成本太大了,不適合。

如何能正常獲取17track物流網站的物流資訊?

程式碼也沒有什麼的,具體的可以去 github:https://github.com/SergioJune/Spider-Crack-JS 上面看


最後

這篇文章昨天就想發了,無耐太累,就一直拖到今天了,有點對不起讀者,還有 pdd 的已經被刪除了,想看的可以去 github 上看。

最後,原創不易,希望大家多點贊多轉發分享給你的好友,點贊轉發越多,我就寫得越多!!!

如何能正常獲取17track物流網站的物流資訊?


相關文章