之前我們學(xué)習(xí)的內(nèi)容都是抓取靜態(tài)頁面,每次請求立膛,它的網(wǎng)頁全部信息將會一次呈現(xiàn)出來揪罕。 但是,像比如一些購物網(wǎng)站宝泵,他們的商品信息都是js加載出來的好啰,并且會有ajax異步加載。像這樣的情況儿奶,直接使用scrapy的Request請求是拿不到我們想要的信息的框往,解決的方法就是使用scrapy-splash。
scrapy-splash加載js數(shù)據(jù)是基于Splash來實現(xiàn)的闯捎,Splash是一個Javascript渲染服務(wù)椰弊。它是一個實現(xiàn)了HTTP API的輕量級瀏覽器许溅,Splash是用Python實現(xiàn)的,同時使用Twisted和QT秉版,而我們使用scrapy-splash最終拿到的response相當(dāng)于是在瀏覽器全部渲染完成以后贤重,拿到的渲染之后的網(wǎng)頁源代碼。
準(zhǔn)備環(huán)節(jié)
-
安裝docker
在windows環(huán)境下清焕,安裝docker簡便的方法是使用docker toolbox游桩,由于Docker引擎的守護(hù)進(jìn)程使用的是Linux的內(nèi)核,所以我們不能夠直接在windows中運行docker引擎耐朴。而是需要在你的機(jī)器上創(chuàng)建和獲得一個Linux虛擬機(jī)借卧,用這個虛擬機(jī)才可以在你的windows系統(tǒng)上運行Docker引擎,docker toolbox這個工具包里面集成了windows環(huán)境下運行docker必要的工具筛峭,當(dāng)然也包括虛擬機(jī)了铐刘。
首先下載docker toolbox
執(zhí)行安裝程序,默認(rèn)情況下影晓,你的計算機(jī)會安裝以下幾個程序- Windows版的Docker客戶端
- Docker Toolbox管理工具和ISO鏡像
- Oracle VM 虛擬機(jī)
- Git 工具
當(dāng)然镰吵,如果你之前已經(jīng)安裝過了Oracle VM 虛擬機(jī) 或者 Git 工具 ,那么你在安裝的時候可以取消勾選這兩個內(nèi)容挂签,之后疤祭,你只需要狂點下一步即可。安裝完畢以后饵婆,找到Docker Quickstart Terminal圖標(biāo)勺馆,雙擊運行,稍等它自己配置一小段時間侨核,你會看到以下的界面
請注意上面畫紅框的地方草穆,這是默認(rèn)分配給你的ip,下面會用到搓译。至此悲柱,docker工具就已經(jīng)安裝好了。 -
安裝Splash
雙擊運行Docker Quickstart Terminal些己,輸入以下內(nèi)容
docker pull scrapinghub/splash
這個命令是拉取Splash鏡像豌鸡,等待一算時間,就可以了段标。下面就是啟動Splash
docker run -p 8050:8050 scrapinghub/splash
這個命令就是在計算機(jī)的8050端口啟動Splash渲染服務(wù)
你會看到以下的圖示內(nèi)容涯冠。
這個時候,打開你的瀏覽器怀樟,輸入
192.168.99.100:8050
你會看到出現(xiàn)了這樣的界面功偿。
你可以在上圖紅色框框的地方輸入任意的網(wǎng)址,點擊后面的Render me! 來查看渲染之后的樣子。 -
安裝scrapy-splash
pip install scrapy-splash
至此械荷,我們的準(zhǔn)備環(huán)節(jié)已經(jīng)全部結(jié)束了共耍。
測試
下面我們就創(chuàng)建一個項目來測試一下,是否真的實現(xiàn)了我們想要的功能吨瞎。
不使用scrapy-splash
為了有一個直觀的對比痹兜,我們首先不使用scrapy- splash,來看一下是什么效果颤诀,我們以淘寶商品信息為例字旭,新建一個名為taobao的項目,在spider.py文件里面輸入下面的內(nèi)容崖叫。
import scrapy
class Spider(scrapy.Spider):
name = 'taobao'
allowed_domains = []
start_urls = ['https://s.taobao.com/search?q=%E7%BE%8E%E9%A3%9F']
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse)
def parse(self,response):
titele = response.xpath('//div[@class="row row-2 title"]/a/text()').extract()
print('這是標(biāo)題:', titele)
我們打印出淘寶美食的名稱遗淳,你會看到這樣的信息:
使用scrapy-splash
下面我們使用scrapy-splash來實現(xiàn)一下,看一下會出現(xiàn)什么樣的效果:
使用scrapy-splash需要一些額外的配置心傀,下面一一列舉:
在settings.py文件中屈暗,你需要額外的填寫下面的一些內(nèi)容
# 渲染服務(wù)的url
SPLASH_URL = 'http://192.168.99.100: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'
在spider.py文件中,填入下面的代碼:
import scrapy
from scrapy_splash import SplashRequest
class Spider(scrapy.Spider):
name = 'taobao'
allowed_domains = []
start_urls = ['https://s.taobao.com/search?q=%E7%BE%8E%E9%A3%9F']
def start_requests(self):
for url in self.start_urls:
yield SplashRequest(url=url, callback=self.parse,
args={'wait':1}, endpoint='render.html')
def parse(self, response):
titele = response.xpath('//div[@class="row row-2 title"]/a/text()').extract()
print('這是標(biāo)題:', titele)
記住不要忘記導(dǎo)入SplashRequest
脂男。
下面就是運行這個項目养叛,記得在docker里面先把splash渲染服務(wù)運行起來。
結(jié)果如下圖所示宰翅。
看的出來弃甥,我們需要的內(nèi)容已經(jīng)打印出來了,內(nèi)容有點亂汁讼,我們可以使用正則來進(jìn)行匹配淆攻,但是這已經(jīng)不是我們這一小節(jié)的主要內(nèi)容了,你可以自己嘗試一下掉缺。