目前,為了加速頁面的加載速度,頁面的很多部分都是用JS生成的,而對於用scrapy爬蟲來說就是一個很大的問題,因為scrapy沒有JS engine,所以爬取的都是靜態頁面,對於JS生成的動態頁面都無法獲得。
解決方案:
- 利用第三方中間件來提供JS渲染服務: scrapy-splash 等。
- 利用webkit或者基於webkit庫
Splash是一個Javascript渲染服務。它是一個實現了HTTP API的輕量級瀏覽器,Splash是用Python實現的,同時使用Twisted和QT。Twisted(QT)用來讓服務具有異步處理能力,以發揮webkit的並發能力。
下面就來講一下如何使用scrapy-splash:
-
利用pip安裝scrapy-splash庫:
$ pip install scrapy-splash -
scrapy-splash使用的是Splash HTTP API, 所以需要一個splash instance,一般采用docker運行splash,所以需要安裝docker。
-
安裝docker, 安裝好后運行docker。
-
拉取鏡像(pull the image):
$ docker pull scrapinghub/splash -
用docker運行scrapinghub/splash:
$ docker run -p 8050:8050 scrapinghub/splash -
配置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' -
例子
獲取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.
# ...
