爬蟲進階-JS自動渲染之Scrapy_splash組件的使用
1. 什么是scrapy_splash?
scrapy_splash是scrapy的一個組件
- scrapy-splash加載js數(shù)據(jù)是基于Splash來實現(xiàn)的。
- Splash是一個Javascript渲染服務。它是一個實現(xiàn)了HTTP API的輕量級瀏覽器,Splash是用Python和Lua語言實現(xiàn)的,基于Twisted和QT等模塊構(gòu)建。
- 使用scrapy-splash最終拿到的response相當于是在瀏覽器全部渲染完成以后的網(wǎng)頁源代碼。
splash官方文檔
https://splash.readthedocs.io/en/stable/
2. scrapy_splash的作用
scrapy-splash能夠模擬瀏覽器加載js,并返回js運行后的數(shù)據(jù)
3. scrapy_splash的環(huán)境安裝
3.1 使用splash的docker鏡像
splash的dockerfile
https://github.com/scrapinghub/splash/blob/master/Dockerfile
觀察發(fā)現(xiàn)splash依賴環(huán)境略微復雜,所以我們可以直接使用splash的docker鏡像
如果不使用docker鏡像請參考splash官方文檔 安裝相應的依賴環(huán)境
3.1.1 安裝并啟動docker服務
3.1.2 獲取splash的鏡像
在正確安裝docker的基礎上pull取splash的鏡像
sudo docker pull scrapinghub/splash
3.1.3 驗證是否安裝成功
運行splash的docker服務,并通過瀏覽器訪問8050端口驗證安裝是否成功
- 前臺運行
sudo docker run -p 8050:8050 scrapinghub/splash - 后臺運行
sudo docker run -d -p 8050:8050 scrapinghub/splash
訪問http://127.0.0.1:8050 看到如下截圖內(nèi)容則表示成功

3.1.4 解決獲取鏡像超時:修改docker的鏡像源
以ubuntu18.04為例
1.創(chuàng)建并編輯docker的配置文件
sudo vi /etc/docker/daemon.json
2.寫入國內(nèi)docker-cn.com的鏡像地址配置后保存退出
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
3.重啟電腦或docker服務后重新獲取splash鏡像
4.這時如果還慢,請使用手機熱點(流量orz)
3.1.5 關閉splash服務
需要先關閉容器后,再刪除容器
sudo docker ps -a sudo docker stop CONTAINER_ID sudo docker rm CONTAINER_ID
3.2 在python虛擬環(huán)境中安裝scrapy-splash包
pip install scrapy-splash
4. 在scrapy中使用splash
以baidu為例
4.1 創(chuàng)建項目創(chuàng)建爬蟲
scrapy startproject test_splash cd test_splash scrapy genspider no_splash baidu.com scrapy genspider with_splash baidu.com
4.2 完善settings.py配置文件
在settings.py文件中添加splash的配置以及修改robots協(xié)議
# 渲染服務的url
SPLASH_URL = 'http://127.0.0.1:8050'
# 下載器中間件
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
# 去重過濾器
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# 使用Splash的Http緩存
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
4.3 不使用splash
在spiders/no_splash.py中完善
import scrapy
class NoSplashSpider(scrapy.Spider):
name = 'no_splash'
allowed_domains = ['baidu.com']
start_urls = ['https://www.baidu.com/s?wd=13161933309']
def parse(self, response):
with open('no_splash.html', 'w') as f:
f.write(response.body.decode())
4.4 使用splash
import scrapy
from scrapy_splash import SplashRequest # 使用scrapy_splash包提供的request對象
class WithSplashSpider(scrapy.Spider):
name = 'with_splash'
allowed_domains = ['baidu.com']
start_urls = ['https://www.baidu.com/s?wd=13161933309']
def start_requests(self):
yield SplashRequest(self.start_urls[0],
callback=self.parse_splash,
args={'wait': 10}, # 最大超時時間,單位:秒
endpoint='render.html') # 使用splash服務的固定參數(shù)
def parse_splash(self, response):
with open('with_splash.html', 'w') as f:
f.write(response.body.decode())
4.5 分別運行倆個爬蟲,并觀察現(xiàn)象
4.5.1 分別運行倆個爬蟲
scrapy crawl no_splash scrapy crawl with_splash
4.5.2 觀察獲取的倆個html文件
不使用splash

使用splash

4.6 結(jié)論
- splash類似selenium,能夠像瀏覽器一樣訪問請求對象中的url地址
- 能夠按照該url對應的響應內(nèi)容依次發(fā)送請求
- 并將多次請求對應的多次響應內(nèi)容進行渲染
- 最終返回渲染后的response響應對象
5. 了解更多
關于scrapy_splash(截屏,get_cookies等)
https://www.e-learn.cn/content/qita/800748
6. 小結(jié)
1.scrapy_splash組件的作用
- splash類似selenium,能夠像瀏覽器一樣訪問請求對象中的url地址
- 能夠按照該url對應的響應內(nèi)容依次發(fā)送請求
- 并將多次請求對應的多次響應內(nèi)容進行渲染
- 最終返回渲染后的response響應對象
2.scrapy_splash組件的使用
- 需要splash服務作為支撐
- 構(gòu)造的request對象變?yōu)閟plash.SplashRequest
- 以下載中間件的形式使用
- 需要scrapy_splash特定配置
3.scrapy_splash的特定配置
SPLASH_URL = 'http://127.0.0.1:8050'
DOWNLOADER_MIDDLEWARES = {
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
到此這篇關于爬蟲進階-JS自動渲染之Scrapy_splash組件的使用的文章就介紹到這了,更多相關js Scrapy_splash組件使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
IE6/IE7中JavaScript json提示缺少標識符、字符串或數(shù)字問題處理
這篇文章主要介紹了IE6/IE7中JavaScript json提示缺少標識符、字符串或數(shù)字問題處理,需要的朋友可以參考下2014-12-12
javascript瀑布流式圖片懶加載實例解析與優(yōu)化
這篇文章主要針對javascript瀑布流式圖片懶加載實例進行解析與優(yōu)化,感興趣的小伙伴們可以參考一下2016-02-02
javascript實現(xiàn)的動態(tài)添加表單元素input,button等(appendChild)
這篇文章給大家介紹了javascript實現(xiàn)的動態(tài)添加表單元素input,button等(appendChild)的實例代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧2007-11-11
JavaScript中的finally()方法和Filter()方法詳解
finally是 JavaScript 構(gòu)造中使用的方法try-catch,Filter() 是 JavaScript 中的一種方法,可以通過處理數(shù)組輕松提供過濾后的輸出數(shù)據(jù),本文就給大家詳細的介紹一下JavaScript中的finally()方法和Filter()方法,需要的朋友可以參考下2023-08-08

