Python爬蟲之Scrapy學習(基礎篇)

Python資料科學發表於2019-03-04

作者:xiaoyu

微信公眾號:Python資料科學

知乎:zhuanlan.zhihu.com/pypcfx


在爬蟲的路上,學習scrapy是一個必不可少的環節。也許有好多朋友此時此刻也正在接觸並學習scrapy,那麼很好,我們一起學習。開始接觸scrapy的朋友可能會有些疑惑,畢竟是一個框架,上來不知從何學起。從本篇起,博主將開啟scrapy學習的系列,分享如何快速入門scrapy並熟練使用它。

本篇作為第一篇,主要介紹和了解scrapy,在結尾會向大家推薦一本關於學習scrapy的書,以及獲取的方式。

為什麼要用爬蟲框架?

如果你對爬蟲的基礎知識有了一定了解的話,那麼是時候該瞭解一下爬蟲框架了。那麼為什麼要使用爬蟲框架?

  • 學習框架的根本是學習一種程式設計思想,而不應該僅僅侷限於是如何使用它。從瞭解到掌握一種框架,其實是對一種思想理解的過程。

  • 框架也給我們的開發帶來了極大的方便。許多條條框框都已經是寫好了的,並不需要我們重複造輪子,我們只需要根據自己的需求定製自己要實現的功能就好了,大大減少了工作量。

  • 參考並學習優秀的框架程式碼,提升程式設計程式碼能力。

博主當時是根據這幾點來進行爬蟲框架的學習的,但是切記核心目標是掌握一種框架思想,一種框架的能力,掌握了這種思想你才能更好的去使用它,甚至擴充套件它。

scrapy框架的介紹

比較流行的爬蟲的框架有scrapypyspider,但是被大家所鍾愛的我想非scrapy莫屬了。scrapy是一個開源的高階爬蟲框架,我們可以稱它為**"scrapy語言"**。它使用python編寫,用於爬取網頁,提取結構性資料,並可將抓取得結構性資料較好的應用於資料分析和資料探勘。scrapy有以下的一些特點:

  • scrapy基於事件的機制,利用twisted的設計實現了非阻塞的非同步操作。這相比於傳統的阻塞式請求,極大的提高了CPU的使用率,以及爬取效率。
  • 配置簡單,可以簡單的通過設定一行程式碼實現複雜功能。
  • 可擴充,外掛豐富,比如分散式scrapy + redis、爬蟲視覺化等外掛。
  • 解析方便易用,scrapy封裝了xpath等解析器,提供了更方便更高階的selector構造器,可有效的處理破損的HTML程式碼和編碼。

scrapy和requests+bs用哪個好?

有的朋友問了,為什麼要使用scrapy,不使用不行嗎?用resquests + beautifulsoup組合難道不能完成嗎?

不用糾結,根據自己方便來。resquests + beautifulsoup當然可以了,requests + 任何解析器都行,都是非常好的組合。這樣用的優點是我們可以靈活的寫我們自己的程式碼,不必拘泥於固定模式。對於使用固定的框架有時候不一定用起來方便,比如scrapy對於反反爬的處理並沒有很完善,好多時候也要自己來解決。

但是對於一些中小型的爬蟲任務來講,scrapy確實是非常好的選擇,它避免了我們來寫一些重複的程式碼,並且有著出色的效能。我們自己寫程式碼的時候,比如為了提高爬取效率,每次都自己碼多執行緒或非同步等程式碼,大大浪費了開發時間。這時候使用已經寫好的框架是再好不過的選擇了,我們只要簡單的寫寫解析規則和pipeline就好了。那麼具體哪些是需要我們做的呢?看看下面這個圖就明白了。

Python爬蟲之Scrapy學習(基礎篇)
參考來源在本文末

因此,對於該用哪個,根據個人需求和喜好決定。但是至於學習的先後順序,博主建議先學學resquests + beautifulsoup,然後再接觸Scrapy效果可能會更好些,僅供參考。

scrapy的架構

在學習Scrapy之前,我們需要了解Scrapy的架構,明白這個架構對學習scrapy至關重要。

Python爬蟲之Scrapy學習(基礎篇)
Scrapy官方文件的圖片

下面的描述引自官方doc文件(在此引用),講的很清楚明白,對照這個圖看就能明白。

元件

Scrapy Engine 引擎負責控制資料流在系統中所有元件中流動,並在相應動作發生時觸發事件。 詳細內容檢視下面的資料流(Data Flow)部分。

排程器(Scheduler) 排程器從引擎接受request並將他們入隊,以便之後引擎請求他們時提供給引擎。

下載器(Downloader) 下載器負責獲取頁面資料並提供給引擎,而後提供給spider

Spiders SpiderScrapy使用者編寫用於分析response並提取item(即獲取到的item)或額外跟進的URL的類。 每個spider負責處理一個特定(或一些)網站。

Item Pipeline Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到資料庫中)。

下載器中介軟體(Downloader middlewares) 下載器中介軟體是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的response。 其提供了一個簡便的機制,通過插入自定義程式碼來擴充套件Scrapy功能。

Spider中介軟體(Spider middlewares) Spider中介軟體是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,通過插入自定義程式碼來擴充套件Scrapy功能。

資料流過程

  1. 引擎開啟一個網站(open a domain),找到處理該網站的Spider並向該spider請求第一個要爬取的URL(s)。
  2. 引擎從Spider中獲取到第一個要爬取的URL並在排程器(Scheduler)Request排程。
  3. 引擎向排程器請求下一個要爬取的URL。
  4. 排程器返回下一個要爬取的URL給引擎,引擎將URL通過下載中介軟體(請求(request)方向)轉發給下載器(Downloader)
  5. 一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其通過下載中介軟體(返回(response)方向)傳送給引擎。
  6. 引擎從下載器中接收到Response並通過Spider中介軟體(輸入方向)傳送給Spider處理。
  7. Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。
  8. 引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給排程器。
  9. (從第二步)重複直到排程器中沒有更多地request,引擎關閉該網站。

scrapy學習參考

下面博主列出兩個學習scrapy的參考資料。

  • 第一個當然不用說了,scrapy的官方文件,寫的很好,很詳細。連結:https://doc.scrapy.org/en/latest/index.html
  • 第二個是一本關於scrapy的書籍,《learning scrapy》

Python爬蟲之Scrapy學習(基礎篇)

參考: https://doc.scrapy.org/en/latest/index.html https://www.cnblogs.com/x-pyue/p/7795315.html


如果想學習Python大資料,可以關注微信公眾號Python資料科學,博主會一直更新精彩內容,並分享更多的實戰講解,帶你走進資料的世界。

Python爬蟲之Scrapy學習(基礎篇)

相關文章