Scrapy框架之 中間件的使用

爬蟲中間件

  • 特點:主要處理蜘蛛(Spider)和下載器(Downloader)之間的請求和響應。可以對蜘蛛生成的請求進行攔截、修改或過濾,也可以對下載器返回給蜘蛛的響應進行處理。
  • 適用場景
    • 請求過濾與修改:當需要根據蜘蛛的某些條件對生成的請求進行過濾或修改時,例如根據蜘蛛的狀態、爬取深度等決定是否發送某個請求,或者修改請求的參數、URL 等。
    • 響應處理:對下載器返回的響應進行統一的預處理,比如檢查響應的狀態碼,根據不同的狀態碼進行不同的處理;或者對響應內容進行初步的清洗、解析,提取一些公共信息供蜘蛛后續使用。
    • 實現分布式爬蟲:在分布式爬蟲場景中,用于協調不同節點之間的爬取任務,例如根據節點的負載情況分配請求,或者對分布式環境下的請求和響應進行特殊處理,確保爬取任務的高效執行。

下載中間件

  • 特點:主要作用于下載器層面,用于處理 HTTP 請求和響應。可以在請求發送到服務器之前對請求進行修改,如添加請求頭、代理設置等;也可以在響應返回后對響應進行處理,如解壓、解碼等操作。
  • 適用場景
    • 請求頭設置:像前面提到的隨機設置User-Agent,以及添加其他自定義的請求頭信息,以偽裝請求來源或滿足網站的特定要求。
    • 代理設置:當需要使用代理服務器來發送請求時,下載中間件是設置代理的合適位置。可以根據不同的條件動態選擇代理服務器,或者對代理的使用進行管理和監控,如處理代理的認證、檢測代理的可用性等。
    • 響應處理:對響應進行一些與數據傳輸和格式相關的處理,例如對壓縮的響應進行解壓(如處理gzip壓縮的響應),對編碼后的響應進行解碼,確保蜘蛛接收到的是正確格式的響應內容。

在實際的爬蟲項目中,通常會同時使用爬蟲中間件和下載中間件。下載中間件用于處理與 HTTP 請求和響應相關的底層操作,而爬蟲中間件則更側重于處理與蜘蛛邏輯相關的請求和響應,兩者結合可以滿足復雜的爬蟲需求。例如,在一個爬取電商網站的項目中,可能會使用下載中間件來設置代理和隨機User-Agent,以避免被網站封禁;同時使用爬蟲中間件來根據商品的分類過濾請求,只爬取特定類別的商品信息,并對響應中的通用信息進行提取和處理。

DOWNLOADER_MIDDLEWARES = {# 其他中間件...'your_project_name.middlewares.ProxyMiddleware': 543,
}

543:這是中間件的優先級,數值越小,中間件越先被執行。

代理中間件

import random
import base64class ProxyMiddleware:def __init__(self):self.proxy_list = ['http://proxy1.example.com:8080','http://proxy2.example.com:8080',]self.username = 'your_username'self.password = 'your_password'def process_request(self, request, spider):proxy = random.choice(self.proxy_list)request.meta['proxy'] = proxy# 添加代理認證信息if self.username and self.password:auth = f'{self.username}:{self.password}'auth_encoded = base64.b64encode(auth.encode('utf-8')).decode('utf-8')request.headers['Proxy-Authorization'] = f'Basic {auth_encoded}'return Nonedef process_exception(self, request, exception, spider):# 處理代理失敗的情況proxy = request.meta.get('proxy')if proxy in self.proxy_list:self.proxy_list.remove(proxy)return request

Scrapy 的下載器中間件中,process_request方法的返回值有特定的含義:

  • return None:這是最常見的返回值。當返回None時,Scrapy 會繼續處理這個請求,也就是會將請求發送給下一個中間件(如果有的話),最終由下載器去執行請求操作。
  • return Response:若返回一個Response對象,Scrapy 會停止處理這個請求的后續中間件,并且直接將這個Response對象作為請求的響應返回給蜘蛛(Spider)進行處理。
  • return Request:要是返回一個新的Request對象,Scrapy 會停止處理當前請求,然后將新的Request對象重新加入到請求隊列中,等待后續處理。

UserAgent中間件

class UserAgentMiddleware:def process_request(self, request, spider):user_agant = random.choice(USER_AGENT_LIST)# 添加請求頭request.headers['User-Agent'] = user_agantreturn None

Selenium中間件

from DrissionPage import Chromiumclass SeleniumMiddleware:def __init__(self, crawler):self.crawler = crawler# 連接 spider_closed 信號和 spider_closed 方法self.crawler.signals.connect(self.spider_closed, signal=signals.spider_closed)self.browser = Chromium()self.tab = self.browser.latest_tab@classmethoddef from_crawler(cls, crawler):return cls(crawler)def process_request(self, request, spider):self.tab.get(request.url)body = self.tab.htmlreturn HtmlResponse(url=request.url, body=body, request=request, encoding='utf-8')def spider_closed(self, spider):self.tab.close()self.browser.quit()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/79368.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79368.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79368.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

供應鏈算法整理(一)--- 銷量預估

在供應鏈管理領域有較多的預估場景,例如送達時長預估、銷量預估、用電量預估。特別的在智能供應鏈領域,銷量和庫存的管理的智能化也依賴銷量預估,因此在本文我們整理了 銷量預估的算法詳細的技術方案。 時間序列預測在最近兩年內發生了巨大的…

第4篇:服務層抽象與復用邏輯

在業務系統復雜度指數級增長的今天,服務層(Service Layer)的合理設計直接影響著系統的可維護性和擴展性。本文將深入剖析 Egg.js 框架中的服務層架構設計,從基礎實現到高級封裝,全方位講解企業級應用的開發實踐。 一、…

Java學習手冊:Spring 數據訪問

一、Spring JDBC JdbcTemplate :Spring JDBC 提供了 JdbcTemplate 類,它簡化了數據庫操作,提供了豐富的 API 來執行數據庫訪問任務。JdbcTemplate 可以自動處理數據庫連接的獲取、釋放,SQL 語句的執行,結果集的處理等…

遞歸、搜索和回溯算法《遞歸》

在之前的優選算法當中我們已經學習了一些基本的算法,那么接下來我們就要來學習算法當中的一大重要章節——遞歸、搜索和回溯算法,其實也就是大家常常聽到的dfs、bfs;其實本質就是遞歸,在學習搜索、回溯等算法的過程當中我們會先來…

Java進階--設計模式

設計模式是一套被反復使用的、多數人知曉的、經過分類編目的、代碼設計經驗的總結。使用設計模式是為了重用代碼、讓代碼更容易被他人理解、保證代碼可靠性。設計模式使代碼編制真正工程化,設計模式是軟件工程的基石,如同大廈的一塊塊磚石一樣&#xff0…

如何禁止AutoCAD這類軟件聯網

推薦二、三方法,對其他軟件影響最小 一、修改Hosts文件 Hosts文件是一個存儲域名與IP地址映射關系的文本文件,通過修改Hosts文件可以將AutoCAD的域名指向本地回環地址(127.0.0.1),從而實現禁止聯網的目的。具體步驟如…

深度學習框架搭建(Vscode/Anaconda/CUDA/Pytroch)

目錄 ??????一 Vscode安裝 二、Anaconda安裝 三、更新顯卡驅動 四、安裝CUDA 五、安裝Pytorch 六、Vscode配置 七、出現的問題匯總 ??????一 Vscode安裝 在 Windows 上安裝 訪問 VS Code 官網 https://code.visualstudio.com/,點擊 "Downl…

結構模式識別理論與方法

我們在前文《模式識別的基本概念與理論體系》中就已經提及“模式分類”。 具體內容看我的CSDN文章:模式識別的基本概念與理論體系-CSDN博客 模式的識別方法主要有統計模式識別方法和結構模式識別方法兩大類。統計模式識別方法提出得較早,理論也較成熟…

12.多邊形的三角剖分 (Triangulation) : Fisk‘s proof

目錄 1.Fisks proof Trangulation Coloring Domination Pigeon-Hold Principle Generation 2.Orthogonal Polygons (正交多邊形) Necessity of floor(n4) Sufficiency by convex Quadrilateralization Generalization 1.Fisks proof Trangulation 引入內對角線&…

面經-計算機網絡——OSI七層模型與TCP/IP四層模型的對比詳解

OSI七層模型與TCP/IP四層模型的對比詳解 一、圖示解析:分層封裝結構 你提供的圖清晰展示了網絡通信中從應用層到物理層的封裝過程,每一層都會對上層的數據加上自己的頭部信息(Header): 應用層: 應用…

React Native本地存儲方案總結

1. AsyncStorage(鍵值對存儲) 適用場景:簡單鍵值對存儲(如用戶配置、Token、緩存數據)。特點:異步、輕量、API 簡單,但性能一般,不推薦存儲大量數據。安裝:npm install …

Arduino程序函數詳解與實際案例

一、Arduino程序的核心架構與函數解析 Arduino程序的核心由兩個函數構成:setup() 和 loop()。這兩個函數是所有Arduino代碼的骨架,它們的合理使用決定了程序的結構和功能。 1.1 setup() 函數:初始化階段 setup() 函數在程序啟動時僅執行一次,用于完成初始化配置,例如設置…

【Unity】使用Socket建立客戶端和服務端并進行通信的例子

Socket服務端: using System; using System.Collections.Generic; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading; public class SocketServer { public static Socket listenSocket;//監聽Socket public static List<Socket>…

Qt connect第五個參數

在 Qt 中&#xff0c;QObject::connect 函數的第五個參數用于指定 連接類型&#xff08;Qt::ConnectionType&#xff09;&#xff0c;它決定了信號與槽之間的通信方式。以下是各枚舉值的詳解及使用場景&#xff1a; 1. Qt::AutoConnection&#xff08;默認值&#xff09; 行為…

【2025域適應科研日報】

本筆記主要為了記錄自己的科研日報&#xff0c;前段時間剛開始想寫的初衷也是為了自己的思考不跑偏&#xff0c;但是有幾天又沒有堅持下來&#xff0c;看到一位學長的文章&#xff0c;發現這種形式還是很有必要的&#xff0c;所以自己也打算堅持記錄下來&#xff0c;由于還正在…

XrayR啟動失敗

公司要用服務器之間進行數據加密&#xff0c;這里用的XrayR 我使用的Centos 7。 我這里使用一鍵腳本安裝后&#xff0c;/etc/XrayR目錄下沒有配置文件。 解決方案 XrayR安裝時&#xff0c;系統沒有unzip工具&#xff0c;也是會安裝失敗的&#xff0c;因為Centos7已經停止維…

鴻蒙文件上傳-從前端到后端詳解,對比jq請求和鴻蒙arkts請求區別,對比new FormData()和鴻蒙arktsrequest.uploadFile

需要權限&#xff1a;ohos.permission.INTERNET 1.nodejs自定義書寫上傳后端接口 傳輸過來的數據放在files?.image下 router.post(/upload,(req, res) > {var form new multiparty.Form();form.uploadDirpublic/images/uploads; //上傳圖片保存的地址(目錄必須存在)fo…

編寫教育網站后端頁面筆記

callbacktitle.html 對應表: 對應的功能: 控制器層數據: 頁面沒有寫內容 chapter.html 對應表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 對應的功能:問題反饋頁面 控制器層數據(控制器類): ChapterQuestionbankTitle c…

日常開發小Tips:后端返回帶顏色的字段給前端

一般來說&#xff0c;展示給用戶的字體格式&#xff0c;都是由前端控制&#xff0c;展現給用戶&#xff1b; 但是當要表示某些字段的數據為異常數據&#xff0c;或者將一些關鍵信息以不同顏色的形式呈現給用戶時&#xff0c;而前端又不好判斷&#xff0c;那么就可以由后端來控…

用spring-boot-maven-plugin打包成單個jar有哪些缺點優化方案

Spring Boot 的 Fat JAR&#xff08;通過 spring-boot-maven-plugin 打包&#xff09;雖然簡化了部署&#xff0c;但也存在一些潛在缺點&#xff0c;需根據場景權衡&#xff1a; 1. 啟動速度較慢 原因&#xff1a; Fat JAR 需要在啟動時解壓并加載所有依賴的 JAR 文件到類路徑…