Scrapy 分佈式爬蟲:基本概念及框架

網絡爬蟲基本概念

基本概念

網絡爬蟲的 wiki 定義如下:

網絡爬蟲(英語:web crawler),也叫網絡蜘蛛(spider),是一種用來自動瀏覽萬維網的網絡機器人,用來獲取萬維網上可用的數據。

對於爬蟲本身是做什麼的,我們都很熟悉,因此這個定義也不言自明。

基本類型

網絡爬蟲的經歷了五個發展歷程

  1. 建立索引
    1989年互聯網誕生之初沒有搜索功能。
    1993年6月產生了第一個萬維網漫遊器,可以抓取互聯網上的所有網頁,測量網頁大小,同年12月首個基於爬蟲的搜索引擎誕生

  2. 2000年網頁API和API爬蟲
    Salesforce 和 eBay 首先推出自己的API供程序員下載數據使用
    發送一組HTTP請求,然後接收JSON或XML的回饋,爲開發人員提供了一種更友好的網絡爬蟲方式

  3. 2004 年Python Beautiful Soup
    Beautiful Soup可以理解站點的結構,並幫助從HTML容器中解析內容。它被認爲是用於網絡爬蟲的最複雜和最先進的庫,也是當今常見和流行的方法之一。

  4. 網絡抓取軟件的可視化
    爲了降低網絡爬蟲的編碼門檻,使更多有數據爬取需求的人能夠使用網絡爬蟲,可視化的網絡爬蟲軟件,它允許用戶輕鬆簡單的選擇網頁內容,並將這些數據構造成可用的excel文件或數據庫。

    但是可視化軟件的功能始終是有限的,當遇到高定製化、個性化的需求的時候,依然需要專門的爬蟲工程師來完成。

網絡爬蟲的基本架構

基本架構

一個小型的網絡爬蟲,比如只爬取數個特定頁面的爬蟲,或許只要一個 py 文件就足以勝任,但是要爬取上百萬頁面的大型網絡爬蟲,就需要一定的架構才能更好的完成任務,這樣的爬蟲基本上框架如下:
大型爬蟲框架

  • 爬蟲調度端:來啓動爬蟲、停止爬蟲、監視爬蟲的運行情況
  • URL管理器:對將要爬取的和已經爬取的URL進行管理
  • 網頁下載器:
    • 從URL管理器中獲取一個將要爬取的URL,傳給網頁下載器
    • 下載器將URL指向的網頁下載並存儲爲一個字符串
  • 網頁解析器:
    • 將網頁下載器下載下來的字符串進行解析
    • 一方面獲取價值數據,另一方面每個URL中往往還有指向其他頁面的URL,需要補充到URL管理器中

這四個部分最終組成一個應用程序。

架構流程運行流程

整個爬蟲的架構流程如下所示
流程

  • 調度器詢問URL管理器是否有待爬取的URL?
  • URL管理器返回是/否
  • 如果是,調度器會從URL管理器中獲取一個待爬取的URL
  • URL管理器將URL返回給調度器
  • 調度器將URL傳給下載器對網頁內容進行下載
  • 下載好後下載器將URL內容返回給調度器
  • 調度器將URL內容傳遞給解析器進行網頁的解析
  • 解析之後將價值數據和新的URL列表傳給調度器
  • 一方面調度器會將價值數據傳遞給應用進行數據的收集
  • 另一方面將新的URL列表補充進URL管理器
  • 如果URL管理器中還有未爬取的URL,那麼將會一直執行上面的循環,直到爬取完所有URL
  • 最後調度器會調用應用的方法將價值數據進行輸出,將價值數據輸出到需要的格式

各組件詳解

URL管理器

  • URL管理器用來管理待抓取URL集合和已抓取URL集合
  • 防止重複抓取和循環抓取
    • 因爲每個網頁都有很多指向其他網頁的URL
    • 其他網頁也有指向本網頁的URL,就可能存在URL循環指向的問題
  • URL管理器需要支持的最小功能範圍
    • 添加新的URL到待爬取集合中
    • 判斷待添加的URL是否已經存在容器中
    • 從容器中獲取一個待爬取的URL
    • 判斷容器中還有沒有待爬取的URL
    • 將URL從待爬取集合移動到已爬取集合

URL管理器實現方式介紹:

  1. 將已爬取和未爬取的URL集合都存儲在內存中:使用Python的set類型,因爲Python的set類型可以自動去除集合中重複的數據元素
  2. 使用關係數據庫:比如在MySQL中建立一張表
  3. 緩存數據庫,比如使用redis,redis本身就支持set數據結構。目前大型的網絡公司因爲redis的性能比較高,一般都使用redis。

網頁下載器

  • 使用Python自帶的urllib2模塊或其他下載庫

  • 將互聯網上URL對應的網頁下載到本地的工具,因爲將網頁下載到本地才能進行後續的分析和處理

  • 類似於網頁瀏覽器,將URL對應的網頁下載到本地存儲爲本地文件或者內存字符串,然後才能進行分析

  • urllib2模塊:

    • 支持直接的URL網頁下載
    • 或者向網頁發送一些需要用戶輸入的數據
    • 甚至支持需要登錄網頁的cookie處理、需要代理訪問的代理處理
  • requests:第三方插件,功能更強大

網頁解析器

可以使用正則表達式、html.parser、BeautifulSoup、lxml 等實現方式。

本人一般使用 xpath 的方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章