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. 完成!