1. 程式人生 > >Scrapy利用Splash抓取動態頁面

Scrapy利用Splash抓取動態頁面

之前的例子,我爬取的都是些靜態頁面中的資訊,爬取容易。但是目前大多數網站都是動態的,動態頁面中的部分內容是瀏覽器執行頁面中的JavaScript指令碼動態生成的,爬取相對困難。

動態網頁一般兩種思路 ,一是找到api介面偽裝請求直接請求資料,另一種是沒有辦法模擬的時候需要渲染環境。

這裡我使用了第二種方法

Splash是Scrapy官方推薦的JavaScript渲染引擎,它是使用Webkit開發的輕量級無介面瀏覽器,提供基於HTTP介面的JavaScript渲染服務,支援以下功能:

  • 為使用者返回經過渲染的HTML頁面或頁面截圖
  • 併發渲染多個頁面
  • 關閉圖片載入,加速渲染
  • 在頁面中執行使用者自定義的JavaScript程式碼
  • 執行使用者自定義的渲染指令碼(lua),功能類似於PhantomJS

如何使用Splash:

  1. splash使用的是Splash HTTP API,所以需要一個Splash Instance,一般採用docker執行splash,所以需要安裝docker

    sudo apt-get install docker
    
  2. 拉取映象

    sudo docker pull scrapinghub/splash
    
  3. 在本機的8050和8051埠開啟Splash服務

    docker run -p 8050:8050 -p 8051:8051 scrapinghub/splash
    
  4. 安裝scrapy-splash

    pip install scrapy-splash
    
  5. 配置splash服務(settings.py)

    # Splash伺服器地址
    SPLASH_URL = 'http://localhost:8050'
    
    DOWNLOADER_MIDDLEWARES = {
        'scrapy_splash.SplashCookiesMiddleware': 723,
        'scrapy_splash.SplashMiddleware': 725,
        'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
    }
    # 設定去重過濾器
    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    
    # 用來支援cache_args
    SPIDER_MIDDLEWARES = {
        'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
    }
    
    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
    

例子:

for index, id in enumerate(ids):
            req = SplashRequest(self.detail_url + str(id))
            req.callback = self.parse_detail
            req.endpoint = 'render.html'
            req.meta['tel'] = tel
            req.meta['name'] = name
            req.meta['id'] = id
            req.args = {'wait': 0.5}
            yield req