Scrapy 工作流程深度解析:引擎驅動的完美協作

一、Scrapy 核心組件全景圖

引擎 Engine
調度器 Scheduler
下載器 Downloader
爬蟲 Spider
管道 Pipeline

Scrapy 是一個引擎驅動的框架,所有組件都通過引擎進行通信,形成閉環的數據流系統。下面我們將詳細解析每個步驟。

二、Scrapy 完整工作流程(引擎為核心)

SpiderEngineSchedulerDownloaderPipeline1. 初始化請求yield Request(url)添加請求到隊列獲取下一個請求返回請求對象發送請求返回Response傳遞Responseyield Item傳遞Item處理完成yield Request(new_url)添加新請求alt[解析出數據][解析出新URL]loop[循環處理]SpiderEngineSchedulerDownloaderPipeline

詳細步驟解析:

  1. 爬蟲發起初始請求

    class BookSpider(scrapy.Spider):name = 'book_spider'start_urls = ['http://books.com/category1']def parse(self, response):# 解析邏輯...
    
    • 爬蟲定義起始URL
    • 引擎自動創建初始Request對象
  2. 引擎 → 調度器

    • 引擎接收Request
    • 將Request放入調度器的隊列中
    • 調度器實現去重(相同URL只存一份)
  3. 引擎 ← 調度器

    • 引擎向調度器請求下一個要處理的Request
    • 調度器返回優先級最高的Request
  4. 引擎 → 下載器

    # 中間件處理流程
    def process_request(self, request, spider):# 添加代理/UA等request.headers['User-Agent'] = random.choice(USER_AGENTS)return request
    
    • 引擎發送Request給下載器
    • 經過下載中間件(可修改請求)
  5. 下載器 → 引擎

    • 下載器獲取網頁內容
    • 封裝成Response對象
    • 通過引擎返回給爬蟲
  6. 引擎 → 爬蟲

    def parse(self, response):# 解析數據yield {'title': response.css('h1::text').get(),'price': response.css('.price::text').get()[1:]}# 提取新鏈接for next_page in response.css('a.next-page'):yield response.follow(next_page, self.parse)
    
    • 引擎將Response傳遞給爬蟲
    • 爬蟲解析響應內容
  7. 爬蟲處理結果 → 引擎

    • 情況1:生成數據Item → 發送給管道
    • 情況2:生成新Request → 發送給調度器
  8. 引擎 → 管道

    class MongoDBPipeline:def process_item(self, item, spider):self.collection.insert_one(dict(item))return item
    
    • 引擎將Item傳遞給管道
    • 管道進行數據清洗、存儲等操作
    • 多個管道按優先級順序處理
  9. 循環繼續

    • 引擎繼續向調度器請求下一個Request
    • 直到調度器隊列為空

三、引擎的核心作用詳解

引擎作為中央控制器,負責:

  1. 組件協調

    • 控制所有組件間的數據流動
    • 決定請求處理的優先級順序
  2. 事件驅動

    # 事件觸發示例
    engine.signals.item_scraped.connect(item_scraped_handler)
    engine.signals.request_scheduled.connect(request_scheduled_handler)
    
  3. 流量控制

    • 通過設置控制并發數
    # settings.py
    CONCURRENT_REQUESTS = 16  # 最大并發請求數
    DOWNLOAD_DELAY = 0.5       # 請求延遲
    
  4. 錯誤處理

    • 捕獲組件異常
    • 重試失敗請求
    RETRY_TIMES = 2
    RETRY_HTTP_CODES = [500, 502, 503]
    

四、開發者關注點:爬蟲與管道

爬蟲開發重點

import scrapyclass NewsSpider(scrapy.Spider):name = 'news'def start_requests(self):# 自定義初始請求yield scrapy.Request('http://news.com/latest', callback=self.parse_headlines,meta={'page': 1})def parse_headlines(self, response):# 解析新聞標題for article in response.css('div.article'):yield {'title': article.css('h2::text').get(),'url': article.css('a::attr(href)').get()}# 分頁處理next_page = response.css('a.next::attr(href)').get()if next_page:yield response.follow(next_page, self.parse_headlines, meta={'page': response.meta['page'] + 1})

管道開發重點

from itemadapter import ItemAdapterclass ValidationPipeline:"""數據驗證管道"""def process_item(self, item, spider):adapter = ItemAdapter(item)if not adapter.get('title'):raise DropItem("缺少標題字段")if len(adapter['title']) > 200:adapter['title'] = adapter['title'][:200] + '...'return itemclass CSVExportPipeline:"""CSV導出管道"""def open_spider(self, spider):self.file = open('output.csv', 'w', encoding='utf-8')self.writer = csv.DictWriter(self.file, fieldnames=['title', 'url'])self.writer.writeheader()def close_spider(self, spider):self.file.close()def process_item(self, item, spider):self.writer.writerow(item)return item

五、實際工作流程示例:圖書抓取案例

起始URL
添加請求
返回請求
發送請求
獲取網頁
返回響應
解析數據
數據Item
新URL
Spider
引擎
調度器
下載器
管道
  1. 爬蟲定義起始URL:http://books.com/fiction
  2. 引擎將請求加入調度器隊列
  3. 調度器返回請求給引擎
  4. 引擎發送請求給下載器
  5. 下載器獲取HTML返回給引擎
  6. 引擎將響應傳遞給爬蟲
  7. 爬蟲解析出:
    • 10本圖書數據(發送到管道)
    • 下一頁鏈接(發送到調度器)
  8. 管道處理圖書數據(存儲到數據庫)

六、常見誤區澄清

  1. 誤區:爬蟲直接與下載器通信
    正確:所有通信必須通過引擎

  2. 誤區:調度器只做簡單排隊
    正確:調度器實現復雜功能:

    • 請求去重
    • 優先級管理
    • 并發控制
  3. 誤區:管道只用于數據存儲
    正確:管道可執行多種操作:

    • 數據清洗
    • 去重處理
    • 格式轉換
    • 數據驗證

七、高級工作流程:中間件介入

請求
請求
響應
響應
引擎
下載中間件
下載器

中間件的作用點:

  1. 請求發出前:修改請求頭、設置代理

    class ProxyMiddleware:def process_request(self, request, spider):request.meta['proxy'] = 'http://proxy.com:8080'
    
  2. 響應返回后:處理異常、修改響應內容

    class RetryMiddleware:def process_response(self, request, response, spider):if response.status == 503:new_request = request.copy()return new_request  # 自動重試return response
    
  3. 數據處理時:爬蟲中間件可修改Item/Request

    class ItemProcessorMiddleware:def process_spider_output(self, response, result, spider):for item in result:if isinstance(item, dict):item['source'] = spider.nameyield item
    

八、最佳實踐建議

  1. 保持爬蟲簡潔:僅關注解析邏輯

  2. 管道職責分離:每個管道只做一件事

  3. 善用中間件:處理通用邏輯

  4. 監控引擎事件:了解系統狀態

    from scrapy import signalsclass StatsExtension:def __init__(self, stats):self.stats = stats@classmethoddef from_crawler(cls, crawler):ext = cls(crawler.stats)crawler.signals.connect(ext.request_scheduled, signal=signals.request_scheduled)return ext
    
  5. 合理配置設置

    # settings.py
    CONCURRENT_REQUESTS = 32  # 根據網絡條件調整
    DOWNLOAD_TIMEOUT = 30     # 超時設置
    RETRY_TIMES = 2           # 失敗重試
    

九、總結:Scrapy 工作流程精髓

  1. 引擎中心化:所有組件通過引擎通信
  2. 數據驅動:Request/Item 在組件間流動
  3. 閉環處理:從請求到存儲的完整生命周期
  4. 可擴展架構:通過中間件靈活擴展功能

理解 Scrapy 的工作流程,關鍵在于把握引擎的核心調度作用組件間的數據流向。這種設計使得 Scrapy 能夠高效處理大規模數據采集任務,同時保持代碼的模塊化和可維護性。

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

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

相關文章

PCIe Base Specification解析(七)

文章目錄3.6 Data Integrity Mechansisms3.6.1 Introduction3.6.2 LCRC, Sequence Number, and Retry Management (TLP Transmitter)3.6.2.1 LCRC and Sequence Number Rules (TLP Transmitter)3.6.2.2 Handling of Received DLLPs3.6.3 LCRC and Sequence Number (TLP Receive…

Windows 11 使用Windows Hello使用人臉識別登錄失敗,重新錄入人臉識別輸入PIN后報Windows Hello安裝程序白屏無響應的問題解決

Windows 11 使用Windows Hello使用人臉識別登錄失敗,重新錄入人臉識別輸入PIN后報Windows Hello安裝程序白屏無響應的問題解決:遇到此種情況時:1、在“開始”右鍵——設置——賬號——登錄選項2、需要在PIN這里先進行刪除此登錄選項&#xff…

qq scheme

QQ intent scheme跳轉 1.跳轉指定說說(root) 2.跳轉指定說說(非root) 3. 跳轉聊天框 4. 跳轉用戶主頁 5. 跳轉加群 6. 跳轉指定用戶空間 1.跳轉指定說說(root) 該方法需root權限 app.startActivity({className: "com.qzone.reborn.base.QZoneTransparentShellActivi…

C語言基礎_隨機數、數組、函數、指針

0、隨機數: 要用C語言產生隨機數,首先在預處理程序部分要引入stdlib.h頭文件,然后就可以用rand()在后續程序中生成隨機數了。如果不設置隨機數種子srand(),后面生成的隨機數序列就是以41開頭的一個固定序列,因此一般以…

PHP?ORT擴展構建純PHP機器學習的推薦系統

結合 PHP?ORT 構建推薦系統的核心思想是:使用 ONNX 格式的機器學習模型,在 PHP 中本地執行推理,實時給出推薦結果。下面是一個完整的架構設計與實現路徑,適合你快速上手。🎯 場景目標 你想在一個 PHP 網站中實現推薦功…

PromptPilot搭配Doubao-seed-1.6:定制你需要的AI提示prompt

目錄 一、PromptPilot 二、基于產品評價的用戶情感分析 2.1 使用PromptPiolt工具進行提示詞生成 2.2 基于prompt的模型調試 2.3 基于prompt的批量數據測評 2.4 基于多輪對話的prompt測試 如今,我們正身處一個 AI 技術飛速迭代的時代。人工智能早已不再是實驗室…

MSPM0開發學習筆記:二維云臺結合openmv實現小球追蹤

文章目錄前言一、硬件選擇二、原理介紹(UART)三、硬件連線三、軟件代碼1、視覺部分代碼(Openart)2、控制部分代碼(MSPM0)(1) UART部分(2) 計算函數部分&#…

【CTF-WEB-SQL】SQL注入基本流程(sql-labs的Less11)(用burp抓取post然后用sqlmap盲注)

題目 從第11less開始,就是POST表單了burp抓取數據包將抓取到的數據包存放到桌面,保存為post.txt數據包內容如下:POST /Less-11/ HTTP/1.1 Host: 223.112.39.132:44537 Content-Length: 39 Cache-Control: max-age0 Accept-Language: zh-CN,zh…

WPF 與 Winform :Windows 桌面開發該用誰?

WPF 與 Winform :Windows 桌面開發該用誰? 一、 WPF 與 Winform的概念 WPF:顏值與實力并存的 “后起之秀” Winform:簡單直接的 “老前輩” 二、WPF 與 Winform 的核心差異 1. 設計理念:分離 vs 耦合 2. 布局系統:靈活適配 vs 固定坐標 3. 視覺效果:絢麗動畫 vs 樸素原生…

【Git學習】入門與基礎

目錄 Git的安裝 Git 配置用戶信息 Git 初始化本地倉庫 Git 工作區、暫存區和版本庫 Git 跟蹤文件 Git 修改文件 Git 刪除文件 Git 撤銷本地文件的修改 Git 取消暫存 Git 跳過暫存區 Git 版本回退 Git 撤銷提交 Git 設置忽略文件 Git 比較文件差異 Git 代碼托管平臺…

idea添加gitlab訪問令牌

1.按下圖所示順序操作gitlab,獲取到對應的token;2.填寫對應的gitlab地址和第一步獲取的token

人工智能領域、圖歐科技、IMYAI智能助手2025年5月更新月報

2025年5月IMYAI平臺技術動態與模型更新綜述 摘要: 本文整理了2025年5月期間IMYAI平臺發布的主要技術更新、新模型上線信息及功能調整公告,涵蓋DeepSeek、Gemini、Claude、即夢、Suno等模型動態及平臺功能優化。 正文: 一、 模型更新與上線Dee…

機器人權利:真實還是虛幻,機器人權利研究如何可能,道德權利與法律權利

一、機器人權利:真實還是虛幻?機器人權利的討論源于技術進步對傳統法律與倫理體系的沖擊,其真實性取決于技術發展階段與社會接受度的互動。當前,機器人權利仍呈現“虛幻與真實交織”的特征:技術基礎:從工具…

通信小白產品學習碎片01

1. 云中繼(Cloud Media Relay) 運營商在Volte/Vonr場景中引入的核心網關鍵功能,用于優化媒體流的傳輸路徑,解決跨運營商、跨地域通信時的網絡繞行問題。 傳統:A終端—>A核心網—>跨網互聯點—>B核心網—>…

?CVPR2025 3D 生成新框架|Kiss3DGen 讓 2D 擴散模型玩轉 3D 資產生成

?CVPR 3D 生成新框架|Kiss3DGen 讓 2D 擴散模型玩轉 3D 資產生成 📄論文題目:Kiss3DGen: Repurposing Image Diffusion Models for 3D Asset Generation ??作者及機構:Jiantao Lin、Xin Yang、Meixi Chen 等(HKUST …

HTTP基本結構

目錄前言1. 概念2. HTTP基本格式2.1 抓包原理2.2 抓包軟件使用2.3 抓包結果3. HTTP請求3.1 URL3.2 方法3.3 版本號3.4 HTTP報頭3.4 正文部分4. HTTP響應4.1 HTTP狀態碼4.2 其他部分總結前言 本篇文章介紹HTTP的基本結構。 1. 概念 HTTP全稱為超文本傳輸協議,是一…

CVPR優秀論文 | DashGaussian:在200秒內優化三維高斯點繪制

本文選自gongzhonghao【圖靈學術SCI論文輔導】關注我們,掌握更多頂會頂刊發文資訊1.導讀1.1 論文基本信息論文標題:DashGaussian: Optimizing 3D Gaussian Splatting in 200 Seconds作者:Youyu Chen、Junjun Jiang、Kui Jiang、Xiao Tang、Zh…

知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式

知識蒸餾 - 基于KL散度的知識蒸餾 HelloWorld 示例 采用PyTorch 內置函數F.kl_div的實現方式 flyfish kl_div 是 Kullback-Leibler Divergence的英文縮寫。 其中,KL 對應提出該概念的兩位學者(Kullback 和 Leibler)的姓氏首字母“div”是 div…

C語言基礎_補充知識、數據類型轉換、選擇結構

0、補充知識: 原碼、反碼、補碼的知識: 計算機中原碼轉補碼,正數不變,負數是符號位不變,其余各位取反碼加一。負數的補碼轉原碼應該是補碼減一然后再取反,為什么負數的補碼轉原碼是補碼取反然后再加一&…

ubuntu自動重啟BUG排查指南

當 Ubuntu 系統意外重啟時,排查原因需要從系統日志、硬件狀態和定時任務等多個方面入手。 示例:通過日志檢查重啟原因 last -x | head | tac 此命令顯示最近的關機和重啟記錄。如果記錄中包含 shutdown 或 crash,則可能是人為操作或系統故障導…