本篇文章給大家分享的是有關(guān)scrapy爬蟲如何爬取javascript內(nèi)容,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)服務(wù)商,為中小企業(yè)提供成都網(wǎng)站建設(shè)、成都網(wǎng)站制作服務(wù),網(wǎng)站設(shè)計(jì),網(wǎng)站托管、服務(wù)器租用等一站式綜合服務(wù)型公司,專業(yè)打造企業(yè)形象網(wǎng)站,讓您在眾多競(jìng)爭(zhēng)對(duì)手中脫穎而出成都創(chuàng)新互聯(lián)。
很多網(wǎng)站都使用javascript...網(wǎng)頁內(nèi)容由js動(dòng)態(tài)生成,一些js事件觸發(fā)的頁面內(nèi)容變化,鏈接打開.甚至有些網(wǎng)站在沒有js的情況下根本不工作,取而代之返回你一條類似"請(qǐng)打開瀏覽器js"之類的內(nèi)容.
對(duì)javascript的支持有四種解決方案:
1,寫代碼模擬相關(guān)js邏輯.
2,調(diào)用一個(gè)有界面的瀏覽器,類似各種廣泛用于測(cè)試的,selenium這類.
3,使用一個(gè)無界面的瀏覽器,各種基于webkit的,casperjs,phantomjs等等.
4,結(jié)合一個(gè)js執(zhí)行引擎,自己實(shí)現(xiàn)一個(gè)輕量級(jí)的瀏覽器.難度很大.
對(duì)于簡(jiǎn)單的有限爬取任務(wù),若可以通過代碼模擬js邏輯,首選這種方案,例如,在duckduckgo搜索引擎中,翻頁這個(gè)動(dòng)作是靠js觸發(fā)的.模擬似乎還是很難,然后我注意到他頁面的第二個(gè)form,似乎submit后就可以翻頁,試了一下果然如此.
在寫代碼模擬相關(guān)js邏輯時(shí),首先試下關(guān)閉瀏覽器的js,看下是否能獲取到需要的東西.有些頁面提供了沒有js的兼容.不行再開chrome的控制臺(tái)或firebug觀察js邏輯,可能是ajax這類收發(fā)包.用urllib2(推薦requests庫)模擬即可,也可能是修改dom之類,用lxml這類對(duì)應(yīng)修改即可.說來就是js執(zhí)行了什么,就用python代碼對(duì)應(yīng)模擬執(zhí)行.
也可選擇使用selenium這類,缺點(diǎn)是效率很低,你應(yīng)當(dāng)先測(cè)試一下selenium啟動(dòng)一個(gè)瀏覽器實(shí)例所需時(shí)間你是否可接受.這個(gè)時(shí)間一般在秒級(jí)別.再考慮到瀏覽器打開頁面渲染,就更慢了.在效率可接受的前提下,這個(gè)方案也不錯(cuò).
這個(gè)方案的另一個(gè)問題是在沒有桌面環(huán)境的服務(wù)器上,selenium目測(cè)無法運(yùn)行.
對(duì)規(guī)模不小,模擬js不可行,selenium效率太低,或需要在無桌面環(huán)境上執(zhí)行的情況.有無界面瀏覽器,幾個(gè)無界面瀏覽器大體情況如下:
1,casperjs,phantomjs:非py,可以通過命令行調(diào)用,功能基本滿足,推薦先看下這兩個(gè)是否滿足.比較成熟.phantomjs還有一個(gè)非官方的webdriver協(xié)議實(shí)現(xiàn),由此可通過selenium調(diào)phantomjs實(shí)現(xiàn)無界面.
2,ghost,spynner等:py定制的webkit,個(gè)人覺得spynner代碼亂,ghost代碼質(zhì)量不錯(cuò).但有bug.我看過幾個(gè)這類庫后自己改了一個(gè).
這種方案的詳細(xì)情況見下面.
最后還有一種選擇,在js執(zhí)行引擎的基礎(chǔ)上,自己實(shí)現(xiàn)一個(gè)輕量級(jí)的支持js的無界面瀏覽器.除非你有非常非常非常多需要爬取的內(nèi)容,效率十分十分十分重要.若你有這個(gè)想法,可以看下pyv8,在v8的示例代碼中有一個(gè)基于v8實(shí)現(xiàn)的簡(jiǎn)易瀏覽器模型.是的,只是個(gè)模型,并不完全可用,你要自己填充里面的一些方法.實(shí)現(xiàn)這些你需要在js引擎(v8),http庫(urllib2)之上實(shí)現(xiàn)這些功能,1,當(dāng)網(wǎng)頁打開時(shí)獲取其包含的js代碼,2,構(gòu)建一個(gè)瀏覽器模型,包括各種事件與dom樹.3,執(zhí)行js.除此之外可能還有其他一些細(xì)節(jié).難度較大.
網(wǎng)上可以找到一淘所用購物比價(jià)爬蟲的一篇相關(guān)ppt.該爬蟲也僅使用的第三種方案.可以看下這篇ppt.該爬蟲大概是用的webkit,scrapy,另外把scrapy的調(diào)度隊(duì)列改為基于redis的,實(shí)現(xiàn)分布式.
如何實(shí)現(xiàn):
回頭談點(diǎn)背景知識(shí),scrapy使用了twisted.一個(gè)異步網(wǎng)絡(luò)框架.因此要留意潛在的阻塞情況.但注意到settings中有個(gè)參數(shù)是設(shè)置ItemPipeline的并行度.由此推測(cè)pipeline不會(huì)阻塞,pipeline可能是在線程池中執(zhí)行的(未驗(yàn)證).Pipeline一般用于將抓取到的信息保存(寫數(shù)據(jù)庫,寫文件),因此這里你就不用擔(dān)心耗時(shí)操作會(huì)阻塞整個(gè)框架了,也就不用在Pipeline中將這個(gè)寫操作實(shí)現(xiàn)為異步.
除此之外框架的其他部分.都是異步的,簡(jiǎn)單說來就是,爬蟲生成的請(qǐng)求交由調(diào)度器去下載,然后爬蟲繼續(xù)執(zhí)行.調(diào)度器完成下載后會(huì)將響應(yīng)交由爬蟲解析.
網(wǎng)上找到的參考例子,部分將js支持寫到了DownloaderMiddleware中,scrapy官網(wǎng)的code snippet也是這樣 .若這樣實(shí)現(xiàn),就阻塞了整個(gè)框架,爬蟲的工作模式變成了,下載-解析-下載-解析,而不在是并行的下載.在對(duì)效率要求不高的小規(guī)模爬取中問題不大.
更好的做法是將js支持寫到scrapy的downloader里.網(wǎng)上有一個(gè)這樣的實(shí)現(xiàn)(使用selenium+phantomjs).不過僅支持get請(qǐng)求.
在適配一個(gè)webkit給scrapy的downloader時(shí),有各種細(xì)節(jié)需要處理.
以上就是scrapy爬蟲如何爬取javascript內(nèi)容,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。