利用scrapy-splash爬取JS生成的動態頁面


目前,為了加速頁面的加載速度,頁面的很多部分都是用JS生成的,而對於用scrapy爬蟲來說就是一個很大的問題,因為scrapy沒有JS engine,所以爬取的都是靜態頁面,對於JS生成的動態頁面都無法獲得。

解決方案:

  • 利用第三方中間件來提供JS渲染服務: scrapy-splash 等。
  • 利用webkit或者基於webkit庫

Splash是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT)用來讓服務具有異步處理能力,以發揮webkit的並發能力。


下面就來講一下如何使用scrapy-splash:

  1. 利用pip安裝scrapy-splash庫:
    $ pip install scrapy-splash

  2. scrapy-splash使用的是Splash HTTP API, 所以需要一個splash instance,一般采用docker運行splash,所以需要安裝docker

  3. 安裝docker, 安裝好后運行docker。

  4. 拉取鏡像(pull the image):
    $ docker pull scrapinghub/splash

  5. 用docker運行scrapinghub/splash:
    $ docker run -p 8050:8050 scrapinghub/splash

  6. 配置splash服務(以下操作全部在settings.py):

    1)添加splash服務器地址:

    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)Enable SplashDeduplicateArgsMiddleware:

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

    4)Set a custom DUPEFILTER_CLASS:

    DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
    

    5)a custom cache storage backend:

    HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
    
  7. 例子
    獲取HTML內容:

import scrapy
from scrapy_splash import SplashRequest

class MySpider(scrapy.Spider):
    start_urls = ["http://example.com", "http://example.com/foo"]

    def start_requests(self):
        for url in self.start_urls:
            yield SplashRequest(url, self.parse, args={'wait': 0.5})

    def parse(self, response):
        # response.body is a result of render.html call; it
        # contains HTML processed by a browser.
        # ...        

參考鏈接:
scrapy_splash教程
Scrapy爬蟲中使用Splash處理頁面JS


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM