Scrapy框架延遲請求之Splash的使用

Splash是什麼,用來做什麼

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

  • 並行處理多個網頁
  • 得到HTML結果以及(或者)渲染成圖片
  • 關掉加載圖片或使用 Adblock Plus規則使得渲染速度更快
  • 使用JavaScript處理網頁內容
  • 使用Lua腳本
  • 能在Splash-Jupyter Notebooks中開發Splash Lua scripts
  • 能夠獲得具體的HAR格式的渲染信息

 

爲什麼Scrapy要使用到

Scrapy也有其不足之處,即Scrapy沒有JS engine, 因此它無法爬取JavaScript生成的動態網頁,只能爬取靜態網頁,而在現代的網絡世界中,大部分網頁都會採用JavaScript來豐富網頁的功能。所以結合Splash實現等待頁面動態渲染後,將頁面數據進行爬取 。

 

Splash的安裝使用

這裏安裝Splash使用Docker形式,更加簡單便捷

docker run -p 8050:8050 scrapinghub/splash

執行完出現如下提示:

J-pro:scrapy will$ docker run -p 8050:8050 scrapinghub/splash
2020-07-05 07:43:32+0000 [-] Log opened.
2020-07-05 07:43:32.605417 [-] Xvfb is started: ['Xvfb', ':190283716', '-screen', '0', '1024x768x24', '-nolisten', 'tcp']
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-splash'
2020-07-05 07:43:33.109852 [-] Splash version: 3.4.1
2020-07-05 07:43:33.356860 [-] Qt 5.13.1, PyQt 5.13.1, WebKit 602.1, Chromium 73.0.3683.105, sip 4.19.19, Twisted 19.7.0, Lua 5.2
2020-07-05 07:43:33.357321 [-] Python 3.6.9 (default, Nov  7 2019, 10:44:02) [GCC 8.3.0]
2020-07-05 07:43:33.357536 [-] Open files limit: 1048576
2020-07-05 07:43:33.357825 [-] Can't bump open files limit
2020-07-05 07:43:33.385921 [-] proxy profiles support is enabled, proxy profiles path: /etc/splash/proxy-profiles
2020-07-05 07:43:33.386193 [-] memory cache: enabled, private mode: enabled, js cross-domain access: disabled
2020-07-05 07:43:33.657176 [-] verbosity=1, slots=20, argument_cache_max_entries=500, max-timeout=90.0
2020-07-05 07:43:33.657856 [-] Web UI: enabled, Lua: enabled (sandbox: enabled), Webkit: enabled, Chromium: enabled
2020-07-05 07:43:33.659508 [-] Site starting on 8050
2020-07-05 07:43:33.659701 [-] Starting factory <twisted.web.server.Site object at 0x7fcc3cbb7160>
2020-07-05 07:43:33.660750 [-] Server listening on http://0.0.0.0:8050

訪問:http://0.0.0.0:8050,出現如下頁面則標識Splash安裝成功

 

 

 

Python安裝scrapy-splash模塊

pip3 install scrapy-splash

 

Scrapy使用Splash

1. 創建Scrapy項目,如果還沒創建則參考https://www.cnblogs.com/will-xz/p/13111048.html,進行安裝

2. 找到settings.py文件,增加配置

SPLASH_URL = 'http://0.0.0.0:8050'
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'

3. 實踐Demo,創建demo_splash.py文件,代碼如下:

# -*- coding: UTF-8 -*-
import scrapy
from scrapy_splash import SplashRequest

class DemoSplash(scrapy.Spider):
"""
name:scrapy唯一定位實例的屬性,必須唯一
allowed_domains:允許爬取的域名列表,不設置表示允許爬取所有
start_urls:起始爬取列表
start_requests:它就是從start_urls中讀取鏈接,然後使用make_requests_from_url生成Request,
這就意味我們可以在start_requests方法中根據我們自己的需求往start_urls中寫入
我們自定義的規律的鏈接
parse:回調函數,處理response並返回處理後的數據和需要跟進的url
log:打印日誌信息
closed:關閉spider
"""
# 設置name
name = "demo_splash"
allowed_domains = []
start_urls = [
'http://yao.xywy.com/class.htm',
]

def parse(self, response):
print("開始抓取")
## 爬取指定地址,設置等待秒數
yield SplashRequest("http://yao.xywy.com/class/201-0-0-1-0-1.htm", callback=self.parse_page, args={'wait': 0.5})

def parse_page(self, response):
print(response.xpath('//div'))
## 這裏可以對數據進行解析存儲了

4. 執行抓取命令

scrapy crawl demo_splash 

5. 完成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章