爬蟲(chóng)課堂(二十三)|使用Splash爬取動(dòng)態(tài)頁(yè)面(1)

在之前的章節(jié)中屁擅,爬取的都是靜態(tài)頁(yè)面中的信息序宦,隨著越來(lái)越多的網(wǎng)站開(kāi)始用JS在客戶端瀏覽器動(dòng)態(tài)渲染網(wǎng)站滥玷,導(dǎo)致很多需要的數(shù)據(jù)并不能在原始的HTML中獲取辟癌,再加上Scrapy本身并不提供JS渲染解析的功能寒屯,那么如何通過(guò)Scrapy爬取動(dòng)態(tài)網(wǎng)站的數(shù)據(jù)呢?這一章節(jié)我們將學(xué)習(xí)這些知識(shí)黍少。
通常對(duì)這類網(wǎng)站數(shù)據(jù)的爬取采用如下兩種方法:

  • 通過(guò)分析網(wǎng)站寡夹,找到對(duì)應(yīng)數(shù)據(jù)的接口,模擬接口去獲取需要的數(shù)據(jù)(一般也推薦這種方式厂置,畢竟這種方式的效率最高)菩掏,但是很多網(wǎng)站的接口隱藏的很深,或者接口的加密非常復(fù)雜昵济,導(dǎo)致無(wú)法獲取到它們的數(shù)據(jù)接口智绸,此種方法很可能就行不通。
  • 借助JS內(nèi)核访忿,將獲取到的含有JS腳本的頁(yè)面交由JS內(nèi)核去渲染瞧栗,最后將渲染后生成的HTML返回給Scrapy解析,Splash是Scrapy官方推薦的JS渲染引擎醉顽,它是使用Webkit開(kāi)發(fā)的輕量級(jí)無(wú)界面瀏覽器沼溜,提供基于HTML接口的JS渲染服務(wù)。

一游添、搭建Splash服務(wù)
如何在Scrapy中調(diào)用Splash服務(wù)系草?Python庫(kù)的scrapy-splash是一個(gè)非常好的選擇,下面就來(lái)講解如何使用scrapy-splash唆涝。

  • 利用pip安裝scrapy-splash庫(kù):
    $ pip install scrapy-splash
  • scrapy-splash使用的是Splash HTTP API找都,所以需要一個(gè)splash instance,一般采用docker運(yùn)行splash廊酣,所以需要安裝docker:
    $ sudo apt-get install docker
    如果是Mac的話需要使用brew安裝能耻,如下:
$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"`
$ brew install docker
  • 拉取鏡像:
    $ sudo docker pull scrapinghub/splash
    如果出現(xiàn)如下錯(cuò)誤時(shí),說(shuō)明已確定Docker本身已經(jīng)安裝正常。
Using default tag: latest
Warning: failed to get default registry endpoint from daemon (Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?). Using system default: https://index.docker.io/v1/
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

問(wèn)題原因是因?yàn)閐ocker服務(wù)沒(méi)有啟動(dòng)晓猛,在相應(yīng)的/var/run/ 路徑下找不到docker的進(jìn)程饿幅。
執(zhí)行service docker start命令,啟動(dòng)docker服務(wù)戒职。

  • 使用docker開(kāi)啟Splash服務(wù):
    $ sudo docker run -p 8050:8050 scrapinghub/splash
  • 在項(xiàng)目配置文件settings.py中配置splash服務(wù):
    1)添加splash服務(wù)器地址:
    SPLASH_URL = 'http://localhost:8050'
    2)將splash middleware添加到DOWNLOADER_MIDDLEWARE中:
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}

3)支持cache_args(可選):

SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}

4)設(shè)置去重過(guò)濾器:
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
二栗恩、使用Splash服務(wù)
Splash功能豐富,包含多個(gè)服務(wù)端點(diǎn)洪燥,最常用的有兩個(gè)端點(diǎn):

  • render.html
    提供JS頁(yè)面渲染服務(wù)磕秤。
  • execute
    執(zhí)行用戶自定義的渲染腳本,利用該端點(diǎn)可在頁(yè)面中執(zhí)行JS代碼捧韵。

舉一個(gè)簡(jiǎn)單的例子市咆,使用scrapy_splash.SplashRequest渲染JS請(qǐng)求,如下:

import scrapy
from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):
    # 假設(shè)這個(gè)請(qǐng)求的頁(yè)面數(shù)據(jù)是需要執(zhí)行JS才能爬取的
    start_urls = ["http://example.com"]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, args={'images':0,'timeout': 5})

    def parse(self, response):
        # ...        

上述代碼中再来,用戶只需使用scrapy_splash.SplashRequest替代scrapy.Request提交請(qǐng)求即可完成JS渲染蒙兰,并且在SplashRequest的構(gòu)造器中無(wú)須傳遞endpoint參數(shù),因?yàn)樵搮?shù)默認(rèn)值就是‘render.html’其弊。
下面介紹下SplashRequest構(gòu)造器方法中的一些常用參數(shù)癞己。

  • url
    與scrapy.Request中的url相同膀斋,也就是待爬取頁(yè)面的url梭伐。
  • headers
    與scrapy.Request中的headers相同。
  • cookies
    與scrapy.Request中的cookies相同仰担。
  • args
    傳遞給Splash的參數(shù)糊识,如wait(等待時(shí)間)、timeout(超時(shí)時(shí)間)摔蓝、images(是否禁止加載圖片赂苗,0禁止,1不禁止)等贮尉。
  • endpoint
    Splash服務(wù)端點(diǎn)拌滋,默認(rèn)為‘render.html’,即JS頁(yè)面渲染服務(wù)猜谚。
  • splash_url
    Splash服務(wù)器地址败砂,默認(rèn)為None,即使用settings.py配置文件中的SPLASH_URL = 'http://localhost:8050'
    三魏铅、項(xiàng)目實(shí)戰(zhàn)
    放在下一章節(jié)講解
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昌犹,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子览芳,更是在濱河造成了極大的恐慌斜姥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異铸敏,居然都是意外死亡缚忧,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)杈笔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)搔谴,“玉大人,你說(shuō)我怎么就攤上這事桩撮《氐冢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵店量,是天一觀的道長(zhǎng)芜果。 經(jīng)常有香客問(wèn)我,道長(zhǎng)融师,這世上最難降的妖魔是什么右钾? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮旱爆,結(jié)果婚禮上舀射,老公的妹妹穿的比我還像新娘。我一直安慰自己怀伦,他們只是感情好脆烟,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著房待,像睡著了一般邢羔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上桑孩,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天拜鹤,我揣著相機(jī)與錄音,去河邊找鬼流椒。 笑死敏簿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的宣虾。 我是一名探鬼主播惯裕,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼安岂!你這毒婦竟也來(lái)了轻猖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤域那,失蹤者是張志新(化名)和其女友劉穎咙边,沒(méi)想到半個(gè)月后猜煮,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡败许,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年王带,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片市殷。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愕撰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出醋寝,到底是詐尸還是另有隱情搞挣,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布音羞,位于F島的核電站囱桨,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏嗅绰。R本人自食惡果不足惜舍肠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望窘面。 院中可真熱鬧翠语,春花似錦、人聲如沸财边。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)制圈。三九已至们童,卻和暖如春畔况,著一層夾襖步出監(jiān)牢的瞬間鲸鹦,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工跷跪, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留馋嗜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓吵瞻,卻偏偏與公主長(zhǎng)得像葛菇,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子橡羞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容