嗨,昨天講解了透過Scrapy模擬登入!今天就要來講解如何爬取動態的網頁,什麼是動態網頁呢?前面我們介紹的都是去抓取靜態的網站頁面,也就是說我們打開某個鏈接,它的內容全部呈現出來,如果有爬過不同的網站就會發現,有時候雖然我們右鍵檢查網頁的時候明明有值,但爬的結果卻是為空值,這是因為現在大部分的web頁面都是動態的,是經過js渲染的,所以使用之前的方式是無法取得網頁內容的。
那該怎麼做呢?今天要來介紹 Splash!
Splash is a javascript rendering service. It’s a lightweight web browser with an HTTP API, implemented in Python 3 using Twisted and QT5.
Spalsh提供JavaScript渲染服務,它是一個使用Twisted和QT5在Python中實現的支持HTTP API調用的輕量級的web瀏覽器。
我們會用Docker去執行它,因為主題的關係我不會對於docker的操作多做說明,不過大家有興趣網路可以搜尋到很多有關Docker的教學,所以我們就直接開始吧:
sudo docker pull scrapinghub/splash
sudo docker run -p 8050:8050 scrapinghub/splash
成功執行可以看到:

現在,該怎麼透過Scrapy操作呢?就是使用scrapy-splash,scrapy-splash是為了方便scrapy框架使用splash而進行的封裝。
pip安裝:
virtualenv:source path/to/your/virtualenv/bin/activate
pip install scrapy-splash
前面我們已經有透過docker開啟Splash了,現在我們只需要修改程式碼,開啟settings.py檔案:
SPLASH_URL = 'localhost:8050'
Splash的middlewares,並設置的順序:DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
好了,這樣settings.py的部分就設定好了,要如何在spider內使用呢?要使用Splash對頁面進行渲染用SplashRequest來取代scrapy的Request就行了,像是:
yield SplashRequest(url, self.parse_product,
    args={
        'wait': 0.5,
        'http_method': 'GET'
    }
)
http_method為向url發送的HTTP的請求方式。wait表示spalsh在執行完成會等待一段時間後返回記得,前面要先import:
from scrapy_splash import SplashRequest
到這裡就是要使用Scrapy-splash基礎的設定跟Requests方法了,更多詳細的內容可以看 GitHub - scrapy-plugins/scrapy-splash: Scrapy+Splash for JavaScript integration 上面的說明。
因為這週剛好遇上期中考,所以明天我們再說明爬取動態網頁的範例吧!請見諒 (._.) 那就明天見啦!
更多來源:
Installation — Splash 3.2 documentation
GitHub - scrapy-plugins/scrapy-splash: Scrapy+Splash for JavaScript integration
SPLASH_URL 前面要加 http:// 不然會得到 ValueError: Missing scheme in request url: render.html”
我不是很懂為什麼,這篇回答也沒說的很清楚,不過這樣是可以 work 的。