聚焦Python分布式爬蟲必學框架Scrapy打造搜索引擎(一)

Scrapy綜述

Scrapy總體架構?

Scrapy架構圖(綠線是數據流向)

適用于海量靜態頁面的數據下載?

  • Scrapy Engine(引擎): 負責SpiderItemPipelineDownloaderScheduler中間的通訊,信號、數據傳遞等。

  • Scheduler(調度器): 它負責接受引擎發送過來的Request請求,并按照一定的方式進行整理排列,入隊,當引擎需要時,交還給引擎

  • Downloader(下載器):負責下載Scrapy Engine(引擎)發送的所有Requests請求,并將其獲取到的Responses交還給Scrapy Engine(引擎),由引擎交給Spider來處理,

  • Spider(爬蟲):它負責處理所有Responses,從中分析提取數據,獲取Item字段需要的數據,并將需要跟進的URL提交給引擎,再次進入Scheduler(調度器)

  • Item Pipeline(管道):它負責處理Spider中獲取到的Item,并進行進行后期處理(詳細分析、過濾、存儲等)的地方.

  • Downloader Middlewares(下載中間件):你可以當作是一個可以自定義擴展下載功能的組件。

  • Spider Middlewares(Spider中間件):你可以理解為是一個可以自定擴展和操作引擎Spider中間通信的功能組件(比如進入Spider的Responses;和從Spider出去的Requests)

Scrapy的運作流程

代碼寫好,程序開始運行...

  1. 引擎:Hi!Spider, 你要處理哪一個網站?

  2. Spider:老大要我處理xxxx.com。

  3. 引擎:你把第一個需要處理的URL給我吧。

  4. Spider:給你,第一個URL是xxxxxxx.com。

  5. 引擎:Hi!調度器,我這有request請求你幫我排序入隊一下。

  6. 調度器:好的,正在處理你等一下。

  7. 引擎:Hi!調度器,把你處理好的request請求給我。

  8. 調度器:給你,這是我處理好的request

  9. 引擎:Hi!下載器,你按照老大的下載中間件的設置幫我下載一下這個request請求

  10. 下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然后引擎告訴調度器,這個request下載失敗了,你記錄一下,我們待會兒再下載)

  11. 引擎:Hi!Spider,這是下載好的東西,并且已經按照老大的下載中間件處理過了,你自己處理一下(注意!這兒responses默認是交給def parse()這個函數處理的)

  12. Spider:(處理完畢數據之后對于需要跟進的URL),Hi!引擎,我這里有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item數據。

  13. 引擎:Hi !管道?我這兒有個item你幫我處理一下!調度器!這是需要跟進URL你幫我處理下。然后從第四步開始循環,直到獲取完老大需要全部信息。

  14. 管道``調度器:好的,現在就做!

注意!只有當調度器中不存在任何request了,整個程序才會停止,(也就是說,對于下載失敗的URL,Scrapy也會重新下載。)

Scrapy項目結構

Scrapy ? ? ? ? ? 2.11.2

Python? ? ? ? ? ?3.10.x

scrapy startproject tencent_job

scrapy.cfg :項目的配置文件

tencent_job/ :項目的Python模塊,將會從這里引用代碼

tencent_job/items.py :項目的目標文件

tencent_job/pipelines.py :項目的管道文件

tencent_job/settings.py :項目的設置文件

tencent_job/spiders/ :存儲爬蟲代碼目錄

核心概念

Spider

Spider類定義了如何爬取某個(或某些)網站。包括了爬取的動作(例如:是否跟進鏈接)以及如何從網頁的內容中提取結構化數據(爬取item)。 換句話說,Spider就是您定義爬取的動作及分析某個網頁(或者是有些網頁)的地方。

class scrapy.Spider是最基本的類,所有編寫的爬蟲必須繼承這個類。

主要用到的函數及調用順序為:

__init__()?: 初始化爬蟲名字和start_urls列表

start_requests() 調用make_requests_from url():生成Requests對象交給Scrapy下載并返回response

parse()?: 解析response,并返回Item或Requests(需指定回調函數)。Item傳給Item pipline持久化 , 而Requests交由Scrapy下載,并由指定的回調函數處理(默認parse()),一直進行循環,直到處理完所有的數據為止。

CrawlSpiders

CrawlSpider類定義了一些規則(rule)來提供跟進link的方便的機制,從爬取的網頁中獲取link并繼續爬取的工作更適合。

通過下面的命令可以快速創建 CrawlSpider模板 的代碼:

scrapy genspider -t crawl tencent tencent.com

Item Pipeline

當Item在Spider中被收集之后,它將會被傳遞到Item Pipeline,這些Item Pipeline組件按定義的順序處理Item。

每個Item Pipeline都是實現了簡單方法的Python類,比如決定此Item是丟棄而存儲。以下是item pipeline的一些典型應用:

  • 驗證爬取的數據(檢查item包含某些字段,比如說name字段)
  • 查重(并丟棄)
  • 將爬取結果保存到文件或者數據庫中

process_request(self, request, spider)

  • 當每個request通過下載中間件時,該方法被調用。

  • process_request() 必須返回以下其中之一:一個 None 、一個 Response 對象、一個 Request 對象或 raise IgnoreRequest:

    • 如果其返回 None ,Scrapy將繼續處理該request,執行其他的中間件的相應方法,直到合適的下載器處理函數(download handler)被調用, 該request被執行(其response被下載)。

    • 如果其返回 Response 對象,Scrapy將不會調用 任何 其他的 process_request() 或 process_exception() 方法,或相應地下載函數; 其將返回該response。 已安裝的中間件的 process_response() 方法則會在每個response返回時被調用。

    • 如果其返回 Request 對象,Scrapy則停止調用 process_request方法并重新調度返回的request。當新返回的request被執行后, 相應地中間件鏈將會根據下載的response被調用。

    • 如果其raise一個 IgnoreRequest 異常,則安裝的下載中間件的 process_exception() 方法會被調用。如果沒有任何一個方法處理該異常, 則request的errback(Request.errback)方法會被調用。如果沒有代碼處理拋出的異常, 則該異常被忽略且不記錄(不同于其他異常那樣)。

  • 參數:

    • request (Request 對象)?– 處理的request
    • spider (Spider 對象)?– 該request對應的spider

process_response(self, request, response, spider)

當下載器完成http請求,傳遞響應給引擎的時候調用

  • process_request() 必須返回以下其中之一: 返回一個 Response 對象、 返回一個 Request 對象或raise一個 IgnoreRequest 異常。

    • 如果其返回一個 Response (可以與傳入的response相同,也可以是全新的對象), 該response會被在鏈中的其他中間件的 process_response() 方法處理。

    • 如果其返回一個 Request 對象,則中間件鏈停止, 返回的request會被重新調度下載。處理類似于 process_request() 返回request所做的那樣。

    • 如果其拋出一個 IgnoreRequest 異常,則調用request的errback(Request.errback)。 如果沒有代碼處理拋出的異常,則該異常被忽略且不記錄(不同于其他異常那樣)。

  • 參數:

    • request (Request 對象)?– response所對應的request
    • response (Response 對象)?– 被處理的response
    • spider (Spider 對象)?– response所對應的spider

防止爬蟲被反主要策略

有些些網站使用特定的不同程度的復雜性規則防止爬蟲訪問,繞過這些規則是困難和復雜的,有時可能需要特殊的基礎設施

  • 動態設置User-Agent(隨機切換User-Agent,模擬不同用戶的瀏覽器信息)

  • 禁用Cookies(也就是不啟用cookies middleware,不向Server發送cookies,有些網站通過cookie的使用發現爬蟲行為)

    • 可以通過COOKIES_ENABLED?控制 CookiesMiddleware 開啟或關閉
  • 設置延遲下載(防止訪問過于頻繁,設置為 2秒 或更高)

  • Google Cache 和 Baidu Cache:如果可能的話,使用谷歌/百度等搜索引擎服務器頁面緩存獲取頁面數據。

  • 使用IP地址池:VPN和代理IP,現在大部分網站都是根據IP來ban的。

  • 使用?Crawlera(專用于爬蟲的代理組件),正確配置和設置下載中間件后,項目所有的request都是通過crawlera發出。

      DOWNLOADER_MIDDLEWARES = {'scrapy_crawlera.CrawleraMiddleware': 600}CRAWLERA_ENABLED = TrueCRAWLERA_USER = '注冊/購買的UserKey'CRAWLERA_PASS = '注冊/購買的Password'

設置下載中間件

下載中間件(Downloader Middlewares)在Scrapy架構中扮演著至關重要的角色,主要功能是在Scrapy的請求(Request)和響應(Response)處理過程中提供一個可插拔的鉤子系統。這允許開發者在請求發送到服務器以及服務器返回響應的過程中插入自定義的處理邏輯。?

下載中間件是處于引擎(crawler.engine)和下載器(crawler.engine.download())之間的一層組件,可以有多個下載中間件被加載運行。

  1. 當引擎傳遞請求給下載器的過程中,下載中間件可以對請求進行處理 (例如增加http header信息,增加proxy信息等);

  2. 在下載器完成http請求,傳遞響應給引擎的過程中, 下載中間件可以對響應進行處理(例如進行gzip的解壓等)

下載中間件在Scrapy項目的settings.py文件中配置。您需要在DOWNLOADER_MIDDLEWARES設置中添加自定義中間件類,并分配一個整數值來確定它們的執行順序。數值越小,中間件越早執行

這里是一個例子:

DOWNLOADER_MIDDLEWARES = {'mySpider.middlewares.MyDownloaderMiddleware': 543,
}

編寫下載器中間件十分簡單。每個中間件組件是一個定義了以下一個或多個方法的Python類:

class scrapy.contrib.downloadermiddleware.DownloaderMiddleware

爬取騰訊工作的項目實戰?

sevnce-crawler: 爬蟲相關技術 - Gitee.com

scrapy爬取招聘網站數據實戰

相關資料

聚焦Python分布式爬蟲必學框架Scrapy打造搜索引擎(二)-CSDN博客

Python的Requests來爬取今日頭條的圖片和文章_cookie池維護-CSDN博客

鏈接: 百度網盤 提取碼: qc48?

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

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

相關文章

java.io.PrintStream介紹

java.io.PrintStream 是 Java 標準庫中的一個類,用于輸出流中的打印。它提供了一組方便的方法,用于格式化輸出和寫入數據。PrintStream 類中最常見的使用方式是通過 System.out 和 System.err 進行標準輸出和錯誤輸出。 System.out 和 System.err 都是 …

ELK 企業實戰7

ELKkafkafilebeat企業內部日志分析系統 1、組件介紹 1、Elasticsearch: 是一個基于Lucene的搜索服務器。提供搜集、分析、存儲數據三大功能。它提供了一個分布式多用戶能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java開發的&#xff…

【linux】chmod修改文件權限詳解

目錄 一.linux中默認的文件權限 二.文件權限類別 三.chmod改變權限的兩種方式 一.linux中默認的文件權限 默認文件權限: 當你新建一個文件時,文件會有一個默認的權限,這個默認權限就是umask的值,umask一般默認是022,這個值設…

FastAPI教程——部署

部署 部署FastAPI應用程序相對容易。 部署是什么意思 部署應用程序意味著執行必要的步驟以使其可供用戶使用。 對于Web API來說,通常涉及將上傳到云服務器中,搭配一個性能和穩定性都不錯的服務器程序,以便你的用戶可以高效地訪問你的應用…

智慧校園-報修管理系統總體概述

智慧校園報修管理系統是專為優化教育機構內部維修報障流程而設計的信息化解決方案,它通過集成現代信息技術,為校園設施的維護管理帶來革新。該系統以用戶友好和高效運作為核心,確保了從報修請求提交到問題解決的每一個步驟都順暢無阻。 師生或…

分享畫布繪制矩形

簡介 實現功能&#xff0c;在畫布上繪制矩形&#xff0c;移動矩形。 在線演示 繪制矩形 實現代碼 <!DOCTYPE html><html><head> <title>繪制矩形</title> </head><body><div style"margin: 10px"><input typ…

FastDFS部署

版本介紹 安裝fastdfs共需要倆個安裝包 fastdfs-5.05.tar.gz libfastcommon-1.0.7.tar.gz編譯安裝 libfastcommon tar -xvf libfastcommon-1.0.7.tar.gz cd libfastcommon-1.0.7 make.sh make.sh install 3. 設置軟鏈接 libfastcommon.so默認安裝到了/usr/lib64/libfastcommon.…

探索AI視覺革新:深入目標檢測算法

一、目標檢測算法概述 1. 什么是目標檢測&#xff1f; 目標檢測是計算機視覺任務的一部分&#xff0c;其目標是在圖像或視頻中識別和定位特定物體的位置和類別。與簡單的圖像分類任務不同&#xff0c;目標檢測要求算法能夠準確地標記出圖像中每個物體的位置&#xff0c;通常用…

5-linux文件路徑與文件目錄系統

目錄 ①文件路徑 目錄跳轉 絕對路徑與相對路徑 ②文件目錄系統 目錄系統組成 目錄命名規則 命令補充 ls命令補充 file filename查看文件類型 less查看文本文件 ①文件路徑 目錄跳轉 pwd:查看當前工作目錄。 cd:改變目錄。 ls:列出目錄內容。 [root########## ~]# …

某易六月實習筆試

第一題 下面代碼需要更改的地方已指出。 解題思路 模擬題&#xff0c;用雙指針記錄雙方當前式神&#xff0c;再記錄一下當前誰先手&#xff0c;直到有一方指針越界。 把下面代碼now1變為now(now1)%2就行。 第二題 解題思路 01背包變種&#xff0c;只是背包的容量變為多個維度…

CLAY或許是今年最值得期待的3D生成模型,號稱質量最好+布線最好+支持的輸入模態最多+支持材質生成。

CLAY是一種大規模可控生成模型,用于創建高質量的3D資產,它結合了多分辨率變分自編碼器和簡化的潛在擴散變壓器,通過多種輸入形式生成詳細的3D幾何結構和物理渲染材質。 CLAY或許是今年最值得期待的3D生成模型,號稱質量最好+布線最好+支持的輸入模態最多+支持材質生成。 相…

vue2+three.js實現火焰效果

// 火焰getFireMaterial() {const vertex ${ShaderChunk.logdepthbuf_pars_vertex} bool isPerspectiveMatrix(mat4) {return true; } varying vec4 m_pos; varying vec2 vUv; varying vec3 _flame; uniform float uTime; vec2 hash( vec2 p ){p vec2( dot(p,vec2(150.1,350…

EDA期末復習——基礎知識

個人名片&#xff1a; &#x1f393;作者簡介&#xff1a;嵌入式領域優質創作者&#x1f310;個人主頁&#xff1a;妄北y &#x1f4de;個人QQ&#xff1a;2061314755 &#x1f48c;個人郵箱&#xff1a;[mailto:2061314755qq.com] &#x1f4f1;個人微信&#xff1a;Vir2025WB…

The dependencies of some of the beans in the application context form a cycle

The dependencies of some of the beans in the application context form a cycle: 出現這種問題&#xff0c;如果你用其他方法怎么都處理不掉&#xff0c;可以使用最后的方法&#xff1a; 解決方案&#xff1a; 在配置文件增添一行配置即可&#xff1a; properties 配置文件 …

Spring Boot中的版本兼容性處理

Spring Boot中的版本兼容性處理 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01;今天我們來聊聊Spring Boot中的版本兼容性處理。Spring Boot的版本更新頻繁&…

Redis的使用

1 Redis屬于非關系型數據庫&#xff1a; 優勢&#xff1a;讀的速度快110000次/s 寫的速度81000次/s 支持持久化存儲 2 Redis的相關執行命令&#xff1a; 2-1 打開一個 cmd 窗口 使用 cd 命令切換目錄到 C:\redis 運行&#xff1a; redis-server.exe redis.windows.conf …

SaaS 出海:Databend Cloud 的定位與實踐

提到 “SaaS 出海”這個詞大家肯定并不陌生&#xff0c;SaaS 企業將業務拓展到海外市場已經成為許多 SaaS 公司的重要戰略方向。隨著企業對于靈活性、可擴展性以及成本效益需求的不斷增長&#xff0c; SaaS 模式提供了理想的解決方案。對于尋求出海機會的 SaaS 企業來說&#x…

神州信息與國科量子聯合進軍量子網絡應用服務市場(中國軍民兩用通信技術展覽會)

量子通信&#xff0c;智聯未來 —— 神州信息與國科量子共啟安全通信新紀元 在信息技術飛速發展的今天&#xff0c;信息安全已成為全球關注的焦點。神州數碼信息服務股份有限公司&#xff08;神州信息&#xff09;與國科量子通信網絡有限公司&#xff08;國科量子&#xff09;…

【地理庫 Turf.js】

非常全面的地理庫 &#xff0c; 這里枚舉一些比較常用&#xff0c;重點的功能&#xff0c; 重點功能 提供地理相關的類&#xff1a;包括點&#xff0c;線&#xff0c;面等類。 測量功能&#xff1a;點到線段的距離&#xff0c;點和線的關系等。 判斷功能&#xff1a; 點是否在…

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell 前言&#xff1a;這里這個漏洞相對來說審計起來不是特別難&#xff0c;但是對于初學者還是有點挑戰性的&#xff0c;從zkaq web課過來的小伙伴想挑戰一下自己代碼審計能力的話&#xff0c;可以直接跳到最后下載源碼&#xff0c;聶風…