Scrapy是一個基於Twisted的異步處理框架,是純Python實現的爬蟲框架,其架構清晰,模塊之間的耦合程度低,可擴展性極強,能夠靈活完成各類需求。咱們只須要定製開發幾個模塊就能夠輕鬆實現一個爬蟲。
網絡
首先咱們看看Scrapy框架的架構,以下圖所示。
數據結構
它能夠分爲以下的幾個部分。架構
Engine。引擎,處理整個系統的數據流處理、觸發事務,是整個框架的核心。app
Item。項目,它定義了爬取結果的數據結構,爬取的數據會被賦值成該Item對象。框架
Scheduler。調度器,接受引擎發過來的請求並將其加入隊列中,在引擎再次請求的時候將請求提供給引擎。異步
Downloader。下載器,下載網頁內容,並將網頁內容返回給蜘蛛。scrapy
Spiders。蜘蛛,其內定義了爬取的邏輯和網頁的解析規則,它主要負責解析響應並生成提取結果和新的請求。ide
Item Pipeline。項目管道,負責處理由蜘蛛從網頁中抽取的項目,它的主要任務是清洗、驗證和存儲數據。網站
Downloader Middlewares。下載器中間件,位於引擎和下載器之間的鉤子框架,主要處理引擎與下載器之間的請求及響應。spa
Spider Middlewares。蜘蛛中間件,位於引擎和蜘蛛之間的鉤子框架,主要處理蜘蛛輸入的響應和輸出的結果及新的請求。
Scrapy中的數據流由引擎控制,數據流的過程以下。
Engine首先打開一個網站,找處處理該網站的Spider,並向該Spider請求第一個要爬取的URL。
Engine從Spider中獲取到第一個要爬取的URL,並經過Scheduler以Request的形式調度。
Engine向Scheduler請求下一個要爬取的URL。
Scheduler返回下一個要爬取的URL給Engine,Engine將URL經過Downloader Middlewares轉發給Downloader下載。
一旦頁面下載完畢,Downloader生成該頁面的Response,並將其經過Downloader Middlewares發送給Engine。
Engine從下載器中接收到Response,並將其經過Spider Middlewares發送給Spider處理。
Spider處理Response,並返回爬取到的Item及新的Request給Engine。
Engine將Spider返回的Item給Item Pipeline,將新的Request給Scheduler。
重複第二步到最後一步,直到Scheduler中沒有更多的Request,Engine關閉該網站,爬取結束。
經過多個組件的相互協做、不一樣組件完成工做的不一樣、組件對異步處理的支持,Scrapy最大限度地利用了網絡帶寬,大大提升了數據爬取和處理的效率。
Scrapy框架和pyspider不一樣,它是經過命令行來建立項目的,代碼的編寫仍是須要IDE。項目建立以後,項目文件結構以下所示:
scrapy.cfg project/ __init__.py items.py pipelines.py settings.py middlewares.py spiders/ __init__.py spider1.py spider2.py ...
這裏各個文件的功能描述以下。
scrapy.cfg:它是Scrapy項目的配置文件,其內定義了項目的配置文件路徑、部署相關信息等內容。
items.py:它定義Item數據結構,全部的Item的定義均可以放這裏。
pipelines.py:它定義Item Pipeline的實現,全部的Item Pipeline的實現均可以放這裏。
settings.py:它定義項目的全局配置。
middlewares.py:它定義Spider Middlewares和Downloader Middlewares的實現。
spiders:其內包含一個個Spider的實現,每一個Spider都有一個文件。
本節介紹了Scrapy框架的基本架構、數據流過程以及項目結構。後面咱們會詳細瞭解Scrapy的用法,感覺它的強大。