scrapy定制爬蟲-爬取javascript內容

很多網站都使用javascript...網頁內容由js動態生成,一些js事件觸發的頁面內容變化,鏈接打開.甚至有些網站在沒有js的情況下根本不工作,取而代之返回你一條類似"請打開瀏覽器js"之類的內容.

對javascript的支持有四種解決方案:

1,寫代碼模擬相關js邏輯.

2,調用一個有界面的瀏覽器,類似各種廣泛用于測試的,selenium這類.

3,使用一個無界面的瀏覽器,各種基于webkit的,casperjs,phantomjs等等.

4,結合一個js執行引擎,自己實現一個輕量級的瀏覽器.難度很大.

對于簡單的有限爬取任務,若可以通過代碼模擬js邏輯,首選這種方案,例如,在duckduckgo搜索引擎中,翻頁這個動作是靠js觸發的.模擬似乎還是很難,然后我注意到他頁面的第二個form,似乎submit后就可以翻頁,試了一下果然如此.

在寫代碼模擬相關js邏輯時,首先試下關閉瀏覽器的js,看下是否能獲取到需要的東西.有些頁面提供了沒有js的兼容.不行再開chrome的控制臺或firebug觀察js邏輯,可能是ajax這類收發包.用urllib2(推薦requests庫)模擬即可,也可能是修改dom之類,用lxml這類對應修改即可.說來就是js執行了什么,就用python代碼對應模擬執行.

也可選擇使用selenium這類,缺點是效率很低,你應當先測試一下selenium啟動一個瀏覽器實例所需時間你是否可接受.這個時間一般在秒級別.再考慮到瀏覽器打開頁面渲染,就更慢了.在效率可接受的前提下,這個方案也不錯.

這個方案的另一個問題是在沒有桌面環境的服務器上,selenium目測無法運行.

對規模不小,模擬js不可行,selenium效率太低,或需要在無桌面環境上執行的情況.有無界面瀏覽器,幾個無界面瀏覽器大體情況如下:

1,casperjs,phantomjs:非py,可以通過命令行調用,功能基本滿足,推薦先看下這兩個是否滿足.比較成熟.phantomjs還有一個非官方的webdriver協議實現,由此可通過selenium調phantomjs實現無界面.

2,ghost,spynner等:py定制的webkit,個人覺得spynner代碼亂,ghost代碼質量不錯.但有bug.我看過幾個這類庫后自己改了一個.

這種方案的詳細情況見下面.

最后還有一種選擇,在js執行引擎的基礎上,自己實現一個輕量級的支持js的無界面瀏覽器.除非你有非常非常非常多需要爬取的內容,效率十分十分十分重要.若你有這個想法,可以看下pyv8,在v8的示例代碼中有一個基于v8實現的簡易瀏覽器模型.是的,只是個模型,并不完全可用,你要自己填充里面的一些方法.實現這些你需要在js引擎(v8),http庫(urllib2)之上實現這些功能,1,當網頁打開時獲取其包含的js代碼,2,構建一個瀏覽器模型,包括各種事件與dom樹.3,執行js.除此之外可能還有其他一些細節.難度較大.

網上可以找到一淘所用購物比價爬蟲的一篇相關ppt.該爬蟲也僅使用的第三種方案.可以看下這篇ppt.該爬蟲大概是用的webkit,scrapy,另外把scrapy的調度隊列改為基于redis的,實現分布式.

學習Python中的小伙伴,需要學習資料的話,可以前往我的微信公眾號:速學Python,后臺回復:簡書,即可拿Python學習資料

這里有我自己整理了一套最新的python系統學習教程,包括從基礎的python腳本到web開發、爬蟲、數據分析、數據可視化、機器學習等。送給正在學習python的小伙伴!這里是python學習者聚集地,歡迎初學和進階中的小伙伴!

如何實現:

回頭談點背景知識,scrapy使用了twisted.一個異步網絡框架.因此要留意潛在的阻塞情況.但注意到settings中有個參數是設置ItemPipeline的并行度.由此推測pipeline不會阻塞,pipeline可能是在線程池中執行的(未驗證).Pipeline一般用于將抓取到的信息保存(寫數據庫,寫文件),因此這里你就不用擔心耗時操作會阻塞整個框架了,也就不用在Pipeline中將這個寫操作實現為異步.

除此之外框架的其他部分.都是異步的,簡單說來就是,爬蟲生成的請求交由調度器去下載,然后爬蟲繼續執行.調度器完成下載后會將響應交由爬蟲解析.

網上找到的參考例子,部分將js支持寫到了DownloaderMiddleware中,scrapy官網的code snippet也是這樣 .若這樣實現,就阻塞了整個框架,爬蟲的工作模式變成了,下載-解析-下載-解析,而不在是并行的下載.在對效率要求不高的小規模爬取中問題不大.

更好的做法是將js支持寫到scrapy的downloader里.網上有一個這樣的實現(使用selenium+phantomjs).不過僅支持get請求.

在適配一個webkit給scrapy的downloader時,有各種細節需要處理.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,333評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,491評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,263評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,946評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,708評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,186評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,255評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,409評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,939評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,774評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,976評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,518評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,209評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,641評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,872評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,650評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,958評論 2 373

推薦閱讀更多精彩內容