16. Scrapy 框架介紹與安裝

1. Scrapy 框架介紹
Scrapy是Python開發(fā)的一個快速,高層次的屏幕抓取和web抓取框架,用于抓取web站點并從頁面中提取結(jié)構(gòu)化的數(shù)據(jù)。Scrapy = Scrach+Python
Scrapy 使用Twisted 這個異步網(wǎng)絡(luò)庫來處理網(wǎng)絡(luò)通訊,架構(gòu)清晰,并且包含了各種中間件接口,可以靈活的完成各種需求。Scrapy是由Twisted寫的一個受歡迎的Python事件驅(qū)動網(wǎng)絡(luò)框架,它使用的是非堵塞的異步處理
1.1 為什么要使用Scrapy?
它更容易構(gòu)建和大規(guī)模的抓取項目
它內(nèi)置的機制被稱為選擇器,用于從網(wǎng)站(網(wǎng)頁)上提取數(shù)據(jù)
它異步處理請求,速度十分快
它可以使用自動調(diào)節(jié)機制自動調(diào)整爬行速度
確保開發(fā)人員可訪問性
1.2 Scrapy的特點
Scrapy是一個開源和免費使用的網(wǎng)絡(luò)爬蟲框架
Scrapy生成格式導(dǎo)出如:JSON,CSV和XML
Scrapy內(nèi)置支持從源代碼,使用XPath或CSS表達式的選擇器來提取數(shù)據(jù)
Scrapy基于爬蟲,允許以自動方式從網(wǎng)頁中提取數(shù)據(jù)
1.3 Scrapy的優(yōu)點
Scrapy很容易擴展,快速和功能強大;
這是一個跨平臺應(yīng)用程序框架(在Windows,Linux,Mac OS和BSD)。
Scrapy請求調(diào)度和異步處理;
Scrapy附帶了一個名為Scrapyd的內(nèi)置服務(wù),它允許使用JSON Web服務(wù)上傳項目和控制蜘蛛。
也能夠刮削任何網(wǎng)站,即使該網(wǎng)站不具有原始數(shù)據(jù)訪問API;
1.4 整體架構(gòu)大致如下:
最簡單的單個網(wǎng)頁爬取流程是spiders > scheduler > downloader > spiders > item pipeline
1.5 Scrapy運行流程大概如下:
引擎從調(diào)度器中取出一個鏈接(URL)用于接下來的抓取
引擎把URL封裝成一個請求(Request)傳給下載器
下載器把資源下載下來,并封裝成應(yīng)答包(Response)
爬蟲解析Response
解析出實體(Item),則交給實體管道進行進一步的處理
解析出的是鏈接(URL),則把URL交給調(diào)度器等待抓取
1.6 Scrapy主要包括了以下組件:
引擎(Scrapy)
用來處理整個系統(tǒng)的數(shù)據(jù)流處理, 觸發(fā)事務(wù)(框架核心)
調(diào)度器(Scheduler)
用來接受引擎發(fā)過來的請求, 壓入隊列中, 并在引擎再次請求的時候返回. 可以想像成一個URL(抓取網(wǎng)頁的網(wǎng)址或者說是鏈接)的優(yōu)先隊列, 由它來決定下一個要抓取的網(wǎng)址是什么, 同時去除重復(fù)的網(wǎng)址
下載器(Downloader)
用于下載網(wǎng)頁內(nèi)容, 并將網(wǎng)頁內(nèi)容返回給蜘蛛(Scrapy下載器是建立在twisted這個高效的異步模型上的)
爬蟲(Spiders)
爬蟲是主要干活的, 用于從特定的網(wǎng)頁中提取自己需要的信息, 即所謂的實體(Item)。用戶也可以從中提取出鏈接,讓Scrapy繼續(xù)抓取下一個頁面
項目管道(Pipeline)
負責(zé)處理爬蟲從網(wǎng)頁中抽取的實體,主要的功能是持久化實體、驗證實體的有效性、清除不需要的信息。當(dāng)頁面被爬蟲解析后,將被發(fā)送到項目管道,并經(jīng)過幾個特定的次序處理數(shù)據(jù)。
下載器中間件(Downloader Middlewares)
位于Scrapy引擎和下載器之間的框架,主要是處理Scrapy引擎與下載器之間的請求及響應(yīng)
爬蟲中間件(Spider Middlewares)
介于Scrapy引擎和爬蟲之間的框架,主要工作是處理蜘蛛的響應(yīng)輸入和請求輸出
調(diào)度中間件(Scheduler Middewares)
介于Scrapy引擎和調(diào)度之間的中間件,從Scrapy引擎發(fā)送到調(diào)度的請求和響應(yīng)
2 安裝
pip install Scrapy
注:windows平臺需要依賴pywin32
ModuleNotFoundError: No module named 'win32api'