Scrapy利用Splash抓取動態頁面
阿新 • • 發佈:2019-02-14
之前的例子,我爬取的都是些靜態頁面中的資訊,爬取容易。但是目前大多數網站都是動態的,動態頁面中的部分內容是瀏覽器執行頁面中的JavaScript指令碼動態生成的,爬取相對困難。
動態網頁一般兩種思路 ,一是找到api介面偽裝請求直接請求資料,另一種是沒有辦法模擬的時候需要渲染環境。
這裡我使用了第二種方法
Splash是Scrapy官方推薦的JavaScript渲染引擎,它是使用Webkit開發的輕量級無介面瀏覽器,提供基於HTTP介面的JavaScript渲染服務,支援以下功能:
- 為使用者返回經過渲染的HTML頁面或頁面截圖
- 併發渲染多個頁面
- 關閉圖片載入,加速渲染
- 在頁面中執行使用者自定義的JavaScript程式碼
- 執行使用者自定義的渲染指令碼(lua),功能類似於PhantomJS
如何使用Splash:
splash使用的是Splash HTTP API,所以需要一個Splash Instance,一般採用docker執行splash,所以需要安裝docker
sudo apt-get install docker
拉取映象
sudo docker pull scrapinghub/splash
在本機的8050和8051埠開啟Splash服務
docker run -p 8050:8050 -p 8051:8051 scrapinghub/splash
安裝scrapy-splash
pip install scrapy-splash
配置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