簡(jiǎn)介
Scrapy是一個(gè)強(qiáng)大的Python爬蟲(chóng)框架,可用于從網(wǎng)站上抓取數(shù)據(jù)。本教程將指導(dǎo)你創(chuàng)建自己的Scrapy爬蟲(chóng)。其中,中間件是其重要特性之一,允許開(kāi)發(fā)者在爬取過(guò)程中攔截和處理請(qǐng)求與響應(yīng),實(shí)現(xiàn)個(gè)性化的爬蟲(chóng)行為。
本篇博客將深入探討Scrapy中間件的關(guān)鍵作用,并以一個(gè)實(shí)例詳細(xì)介紹了自定義的Selenium中間件。我們將從Scrapy的基本設(shè)置開(kāi)始,逐步講解各項(xiàng)常用設(shè)置的作用與配置方法。隨后,重點(diǎn)關(guān)注中間件的重要性,介紹了下載器中間件和Spider中間件的作用,并通過(guò)一個(gè)自定義Selenium中間件的示例,演示了如何利用Selenium實(shí)現(xiàn)頁(yè)面渲染,并在Scrapy中應(yīng)用該中間件。
如果對(duì)您對(duì)scrapy不了解,建議先了解一下:
初識(shí)Scrapy:Python中的網(wǎng)頁(yè)抓取神器 - 掘金 (juejin.cn)
編寫(xiě)settings.py
本文件為scrapy的配置文件.
以下是有關(guān)Scrapy設(shè)置的詳細(xì)介紹:
- BOT_NAME: 設(shè)置爬蟲(chóng)的名稱(chēng)。
- SPIDER_MODULES 和 NEWSPIDER_MODULE: 定義了包含爬蟲(chóng)代碼的模塊路徑。
- ROBOTSTXT_OBEY: 設(shè)置為T(mén)rue時(shí),遵守Robots協(xié)議,爬蟲(chóng)將會(huì)尊重網(wǎng)站的robots.txt文件。
- USER_AGENT: 設(shè)置用戶(hù)代理(User-Agent),模擬瀏覽器訪(fǎng)問(wèn)。
- DOWNLOAD_DELAY 和 CONCURRENT_REQUESTS_PER_IP: 控制下載延遲和每個(gè)IP的并發(fā)請(qǐng)求數(shù),用于避免過(guò)度訪(fǎng)問(wèn)網(wǎng)站。
- COOKIES_ENABLED: 設(shè)置為T(mén)rue時(shí),啟用Cookies。
- DEFAULT_REQUEST_HEADERS: 設(shè)置默認(rèn)的HTTP請(qǐng)求頭。
- ITEM_PIPELINES: 定義項(xiàng)目管道,用于處理爬取的數(shù)據(jù)。
- DOWNLOADER_MIDDLEWARES 和 SPIDER_MIDDLEWARES: 分別定義下載器中間件和Spider中間件,用于在請(qǐng)求和響應(yīng)過(guò)程中執(zhí)行特定操作。
- AUTOTHROTTLE_ENABLED 和 AUTOTHROTTLE_TARGET_CONCURRENCY: 自動(dòng)限速功能,幫助動(dòng)態(tài)調(diào)整請(qǐng)求速率,以防止被封IP。
這些設(shè)置可以在Scrapy項(xiàng)目中的settings.py文件中進(jìn)行配置。例如:
BOT_NAME = 'mybot'
SPIDER_MODULES = ['mybot.spiders']
NEWSPIDER_MODULE = 'mybot.spiders'
ROBOTSTXT_OBEY = True
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
DOWNLOAD_DELAY = 2
CONCURRENT_REQUESTS_PER_IP = 4
COOKIES_ENABLED = False
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
}
ITEM_PIPELINES = {
'mybot.pipelines.MyPipeline': 300,
}
DOWNLOADER_MIDDLEWARES = {
'mybot.middlewares.MyDownloaderMiddleware': 543,
}
SPIDER_MIDDLEWARES = {
'mybot.middlewares.MySpiderMiddleware': 543,
}
AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0
以上是一些常用的Scrapy設(shè)置,可以根據(jù)需要進(jìn)行調(diào)整和擴(kuò)展,以滿(mǎn)足特定爬蟲(chóng)的要求。
其中DEFAULT_REQUEST_HEADERS中設(shè)置默認(rèn)的請(qǐng)求頭只是整個(gè)scrapy的默認(rèn)爬蟲(chóng),可以具體的spider里覆蓋,僅作用于該spider。
例如:
header={
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'Cookie':"*****************************************************"
}
for i in range(1, 2):
key = scenic_namelist[i]
newurl = 'https:/www.***********.com/ticket/list.htm?keyword=' + key + '®ion=&from=mpl_search_suggest'
print(newurl)
yield Request(url=newurl,headers=header)
該操作可用于一個(gè)scrapy項(xiàng)目里有多個(gè)網(wǎng)站的爬蟲(chóng)的情況下,需要設(shè)置不同的請(qǐng)求頭。
可以在生成request時(shí)去添加header,將覆蓋setting里配置的默認(rèn)header。
而文章中PIP管道和各個(gè)中間件之中的配置后邊的數(shù)字是指優(yōu)先度。數(shù)字越小優(yōu)先度越高,若同時(shí)啟動(dòng)多個(gè)中間件,請(qǐng)求將從優(yōu)先度高的中間件->優(yōu)先度低的中間件的順序全部處理一遍。
自定義中間件
Scrapy中間件是在Scrapy引擎處理請(qǐng)求和響應(yīng)的過(guò)程中,允許你在特定的點(diǎn)上自定義處理邏輯的組件。它們?cè)谡麄€(gè)爬取過(guò)程中能夠攔截并處理Scrapy引擎發(fā)送和接收的請(qǐng)求和響應(yīng)。中間件可以用于以下幾個(gè)方面:
- 全局性處理請(qǐng)求和響應(yīng): 中間件可以截取所有請(qǐng)求和響應(yīng),允許你對(duì)它們進(jìn)行全局性的修改,例如添加自定義的請(qǐng)求頭、代理設(shè)置或處理響應(yīng)數(shù)據(jù)等。
- 自定義爬取過(guò)程: 通過(guò)中間件,你可以自定義爬取的邏輯。例如,在請(qǐng)求被發(fā)送之前,可以通過(guò)中間件對(duì)請(qǐng)求進(jìn)行處理,或者在收到響應(yīng)后對(duì)響應(yīng)進(jìn)行預(yù)處理,以適應(yīng)特定需求或網(wǎng)站的要求。
- 處理下載器(Downloader)和Spider之間的通信: 中間件允許你在下載器和Spider之間進(jìn)行通信,并在其中植入處理邏輯。這可以用于在請(qǐng)求下載之前或響應(yīng)到達(dá)Spider之后執(zhí)行額外的操作。
- 實(shí)現(xiàn)和管理代理、用戶(hù)認(rèn)證等: 中間件也常用于處理代理設(shè)置、用戶(hù)認(rèn)證等功能。這些功能可能是整個(gè)爬取過(guò)程中必不可少的一部分。
- 處理異常和錯(cuò)誤: 中間件可以用于捕獲請(qǐng)求過(guò)程中可能出現(xiàn)的異?;蝈e(cuò)誤,以執(zhí)行相應(yīng)的錯(cuò)誤處理邏輯,比如重試請(qǐng)求或記錄錯(cuò)誤日志等。
在Scrapy中,有兩種類(lèi)型的中間件:
- Downloader Middleware:用于處理引擎發(fā)送給下載器的請(qǐng)求和下載器返回的響應(yīng)。
- Spider Middleware:處理引擎發(fā)送給Spider的響應(yīng)和Spider返回的請(qǐng)求。
通過(guò)編寫(xiě)和配置這些中間件,我們可以高度定制Scrapy爬蟲(chóng)的行為,從而更有效地處理網(wǎng)站數(shù)據(jù)并應(yīng)對(duì)不同的場(chǎng)景和需求。
下面我們以一個(gè)自定義的Selenium中間件為例子來(lái)讓大家更加深入的了解中間件。
from selenium import webdriver
from scrapy.http import HtmlResponse
from selenium.common.exceptions import TimeoutException
from scrapy import signals
class SeleniumMiddleware(object):
def __init__(self):
self.driver = webdriver.Chrome(executable_path='path_to_chromedriver')
@classmethod
def from_crawler(cls, crawler):
middleware = cls()
crawler.signals.connect(middleware.spider_closed, signals.spider_closed)
return middleware
def process_request(self, request, spider):
if request.meta.get('selenium'):
try:
self.driver.get(request.url)
body = self.driver.page_source.encode('utf-8')
return HtmlResponse(self.driver.current_url, body=body, encoding='utf-8', request=request)
except TimeoutException:
return HtmlResponse(self.driver.current_url, status=504, request=request)
return None
def spider_closed(self, spider):
self.driver.quit()
這個(gè)中間件示例使用了Selenium庫(kù),它會(huì)在處理Scrapy請(qǐng)求時(shí),檢查請(qǐng)求的元數(shù)據(jù)中是否包含selenium
字段。如果包含,它將使用Selenium打開(kāi)瀏覽器并加載頁(yè)面,然后返回頁(yè)面的HTML內(nèi)容給Spider。request.meta.get也是我們判斷某個(gè)中間件是否啟動(dòng)常用操作。
要使用這個(gè)中間件,需要在settings.py中進(jìn)行相應(yīng)的配置:
DOWNLOADER_MIDDLEWARES = {
'your_project_name.middlewares.SeleniumMiddleware': 543,
}
SELENIUM_BROWSER = 'Chrome' # 設(shè)置瀏覽器類(lèi)型,可以是Chrome/Firefox等
在使用selenium中間件時(shí)有一些需要注意的地方。
如果使用場(chǎng)景是某個(gè)搜索框,若我們使用顯示等待的方式等待結(jié)果元素的動(dòng)態(tài)加載時(shí)要考慮到,若搜索結(jié)果為空的情況,此時(shí)顯示等待就會(huì)報(bào)時(shí)間超限的異常。我們要提前想好處理邏輯。
下面是一個(gè)此種場(chǎng)景下的真實(shí)樣例:
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-756165.html
當(dāng)然我們的生成URL列表的邏輯也可以放在中間件中,在def init(self):中執(zhí)行。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-756165.html
到了這里,關(guān)于探索Scrapy中間件:自定義Selenium中間件實(shí)例解析的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!