国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

探索Scrapy中間件:自定義Selenium中間件實(shí)例解析

這篇具有很好參考價(jià)值的文章主要介紹了探索Scrapy中間件:自定義Selenium中間件實(shí)例解析。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

簡(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ì)介紹:

  1. BOT_NAME: 設(shè)置爬蟲(chóng)的名稱(chēng)。
  2. SPIDER_MODULESNEWSPIDER_MODULE: 定義了包含爬蟲(chóng)代碼的模塊路徑。
  3. ROBOTSTXT_OBEY: 設(shè)置為T(mén)rue時(shí),遵守Robots協(xié)議,爬蟲(chóng)將會(huì)尊重網(wǎng)站的robots.txt文件。
  4. USER_AGENT: 設(shè)置用戶(hù)代理(User-Agent),模擬瀏覽器訪(fǎng)問(wèn)。
  5. DOWNLOAD_DELAYCONCURRENT_REQUESTS_PER_IP: 控制下載延遲和每個(gè)IP的并發(fā)請(qǐng)求數(shù),用于避免過(guò)度訪(fǎng)問(wèn)網(wǎng)站。
  6. COOKIES_ENABLED: 設(shè)置為T(mén)rue時(shí),啟用Cookies。
  7. DEFAULT_REQUEST_HEADERS: 設(shè)置默認(rèn)的HTTP請(qǐng)求頭。
  8. ITEM_PIPELINES: 定義項(xiàng)目管道,用于處理爬取的數(shù)據(jù)。
  9. DOWNLOADER_MIDDLEWARESSPIDER_MIDDLEWARES: 分別定義下載器中間件和Spider中間件,用于在請(qǐng)求和響應(yīng)過(guò)程中執(zhí)行特定操作。
  10. AUTOTHROTTLE_ENABLEDAUTOTHROTTLE_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 + '&region=&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è)方面:

  1. 全局性處理請(qǐng)求和響應(yīng): 中間件可以截取所有請(qǐng)求和響應(yīng),允許你對(duì)它們進(jìn)行全局性的修改,例如添加自定義的請(qǐng)求頭、代理設(shè)置或處理響應(yīng)數(shù)據(jù)等。
  2. 自定義爬取過(guò)程: 通過(guò)中間件,你可以自定義爬取的邏輯。例如,在請(qǐng)求被發(fā)送之前,可以通過(guò)中間件對(duì)請(qǐng)求進(jìn)行處理,或者在收到響應(yīng)后對(duì)響應(yīng)進(jìn)行預(yù)處理,以適應(yīng)特定需求或網(wǎng)站的要求。
  3. 處理下載器(Downloader)和Spider之間的通信: 中間件允許你在下載器和Spider之間進(jìn)行通信,并在其中植入處理邏輯。這可以用于在請(qǐng)求下載之前或響應(yīng)到達(dá)Spider之后執(zhí)行額外的操作。
  4. 實(shí)現(xiàn)和管理代理、用戶(hù)認(rèn)證等: 中間件也常用于處理代理設(shè)置、用戶(hù)認(rèn)證等功能。這些功能可能是整個(gè)爬取過(guò)程中必不可少的一部分。
  5. 處理異常和錯(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í)樣例:

探索Scrapy中間件:自定義Selenium中間件實(shí)例解析,scrapy,selenium,爬蟲(chóng)

當(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【ASP.NET Core 基礎(chǔ)知識(shí)】--中間件--創(chuàng)建自定義中間件

    一、為什么需要自定義中間件 自定義中間件在ASP.NET Core中的應(yīng)用主要有以下幾個(gè)原因: 滿(mǎn)足特定需求: 默認(rèn)情況下,ASP.NET Core提供了許多內(nèi)置的中間件來(lái)處理常見(jiàn)的任務(wù),如身份驗(yàn)證、授權(quán)、靜態(tài)文件服務(wù)等。然而,某些項(xiàng)目可能有特定的需求,需要定制化的處理流程,這

    2024年01月17日
    瀏覽(100)
  • 中間件定義

    中間件定義

    中間件(middleware)是基礎(chǔ)軟件的一大類(lèi),屬于可復(fù)用的軟件范疇。中間件在操作系統(tǒng)軟件,網(wǎng)絡(luò)和數(shù)據(jù)庫(kù)之上,應(yīng)用軟件之下,總的作用是為處于自己上層的應(yīng)用軟件提供運(yùn)行于開(kāi)發(fā)的環(huán)境,幫助用戶(hù)靈活、高效的開(kāi)發(fā)和集成復(fù)雜的應(yīng)用軟件。 ? IDC對(duì)中間件的定義為:中間件是

    2024年02月09日
    瀏覽(20)
  • rust actix-web定義中間件(middleware)記錄接口耗時(shí)(接口耗時(shí)中間件和鑒權(quán)中間件)

    rust actix-web定義中間件(middleware)記錄接口耗時(shí)(接口耗時(shí)中間件和鑒權(quán)中間件)

    actix-web的官網(wǎng)關(guān)于中間件的介紹如下 https://actix.rs/docs/middleware/ 這里使用的是最新版的actix-web,舊版本的可能接口不太一樣 我們添加的中間件能干什么?我們用一段代碼來(lái)觀察一下 下面是官方提供的中間件的定義方式之一,我們可以看到閉包里面有兩個(gè)參數(shù) req 和 srv 其中

    2024年02月11日
    瀏覽(25)
  • django校驗(yàn)token自定義中間件

    確保將 ‘path.to.TokenValidationMiddleware’ 替換為你中間件的實(shí)際路徑。中間件會(huì)按照在列表中的順序順序執(zhí)行,所以確保它在其他可能影響請(qǐng)求處理的中間件之前或之后執(zhí)行,具體取決于你的需求。 這是一個(gè)簡(jiǎn)單的例子,實(shí)際上,你可能需要使用更復(fù)雜的 Token 校驗(yàn)邏輯,例如使

    2024年01月21日
    瀏覽(21)
  • 基于.NET6的自定義中間件

    基于.NET6的自定義中間件

    中間件基礎(chǔ): 在.net6.0在請(qǐng)求在響應(yīng)給請(qǐng)求者之前會(huì)通過(guò)請(qǐng)求管道再處理服務(wù)端的邏輯然后再響應(yīng)給請(qǐng)求者,而請(qǐng)求管道則是由一系列中間件組成的有點(diǎn)類(lèi)似于過(guò)濾器,為了更直觀的了解,我們請(qǐng)看下圖: ?它可以決定是否將請(qǐng)求傳遞給請(qǐng)求管道中下一個(gè)中間件,也可以處理下一個(gè)中

    2023年04月27日
    瀏覽(23)
  • laravel 中間件跨域自定義封裝

    laravel 跨域cors中間件封裝 有需要的可以參考

    2024年01月22日
    瀏覽(17)
  • express學(xué)習(xí)筆記5 - 自定義路由異常處理中間件

    express學(xué)習(xí)筆記5 - 自定義路由異常處理中間件

    修改router/index.js,添加異常處理中間件 完整代碼 創(chuàng)建 utils/constant:(為了方便后期統(tǒng)一維護(hù),單獨(dú)拉出來(lái)定義) 然后刷新http://localhost:8000/user ?這就完成了

    2024年02月14日
    瀏覽(31)
  • gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題

    gin自定義中間件解決requestBody不可重復(fù)讀問(wèn)題

    先直接上代碼 注意,上面的中間件,需要在第一個(gè)執(zhí)行。 在gin中,context.Request.Body 是一個(gè)io.ReadCloser的接口,如下圖 查看io.ReadCloser接口定義 我們發(fā)現(xiàn)io.ReaderCloser接口的本質(zhì)就是 Read(p []byte) (n int, err error) 和 Close() error 的組合。 所以我們只需要自己編寫(xiě)實(shí)現(xiàn) Read(p []byte) (n in

    2024年02月01日
    瀏覽(18)
  • Golang web 項(xiàng)目中實(shí)現(xiàn)自定義 recovery 中間件

    在 Golang 的 Web 項(xiàng)目中,自定義 recovery 中間件是一種常見(jiàn)的做法,用于捕獲并處理應(yīng)用程序的運(yùn)行時(shí)錯(cuò)誤,以避免整個(gè)應(yīng)用程序崩潰并返回對(duì)應(yīng)格式的響應(yīng)數(shù)據(jù)。 很多三方 web 框架(例如 gin、echo)都提供了官方實(shí)現(xiàn)的?recovery 中間件,但是官方實(shí)現(xiàn)的中間件并不一定能滿(mǎn)足自

    2024年02月09日
    瀏覽(27)
  • 第5章 分布式緩存中間件的配置及其調(diào)用定義

    1 分布式緩存中間件的配置定義 1.1 Core.Configuration. CacheConfig namespace Core . Configuration { ? ? /// summary ? ? /// 【緩存配置 -- 類(lèi)】 ? ? /// remarks ? ? /// 摘要: ? ? /// ? ? 通過(guò)該類(lèi)中的屬性成員實(shí)例對(duì) “appsettings.json” 文件中的 1 個(gè)指定緩存項(xiàng) ( 鍵 / 值對(duì) ) 在內(nèi)存或指定分布式軟

    2024年02月03日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包