1. 程式人生 > >如何采集淘寶(口碑)外賣的數據

如何采集淘寶(口碑)外賣的數據

多線程 源地址 elf 今天 digg 提取 如果 控制臺 轉載

本文原創作者:鯤之鵬(http://www.site-digger.com)

本文原始鏈接:http://www.site-digger.com/html/articles/20170926/138.html


淘寶外賣(口碑外賣)有App版和H5版兩個版本。經驗(直覺)告訴我們淘寶的App肯定是有保護措施的(簽名機制),那我們就直奔H5版本了。H5版本的入口地址是:https://h5.m.taobao.com/app/waimai/index.html,你需要啟動瀏覽器的手機兼容模式才能在PC瀏覽器中正常瀏覽(如何開啟?我們之前的文章裏有介紹:http://www.site-digger.com/html/articles/20160718/127.html

)。

稍微抓包分析就可以看到數據全是Ajax動態加載的,不論是店鋪列表頁還是店鋪詳情頁。當你嘗試去構造這個Ajax請求時,會發現悲劇了。它同樣也有一個簽名參數sign(如下圖所示)。這個值是根據data參數動態計算出來的,經驗告訴我們想搞清楚這個算法是不容易的。如果我們不提交這個參數或者提交一個錯誤的值,服務器會返回錯誤。

技術分享圖片

有經驗的爬蟲工程師立馬會想到,那我們就曲線救國吧,使用模擬瀏覽器,來繞過這個簽名機制。但是當你再仔細分析時發現又悲劇了,Ajax動態加載數據後,頁面HTML裏還是看不到店鋪的詳細信息(只能看到名稱、月銷量、起送金額之類的,如下圖所示)。

PS:科普一下模擬瀏覽器的數據抓取方式,顧名思義就是通過程序控制瀏覽器去抓取數據,最大的優點是可以不關心數據的加載方式(動態加載還是靜態頁面),能繞過各種加密方式。直接從最終的頁面源碼(數據加載完成後)中提取想要的字段。(缺點是速度慢,資源開銷大)。

技術分享圖片

我去,太狠了吧。Ajax返回的信息裏明明有店鋪詳細的信息(甚至連電話、營業時間、營業執照信息都有啊),可惜動態加載後的頁面中找不到(故意的),甚至控制臺查看所有JS變量也找不到:dir(window)。我們需要的數據不在頁面源碼裏,傳統的模擬瀏覽器的方式也行不通了。

看來我們只能想辦法攔截那個瀏覽器的Ajax應答,然後從Ajax應答裏提取數據了。之前我們曾介紹過可以通過Fiddler + Custom Rules腳本來實現類似的功能(http://www.site-digger.com/html/articles/20170810/137.html),這裏我們可以利用類似的方案,讓 Custom Rules把捕獲到的Ajax應答數據記錄下來,然後我們再從裏面提取想要的信息。

不過今天要換一種方案(條條大路通羅馬)。我們換用SlimerJS(https://slimerjs.org/),它和PhantomJS類似可以用Javascript來驅動它為我們工作。它比PhantomJS優越的地方是它提供一個可以捕獲HTTP事件的接口,我們可以利用它的onResourceReceived接口在HTTP應答到達的時候進行捕獲。而且它支持多線程。

最後再秀一下抓取過程和最終獲取到數據的截圖:

技術分享圖片

技術分享圖片

技術分享圖片


說明:該文章為鯤之鵬(http://www.site-digger.com)原創文章 ,您除了可以發表評論外,還可以轉載到別的網站,但是請保留源地址,謝謝!!(尊重他人勞動,我們共同努力)


如何采集淘寶(口碑)外賣的數據