python 爬蟲對 scrapy 框架的認識

Laical發表於2020-07-17

在爬蟲的路上,學習scrapy是一個必不可少的環節。也許有好多朋友此時此刻也正在接觸並學習scrapy,那麼很好,我們一起學習。開始接觸scrapy的朋友可能會有些疑惑,畢竟是一個框架,上來不知從何學起。

通過Scrapy,我們可以輕鬆地完成一個站點爬蟲的編寫。但如果抓取的站點量非常大,比如爬取各大媒體的新聞資訊,多個Spider則可能包含很多重複程式碼。

如果我們將各個站點的Spider的公共部分保留下來,不同的部分提取出來作為單獨的配置,如爬取規則、頁面解析方式等抽離出來做成一個配置檔案,那麼我們在新增一個爬蟲的時候,只需要實現這些網站的爬取規則和提取規則即可。

為什麼要用爬蟲框架?

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

  • 學習程式設計思想:學習框架的根本是學習一種程式設計思想,而不應該僅僅侷限於是如何使用它。從瞭解到掌握一種框架,其實是對一種思想理解的過程。
  • 開發方便:框架也給我們的開發帶來了極大的方便。許多條條框框都已經是寫好了的,並不需要我們重複造輪子,我們只需要根據自己的需求定製自己要實現的功能就好了,大大減少了工作量。
  • 提升程式設計能力:參考並學習優秀的框架程式碼,提升程式設計程式碼能力。

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

scrapy的介紹

比較流行的爬蟲的框架有scrapy和pyspider,但是被大家所鍾愛的我想非scrapy莫屬了。scrapy是一個開源的高階爬蟲框架,我們可以稱它為”scrapy語言”。它使用python編寫,用於爬取網頁,提取結構性資料,並可將抓取得結構性資料較好的應用於資料分析和資料探勘。scrapy有以下的一些特點: scrapy基於事件的機制,利用twisted的設計實現了非阻塞的非同步操作。這相比於傳統的阻塞式請求,極大的提高了CPU的使用率,以及爬取效率。 配置簡單,可以簡單的通過設定一行程式碼實現複雜功能。 可擴充,外掛豐富,比如分散式scrapy + redis、爬蟲視覺化等外掛。 解析方便易用,scrapy封裝了xpath等解析器,提供了更方便更高階的selector構造器,可有效的處理破損的HTML程式碼和編碼。

Scrapy的運作流程

程式碼寫好,程式開始執行…

1 引擎:Hi!Spider, 你要處理哪一個網站? 2 Spider:老大要我處理xxxx.com。 3 引擎:你把第一個需要處理的URL給我吧。 4 Spider:給你,第一個URL是xxxxxxx.com。 5 引擎:Hi!排程器,我這有request請求你幫我排序入隊一下。 6 排程器:好的,正在處理你等一下。 7 引擎:Hi!排程器,把你處理好的request請求給我。 8 排程器:給你,這是我處理好的request 9 引擎:Hi!下載器,你按照老大的下載中介軟體的設定幫我下載一下這個request請求 10 下載器:好的!給你,這是下載好的東西。(如果失敗:sorry,這個request下載失敗了。然後引擎告訴排程器,這個request下載失敗了,你記錄一下,我們待會兒再下載) 11 引擎:Hi!Spider,這是下載好的東西,並且已經按照老大的下載中介軟體處理過了,你自己處理一下(注意!這兒responses預設是交給def parse()這個函式處理的) 12 Spider:(處理完畢資料之後對於需要跟進的URL),Hi!引擎,我這裡有兩個結果,這個是我需要跟進的URL,還有這個是我獲取到的Item資料。 13 引擎:Hi !管道 我這兒有個item你幫我處理一下!排程器!這是需要跟進URL你幫我處理下。然後從第四步開始迴圈,直到獲取完老大需要全部資訊。 14 管道``排程器:好的,現在就做!

注意!只有當排程器中不存在任何request了,整個程式才會停止,(也就是說,對於下載失敗的URL,Scrapy也會重新下載。)


製作 Scrapy 爬蟲 一共需要4步:

  1. 新建專案 (scrapy startproject xxx):新建一個新的爬蟲專案
  2. 明確目標 (編寫items.py):明確你想要抓取的目標
  3. 製作爬蟲 (spiders/xxspider.py):製作爬蟲開始爬取網頁
  4. 儲存內容 (pipelines.py):設計管道儲存爬取內容

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通用爬蟲的實現。我們將所有配置抽離出來,每增加一個爬蟲,就只需要增加一個JSON檔案配置。之後我們只需要維護這些配置檔案即可。如果要更加方便的管理,可以將規則存入資料庫,再對接視覺化管理頁面即可。當然python爬蟲使用scrapy框架配上億牛雲爬蟲代理 才能高效穩定的採集資料。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章