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
參考文獻:同上