iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 21
1
AI & Data

Scrapy爬蟲與資料處理30天筆記系列 第 21

[Day 21] Scrapy 爬動態網頁

嗨,昨天講解了透過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渲染服務,它是一個使用TwistedQT5Python中實現的支持HTTP API調用的輕量級的web瀏覽器。

我們會用Docker去執行它,因為主題的關係我不會對於docker的操作多做說明,不過大家有興趣網路可以搜尋到很多有關Docker的教學,所以我們就直接開始吧:

  • Pull Image
sudo docker pull scrapinghub/splash
  • Run
sudo docker run -p 8050:8050 scrapinghub/splash

成功執行可以看到:

Imgur

現在,該怎麼透過Scrapy操作呢?就是使用scrapy-splashscrapy-splash是為了方便scrapy框架使用splash而進行的封裝。

  • pip安裝:
    • (option) 在開始之前,啟用virtualenv
source path/to/your/virtualenv/bin/activate
pip install scrapy-splash

前面我們已經有透過docker開啟Splash了,現在我們只需要修改程式碼,開啟settings.py檔案:

  • 配置Splash服務的地址
SPLASH_URL = 'localhost:8050'
  • 加上Splashmiddlewares,並設置的順序:
DOWNLOADER_MIDDLEWARES = {
    'scrapy_splash.SplashCookiesMiddleware': 723,
    'scrapy_splash.SplashMiddleware': 725,
    'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
  • SplashDeduplicateArgsMiddleware
SPIDER_MIDDLEWARES = {
    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
  • 也可以設置對應的過濾Middleware
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
  • 設置scrapy.contrib.httpcache.FilesystemCacheStorage 來使用Splash的HTTP緩存
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'

好了,這樣settings.py的部分就設定好了,要如何在spider內使用呢?要使用Splash對頁面進行渲染用SplashRequest來取代scrapyRequest就行了,像是:

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


上一篇
[Day 20] Scrapy 模擬登入
下一篇
[Day 22] 實戰:Scrpay 爬取動態網頁
系列文
Scrapy爬蟲與資料處理30天筆記30

1 則留言

1
renewang
iT邦新手 5 級 ‧ 2019-01-14 22:09:16

SPLASH_URL 前面要加 http:// 不然會得到 ValueError: Missing scheme in request url: render.html”

我不是很懂為什麼,這篇回答也沒說的很清楚,不過這樣是可以 work 的。

我要留言

立即登入留言