scrapy寫爬蟲

Scrapy是一個用于爬取網站數據并提取結構化信息的Python框架

一、Scrapy介紹

1.引擎(Engine)
– Scrapy的引擎是控制數據流和觸發事件的核心。它管理著Spider發送的請求和接收的響應,以及處理Spider生成的Item。引擎是Scrapy運行的驅動力。

2.調度器(Scheduler)
– 調度器負責接收引擎發送的請求,并根據一定的策略(如優先級、深度等)將它們入隊。當引擎需要新的請求時,調度器會從隊列中取出請求并返回給引擎。它確保了請求的有序處理。

3.下載器(Downloader)
– 下載器負責根據Scrapy引擎發送的請求下載網頁內容。它使用HTTP協議與網站服務器進行通信,并將下載的網頁內容作為響應返回給Scrapy引擎。下載器是Scrapy獲取網頁數據的核心組件。

4.Spiders
– Spiders是Scrapy中用于定義爬取邏輯和解析網頁內容的組件。它們根據定義的規則生成初始請求,并處理下載器返回的響應,從中提取出需要的數據(Item)或生成新的請求(Request)進行進一步的爬取

5.Item Pipelines
– Item Pipelines負責處理Spider提取出的Item。它們可以執行各種任務,如清洗數據、驗證數據的完整性、存儲數據到數據庫或文件中。通過定義多個Pipeline,可以靈活地處理數據,滿足不同的需求。

6.下載器中間件(Downloader Middlewares)
– 下載器中間件位于Scrapy引擎和下載器之間,用于處理請求和響應。它們可以修改請求(如添加請求頭、設置代理等)或響應(如壓縮處理、重定向處理等),從而控制Scrapy如何與網站交互。中間件是Scrapy擴展功能的重要機制。

7.Spider中間件(Spider Middlewares)
– Spider中間件位于Scrapy引擎和Spiders之間,用于處理Spider的輸入(即響應)和輸出(即Item和新的請求)。它們可以修改或丟棄響應,處理異常,甚至修改或丟棄Spider生成的Item和Request。Spider中間件提供了在Spider執行過程中插入自定義功能的能力。

各組件之間的數據流向如圖所示:
在這里插入圖片描述

  • 從初始URL開始,Scheduler會將其交給Downloader進行下載
  • 下載之后會交給Spider進行分析
  • Spider分析出來的結果有兩種
  • 一種是需要進一步抓取的鏈接,如 “下一頁”的鏈接,它們會被傳回Scheduler;
  • 另一種是需要保存的數據,它們被送到Item Pipeline里,進行后期處理(詳細分析、過濾、存儲等)

二.安裝scrapy

pip install scrapy

安裝后,只要在命令終端輸入 scrapy,提示類似以下結果,代表已經安裝成功

在這里插入圖片描述

三、Scrapy應用示例

1、新建項目
在開始爬取之前,必須創建一個新的Scrapy項目。進入自定義的項目目錄中,運行下列命令:

scrapy startproject Spider

其中: mySpider 為項目名稱,可以看到將會創建一個 mySpider 文件夾,目錄結構大致如下:

mySpider/scrapy.cfgmySpider/__init__.pyitems.pypipelines.pysettings.pyspiders/__init__.py...
  • scrapy.cfg: 項目的配置文件。
  • mySpider/: 項目的Python模塊,將會從這里引用代碼。
  • mySpider/items.py: 項目的目標文件。
  • mySpider/pipelines.py: 項目的管道文件。
  • mySpider/settings.py: 項目的設置文件。
  • mySpider/spiders/: 存儲爬蟲代碼目錄。

2、創建爬蟲
在當前目錄下輸入命令,將在mySpider/spiders目錄下創建一個名為bd_test的爬蟲,并指定爬取域的范圍:

scrapy genspider bd_test "baidu.com"

注意:
第一個參數是爬蟲名字不是項目名字;
第二個參數是網站域名,是允許爬蟲采集的域名。比如:baidu.com 不限制域名 可能爬到 zhihu.com 。后期可以更改,但要先有生成的目錄和文件結果:
在這里插入圖片描述

執行命令(執行的是spiders中name)

scrapy crawl baidu

在這里插入圖片描述
也可以腳本運行

from scrapy import cmdline
cmdline.execute("scrapy crawl qb".split())

3、編寫spiders
class中的
name:也是就是爬蟲名一定是唯一的
allowed_domains:域名
start_urls:鏈接(列表可寫入多條,按順序)一般一個
parse(): 被調用時,每個初始 URL 完成下載后生成的 Response 對象將會作為唯一的參數傳遞給該函數。該方法負責解析返回的數據,提取數據(生成 item)以及生成需要進一步處理的 URL 的 Request 對象。

4、創建item
創建完 Spider 文件之后,接著定義一個容器來保存要爬取的數據,我們對items.py文件進行更改或者創建一個新的文件來定義 item 都行。
??創建 Item 需要繼承 scrapy.Item 類,并且定義類型為 scrapy.Field 的字段。例如我們要爬取慕課網站課程的信息,包括課程名稱,課程 URL,課程圖片 URL,課程描述,學習人數。

import scrapyclass MyreptileItem(scrapy.Item):# 在這里可以定義你需要的字段,如:name = scrapy.Field()title = scrapy.Field()url = scrapy.Field()image_url = scrapy.Field()introduction = scrapy.Field()student = scrapy.Field()

當spiders調用時,導入即可
在這里插入圖片描述
5、pipelines.py
在Scrapy中,Pipelines 是用來處理爬取到的數據(Item)的組件。它們可以執行一些清理、驗證和持久化(比如存儲到數據庫或文件)的操作。列入存入redis:
在這里插入圖片描述
6、中間件middlewares
具體參考文章:https://www.jianshu.com/p/2c524bfc11d1

參考文獻:同上

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

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

相關文章

基于go-zero二次開發的腳本

param$2 # 字符串風格格式為&#xff1a;DemoName model_name$(echo "${param}" | awk -F _ {for(i1;i<NF;i) $itoupper(substr($i,1,1)) tolower(substr($i,2));}1 | tr -d ) # 字符串風格格式為&#xff1a;demoName struct_name$(echo "${model_name}&qu…

ClickHouse表引擎概述

ClickHouse表引擎概述 表引擎的功能&#xff1a; 數據的存儲方式 數據的存儲位置 是否可以使用索引 是否可以使用分區 是否支持數據副本 并發數據訪問 ClickHouse在建表時必須指定表引擎。 表引擎主要分為四大類&#xff1a;MergeTree系列、Log系列、與其他存儲/處理系…

字節碼編程bytebuddy之獲取方法信息和方法入參信息

寫在前面 本文看下通過bytebuddy如何獲取方法信息和方法的入參信息。 1&#xff1a;代碼 package com.dahuyou.bytebuddy.bb;import com.dahuyou.bytebuddy.TT; import net.bytebuddy.ByteBuddy; import net.bytebuddy.dynamic.DynamicType; import net.bytebuddy.implement…

【高中數學/對數函數】比較a=ln2/2,b=ln5/5的大小

【問題】 比較aln2/2,bln5/5的大小 【解答】 a-bln2/2-ln5/5(5*ln2-2*ln5)/10(ln2^5-ln5^2)/10(ln32-ln25)/10>0 所以a>b 【圖像】 如果繪出函數ylnx/x的圖像&#xff0c;再標記出a,b的位置&#xff0c;則繪出圖像如下&#xff1a; 由上圖可以看出&#xff0c;a,b兩…

隨手記:對比兩個對象不一樣的值,生成一個新的對象

diffObject(obj1, obj2) {let changeForm {}for (let key in obj1) {if (!obj1.hasOwnProperty(key) || obj1[key] ! obj2[key]) {// 新舊數據不相同的key值changeForm[key] obj1[key]}}console.log(changeForm, changeForm)},

初次用bable遍歷vue項目下的中文

利用 babel 找到 AST 中的中文 // vite-plugin-babel-transform.js const parser require(babel/parser) const traverse require(babel/traverse).default // const types require(babel/types) // const generate require(babel/generator).default const fs require(f…

【PHP小課堂】學習PHP中的字符串操作函數(二)

學習PHP中的字符串操作函數&#xff08;二&#xff09; 接下來我們繼續 PHP 中字符串函數的學習。今天學習的內容主要是帶下劃線的一些字符串函數&#xff0c;上篇文章說過&#xff0c;這些系統函數的命名是 PHP 非常令人詬病的&#xff0c;有些東西真的只能靠我們的記憶來強行…

顯卡、顯卡驅動、cuda、cuDNN之間關系

顯卡、顯卡驅動、CUDA 和 cuDNN 是構成高性能計算和深度學習環境的關鍵組件&#xff0c;它們之間有著緊密的聯系。下面是對這些組件及其關系的詳細介紹&#xff1a; 顯卡&#xff08;GPU&#xff09; 顯卡&#xff0c;全稱為圖形處理器&#xff08;Graphics Processing Unit&…

【Unity2D 2022:NPC】制作任務系統

一、接受任務 1. 編輯NPC對話腳本&#xff1a; &#xff08;1&#xff09;創建靜態布爾變量用來判斷ruby是否接受到任務 public class NPCDialog : MonoBehaviour {// 創建全局變量用來判斷ruby是否接到任務public static bool receiveTask false; } &#xff08;2&#xff…

python學習-錯誤與異常

代碼是人的邏輯思維的具體體現&#xff0c;因為沒有一個人的邏輯思維是完美無缺的&#xff0c;所以人在編寫代碼時必然會出現各種錯誤。既然錯誤或多或少都會發生&#xff0c;那么如何捕捉錯誤&#xff0c;并且捕捉到錯誤后要如何處理&#xff0c;就顯得很重要。 語法錯誤 Py…

SPI通信協議和W25Q64

前言&#xff1a; STM32中的通信接口&#xff1a; UART 單總線 IIC SPI CAN 1. SPI FLASH W25Q64的關系 SPI:一種通信接口&#xff0c;可以用于和搭載SPI接口的設備通信 FLASH:是一種掉電不丟失的存儲 -- 手機8256G的256 單片機 64K512K的512 芯片內部flash&…

STM32 GPIO的工作原理

STM32的GPIO管腳有下面8種可能的配置:&#xff08;4輸入 2 輸出 2 復用輸出) &#xff08;1&#xff09;浮空輸入_IN_FLOATING 在上圖上&#xff0c;陰影的部分處于不工作狀態&#xff0c;尤其是下半部分的輸出電路&#xff0c;實際上是與端口處于隔離狀態。黃色的高亮部分顯示…

響應式布局下關于gird柵格布局的一些構思

1、傳列數&#xff0c;根據列數計算元素容器寬度 好處是子元素可以寫百分比寬度&#xff0c;不用固定某一種寬度&#xff0c;反正知道列數通過計算間距就能得到外層容器的寬度。 舉個簡單的例子&#xff1a; &#xff08;ps:以下用例皆在html中去模擬&#xff0c;就不另外起r…

Python 獲取 SQL 指紋和 HASH 值

前言 本文介紹一個提取 SQL 指紋的方法&#xff0c;就是將 SQL 語句的條件轉換為 &#xff1f;可用于脫敏和 SQL 聚類分析的場景。 1. 工具安裝 這里用到的工具&#xff0c;就是 pt 工具集中的 pt-fingerprint 含在 Percona Toolkit 中&#xff0c;安裝方法可參考 Percona T…

python7:裝飾器

目錄 1.調用外部程序os.system-阻塞式調用subprocess-python中的模塊 2.裝飾器前戲作用域&#xff08;1&#xff09;全局和局部-就近原則&#xff08;2&#xff09;嵌套作用域&#xff08;3&#xff09;內置作用域、變量 高階函數&#xff1a;函數是最高級的對象&#xff08;1&…

海外媒體投稿:5個軟文代發經典案例,教大家獲得突破

隨著互聯網的飛速發展&#xff0c;軟文代發成為一種高效的推廣方法。下面我們就詳細介紹五個成功軟文代發推廣實例&#xff0c;致力于幫助讀者把握有關方法&#xff0c;完成突破。 第一實例&#xff1a;社交網絡散播在如今社交媒體時代&#xff0c;軟文代發能夠通過社交平臺迅速…

nodejs實現:支付寶訂單查詢

nodejs實現&#xff1a;支付寶訂單查詢&#xff1b; 原生http請求&#xff0c;不使用三方庫&#xff1b; 代碼如下&#xff1a; const https require(https); const crypto require(crypto); const querystring require(querystring);// 支付寶公共參數 const PRIVATE_KE…

[C++] 輕熟類和對象

類的定義 格式規范 class為定義類的關鍵字&#xff0c;后有類名&#xff0c;類的主體存于{}中&#xff1b;類定義結束時后面的分號不能省略&#xff1b;類體的內容成為類的成員&#xff0c;類中的變量成為成員變量&#xff0c;函數成為方法或成員函數&#xff1b;C兼容C語言的…

微軟 Edge 瀏覽器全解析

微軟 Edge 是微軟推出的一個現代化瀏覽器,繼承了 Internet Explorer(IE)的部分功能,但在速度、安全性和兼容性方面做出了很大改進。下面是對微軟 Edge 瀏覽器的詳細解析,包括其特點、安裝、配置和常見問題的解答。 微軟 Edge 瀏覽器的特點 基于 Chromium 內核 Edge 瀏覽…

SpringBoot配置flyway

背景 目前我們的項目代碼都會交由Git、SVN等版本管理工具進行管理&#xff0c;但是我們的sql腳本&#xff0c;尤其是各類ddl腳本并沒有進行版本的管理&#xff08;python的web框架Django默認就提供了類似的工具&#xff0c;從一開始就鼓勵開發者通過版本管理的方式進行數據庫的…