文章目錄
- Python适合做爬蟲的原因
- 爬蟲的知識體系
- Scrapy架構簡介
- Scrapy的工作流程
Python适合做爬蟲的原因
- 語言本身簡單,适合靈活開發
- 有比較完善的工具鍊
- 足夠靈活,以應對各種突然狀況
爬蟲的知識體系
- 前端相關知識:html,css,js;浏覽器相關知識;
- 各種資料庫的運用;
- http協定的了解;
- 對于前背景關聯的方案;
Scrapy架構簡介
什麼是Scrapy架構?
Scrapy是一個為了爬取網站資料,提取結構性資料而編寫的應用架構。 可以應用在包括資料挖掘,資訊處理或存儲曆史資料等一系列的程式中。
其最初是為了頁面抓取 (更确切來說, 網絡抓取 )所設計的, 也可以應用在擷取API所傳回的資料(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。
使用Scrapy架構爬取資料與使用Requests+Xpath爬取資料,差別是什麼?
- 入門requests+Xpath相對來說更加簡單,更能摸清爬蟲每個詳細的步驟。當你隻是簡單的爬取小量的網頁(幾千頁),而不喜歡配置Scrapy架構繁重的設定,那requests+Xpath是不可多得的利器
- requests+Xpath能夠實作的功能,scrapy也能便捷地實作。scrapy是一個功能非常強大的爬蟲架構,它不僅能便捷地建構request,還有強大的selector能夠友善地解析response
- 然而最受歡迎的還是Scrapy的性能,即抓取和解析的速度。它的downloader是多線程的,request是異步排程和處理的。這兩點使它的爬取速度非常之快。另外還有内置的logging,exception,shell等子產品,為爬取工作帶來了很多便利,使你的爬蟲标準化和工程化。
Scrapy的元件
- 引擎(Engine):用來處理整個系統的資料流,觸發事務(架構核心)
- 排程器(Scheduler):用來接受引擎發過來的請求,壓入隊列中,并在引擎再次請求的時候傳回。可以想像成一個URL(抓取網頁的網址或者說是連結)的優先隊列,由它來決定下一個要抓取的網址是什麼,同時去除重複的網址
- 下載下傳器(Downloader):用于下載下傳網頁内容,并将網頁内容傳回給引擎(Scrapy下載下傳器是建立在twisted這個高效的異步模型上的)
- 爬蟲(Spiders):爬蟲是主要幹活的,用于從特定的網頁中提取自己需要的資訊,即所謂的實體(Item)。也可以從中提取對外連結接,讓Scrapy繼續抓取下一個頁面
- 項目管道(Item Pipelines):負責處理爬蟲從網頁中抽取的(Item),主要的功能是持久化實體、驗證明體的有效性、清除不需要的資訊。當頁面被爬蟲解析後,将被發送到項目管道,并經過幾個特定的次序處理資料,并儲存資料
- 下載下傳器中間件(Downloader Middlewares):位于Scrapy引擎和下載下傳器之間的架構,主要是處理Scrapy引擎與下載下傳器之間的請求及響應,是進行反反爬工作的重點
- 爬蟲中間件(Spider Middlewares):介于Scrapy引擎和爬蟲之間的架構,主要工作是處理蜘蛛的響應輸入和請求輸出
Scrapy的工作流程
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNwYzM4YmYjBDOzMjNhZTMzYzXzITN0kDM2AzLclDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
- Spiders發送第一個URL給引擎
- 引擎從Spider中擷取到第一個要爬取的URL後,在排程器(Scheduler)以Request排程
- 排程器把需要爬取的request傳回給引擎
- 引擎将request通過下載下傳中間件發給下載下傳器(Downloader)去網際網路下載下傳資料
- 一旦資料下載下傳完畢,下載下傳器擷取由網際網路伺服器發回來的Response,并将其通過下載下傳中間件發送給引擎
- 引擎從下載下傳器中接收到Response并通過Spider中間件發送給Spider處理
- pider處理Response并從中傳回比對到的Item及(跟進的)新的Request給引擎
- 引擎将(Spider傳回的)爬取到的Item給Item Pipeline做資料處理或者入庫儲存,将(Spider傳回的)Request給排程器入隊列
- (從第三步)重複直到排程器中沒有更多的request