1、爬蟲項目單獨使用scrpay框架的不足
當前網(wǎng)站普遍采用了javascript 動態(tài)頁面,特別是vue與react的普及,使用scrapy框架定位動態(tài)網(wǎng)頁元素十分困難,而selenium是最流行的瀏覽器自動化工具,可以模擬瀏覽器來操作網(wǎng)頁,解析元素,執(zhí)行動作,可以處理動態(tài)網(wǎng)頁,使用selenium處理1個大型網(wǎng)站,速度很慢,而且非常耗資源,是否可以將selenium集成到scrapy框架中,發(fā)揮二者的優(yōu)點呢?
Scrapy集成selenium的關鍵是,將其放入DownloaderMiddleware. 如下面的scrapy原理圖,可以在Downloader的中間件方法中,修改request與response對象,再返回給scrapy
可以自定義downloader middleware 中間件類來集成selenium,當然實現(xiàn)selenium的所有特性,工作量比較大。因此,我們推薦使用scrapy-selenium第3方為來集成。
2. 搭建 scrapy-selenium 開發(fā)環(huán)境
2.1 安裝scrapy-selenium庫
pip install scrapy-selenium
python 版本應大于3.6,
2.2 安裝瀏覽器驅(qū)動
本機上應該安裝有1個selenium支持的瀏覽器,如chrom, firefox, edge等
再安裝對應瀏覽器、版本的webdrive
下載 downloaded chromedriver.exe 之后,放在項目根目錄下,或者加入系統(tǒng)環(huán)境變量。
2.3 集成selenium到scrapy 項目
項目結(jié)構(gòu)如下
├── scrapy.cfg
├── chromedriver.exe ## <-- Here
└── myproject
├── __init__.py
├── items.py
├── middlewares.py
├── pipelines.py
├── settings.py
└── spiders
└── __init__.py
進入項目文件夾,更新settings.py
## settings.py
# for Chrome driver
from shutil import which
SELENIUM_DRIVER_NAME = 'chrome'
SELENIUM_DRIVER_EXECUTABLE_PATH = which('chromedriver')
SELENIUM_DRIVER_ARGUMENTS=['--headless']
DOWNLOADER_MIDDLEWARES = {
'scrapy_selenium.SeleniumMiddleware': 800
}
3. 在spider中使用selenium來解析網(wǎng)頁
在spider中,用SeleniumRequest 類來代替selenium內(nèi)置的Request類。
## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequest
class QuotesSpider(scrapy.Spider):
name = 'quotes'
def start_requests(self):
url = 'https://quotes.toscrape.com/js/'
yield SeleniumRequest(url=url, callback=self.parse)
def parse(self, response):
quote_item = QuoteItem()
for quote in response.css('div.quote'):
quote_item['text'] = quote.css('span.text::text').get()
quote_item['author'] = quote.css('small.author::text').get()
quote_item['tags'] = quote.css('div.tags a.tag::text').getall()
yield quote_item
scrapy 會自動調(diào)用selenium來解析response回傳的頁面元素,這里selenium 使用的是headless chrom瀏覽器。
4. 使用selenium 的特性來爬取數(shù)據(jù)
可以使用selenium的特性,如
? 網(wǎng)頁元素等待
? 模擬點擊等操作
? 屏幕截圖
等。
(1)Waits 功能
動態(tài)網(wǎng)頁定位不到元素,通常是由于組件加載順序,ajax 異步請求更新等造成的,而selenium提供了 wait_until的功能來處理實現(xiàn)對動態(tài)網(wǎng)頁元素的定位。
所有request 等待10秒
def start_requests(self):
url = 'https://quotes.toscrape.com/js/'
yield SeleniumRequest(url=url, callback=self.parse, wait_time=10)
使用selenium wait_until條件等待功能文章來源:http://www.zghlxwxcb.cn/news/detail-550660.html
## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequest
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
class QuotesSpider(scrapy.Spider):
name = 'quotes'
def start_requests(self):
url = 'https://quotes.toscrape.com/js/'
yield SeleniumRequest(
url=url,
callback=self.parse,
wait_time=10,
wait_until=EC.element_to_be_clickable((By.CLASS_NAME, 'quote'))
)
def parse(self, response):
quote_item = QuoteItem()
for quote in response.selector.css('div.quote'):
quote_item['text'] = quote.css('span.text::text').get()
quote_item['author'] = quote.css('small.author::text').get()
quote_item['tags'] = quote.css('div.tags a.tag::text').getall()
yield quote_item
(2) 點擊按鈕
比如,可以配置selenium執(zhí)行 a 標簽的點擊事件文章來源地址http://www.zghlxwxcb.cn/news/detail-550660.html
lass QuotesSpider(scrapy.Spider):
name = 'quotes'
def start_requests(self):
url = 'https://quotes.toscrape.com/js/'
yield SeleniumRequest(
url=url,
callback=self.parse,
script="document.querySelector('.pager .next>a').click()",
)
(3)頁面截圖
## spider.py
import scrapy
from quotes_js_scraper.items import QuoteItem
from scrapy_selenium import SeleniumRequest
class QuotesSpider(scrapy.Spider):
name = 'quotes'
def start_requests(self):
url = 'https://quotes.toscrape.com/js/'
yield SeleniumRequest(
url=url,
callback=self.parse,
screenshot=True
)
def parse(self, response):
with open('image.png', 'wb') as image_file:
image_file.write(response.meta['screenshot'])
到了這里,關于Scrapy爬蟲框架集成Selenium來解析動態(tài)網(wǎng)頁的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!