如何在神箭手上快速開發爬蟲——第二課 如何爬取JS動態生成的數據【豌豆莢遊戲排行榜】
1、本課完整的爬蟲代碼可以在神箭手示例代碼中查看:http://www.shenjianshou.cn/index.php?r=demo/docs&demo_id=500003&demo_id=500003
2、如何在神箭手上運行代碼,請查看文檔:http://docs.shenjianshou.cn/overview/guide/develop/crawler.html
3、更詳細的爬蟲開發教程,請查看文檔:http://docs.shenjianshou.cn/develop/summary/summary.html
大家好,游牧老師我又來啦( ̄▽ ̄)」
想必大家都看過我這個系列的第一篇教程:簡單的文章爬蟲【糗事百科】了吧,如果還沒有看過的小夥伴建議先去看一下,有點基礎再繼續看此課,更容易理解哦~
好了,我們開始如何在神箭手上開發爬蟲系列的第二課,今天我們主要來研究下如何爬取JS動態生成的數據。
熟悉網頁的童鞋都知道,現在很多網頁都是動態的,也就是說很多數據都是通過js非同步載入顯示的。在神箭手上開發爬蟲,有兩種方式可以方便爬取這類動態生成的數據:1、模擬發送http請求;2、使用神箭手提供的自動js渲染大殺器。
簡單說明一下這兩種方式的區別吧:
1、模擬發送http請求。
需要分析下http請求的地址、參數等,一般用chrome的開發者工具的Network選項就能很容易地看到。
這種方式很靈活,獲取數據的速度很快。不過需要一定的請求分析能力,另外如果js很多,逐個模擬發請求也挺麻煩的。
2、使用神箭手提供的自動js渲染。
只需要在configs中設置enableJS:true就可以開啟自動js渲染,就可以像爬取靜態頁面的數據一樣直接抽取動態數據即可。
這種大殺器用起來不要太爽哦,不過因為渲染需要一段時間,所以獲取數據的速度肯定沒有模擬發送請求快。另外如果在渲染的過程中切換代理ip可能會導致渲染失敗。
p.s. 更多關於js自動渲染的介紹請參考神箭手開發文檔:自動JS渲染
本課咱們主要來看下第一種方式:模擬發送http請求
以爬取豌豆莢的遊戲排行榜上的遊戲信息為例,首先老規矩,先來瞻仰下這個頁面(http://www.wandoujia.com/top/game):
第一步,跟我一起喊:入口頁、列表頁、內容頁
沒錯,爬蟲開發第一步,先來確定咱們爬蟲這三大件的url(懵懵懂懂的小夥伴先去看下這個系列教程的第一課)
入口頁:http://www.wandoujia.com/top/game
內容頁:類似這樣的url:http://www.wandoujia.com/apps/com.gameloft.android.ANMP.GloftA8CN.wdj
列表頁:
列表頁是經典的「載入更多」顯示下一頁,咱們再看下入口頁的網頁源代碼,裡面沒有下一頁列表頁的鏈接,也就是說無法通過爬蟲的自動鏈接發現獲取列表頁了。
這種情況就是咱們剛說的js動態網頁了,也就是說咱們要爬取的鏈接或者數據不在網頁源碼中。
那麼通過簡單的分析就可以發現,下一頁鏈接是這樣的http請求:
所以咱們可以通過神箭手提供的addUrl函數將該類url手動添加到待爬隊列中,就可以實現模擬發送該請求返回數據啦~
這部分處理的代碼如下,在回調函數中實現:
/*n 回調函數onProcessHelperPage:獲取下一頁列表頁以及從列表頁中獲取內容頁鏈接,並手動添加到待爬隊列中n*/nconfigs.onProcessHelperPage = function(page, content, site) {n // 列表頁返回的數據是json,需要先轉換成json格式n var jarr = JSON.parse(content);n // 從json數組中獲取內容頁鏈接並添加到待爬隊列中n for (var i = 0, n = jarr.length; i < n; i++) {n var new_url = "http://www.wandoujia.com/apps/"+jarr[i].packageName;n site.addUrl(new_url);n }n // 獲取下一頁列表頁鏈接並添加到待爬隊列中n var currentStart = parseInt(page.url.substring(page.url.indexOf("&start=") + 7));n var start = currentStart+12;n if(start < 100){ // 該demo只爬取遊戲排行榜前100的遊戲n site.addUrl("http://apps.wandoujia.com/api/v1/apps?type=weeklytopgame&max=12&start="+start);n }n return false; // 返回false表示不從當前列表頁中自動發現新的鏈接,從而避免添加無用的鏈接,提高爬取速度n};n
第二步,從內容頁中抽取想要的數據
這裡我們抽取的數據包括:遊戲名稱、下載量、圖標,還是用xpath來抽取
具體實現代碼如下:
fields: [n {n name: "game_name",n alias: "遊戲名",n selector: "//span[contains(@class,title)]",n required: true n },n {n name: "game_download",n alias: "下載量",n selector: "//i[@itemprop=interactionCount]"n },n {n name:"game_icon",n alias: "遊戲圖標",n selector:"//div[contains(@class,app-icon)]/img[@itemprop=image]/@src"n }n ]n
第三步,運行爬蟲,拿到數據
到這裡,這個爬蟲就寫完啦,是不是很簡單(都說了用神箭手開發爬蟲是目前最簡單最快捷的方式啦)
完整的代碼請看這裡:爬取JS動態數據的Demo-豌豆莢排行榜 - 神箭手雲爬蟲示例代碼
最後咱們把完整的代碼複製到神箭手新建爬蟲應用中,點擊啟動,喝杯茶數據就自動爬出來啦:
p.s. 更多爬取js動態數據的例子,請點我查看:如何爬取JS動態生成的數據
再p.s. 如何把爬取的數據發布到自己的系統或者導出到本地文件,看這裡:數據發布
推薦閱讀:
※矽谷之路45:如何設計Crawler(二)多線程並發設計
※[R]利用R Markdown生成爬蟲分析報告
※教你輕鬆爬取Air-Level網站的城市地區數據
※你眼中的我
※左手用R右手Pyhon系列——趣直播課程抓取實戰