你懂Scrapy嗎?Scrapy大型爬蟲框架講解【一】

0. 前言

這是Scrapy爬蟲框架的第一篇,本系列專題將包含以下內容:

  • 介紹Scrapy框架的主體以及各個組件的意義;

  • 舉實例講解其具體應用。

開始第一節:介紹Scrapy框架的主體以及各個組件的意義。

本節主要內容概要為:

  • 介紹Scrapy的安裝,功能以及各組件的作用
  • 使用Scrapy的一些經驗和心得。

1. 介紹Scrapy的安裝,功能以及各組件的作用

1.1 概述

Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。 可以應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。

其最初是為了 頁面抓取 (更確切來說, 網路抓取 )所設計的, 也可以應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網路爬蟲。

1.2 安裝

安裝Scrapy需要一些依賴:

  • Python

  • Python Package: pip and setuptools. 現在 pip 依賴 setuptools ,如果未安裝,則會自動安裝setuptools 。

  • lxml. 大多數Linux發行版自帶了lxml。如果缺失,請查看Installing lxml

  • OpenSSL. 除了Windows(請查看 平台安裝指南)之外的系統都已經提供。

當安裝好這些依賴之後,只需要運行pip install Scrapy,即可安裝完Scrapy。

1.3 scrapy代碼目錄

然後運行:

scrapy startproject tutorialn

即可自動創建官方標準的代碼目錄。

tutorial/n scrapy.cfgn tutorial/n __init__.pyn items.pyn pipelines.pyn settings.pyn spiders/n __init__.pyn ...n

其中:

  • tutorial/: 該項目的python總模塊。
  • tutorial/items.py: 項目中的item文件,編寫爬取的欄位名稱等;
  • tutorial/pipelines.py: 項目中的pipelines文件;
  • tutorial/settings.py: 項目的設置文件,較為重要;
  • tutorial/spiders/: 放置spider代碼的主目錄;

1.4 Scrapy整體架構流程

Scrapy整體架構神圖:

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,引擎關閉該網站。

2. 使用Scrapy的一些經驗和心得

以上是老生常談,下面談一些經驗:

  1. 如果需要大批量分散式爬取,建議採用Redis資料庫存儲,可安裝scrapy-redis,使用redis資料庫來替換scrapy原本使用的隊列結構(deque),並配合其它資料庫存儲,例如MySQL或者MongoDB,爬取效率將會極大提高。並且其自帶的dupefilter.py負責執行requst的去重,使用redis的set數據結構,通過settings文件正確設置後,即便停止scrapy爬蟲,當下次重新開始後也能自動去重。原因就是在redis已經存儲了request的信息。

  2. 當涉及到代理IP,Headers頭中間請求信息處理的時候,可以通過中間件Middleware來實現。Spider中間件是介入到Scrapy的spider處理機制的鉤子框架,可以添加代碼來處理髮送給 Spiders的response及spider產生的item和request。
  3. 合理設置settings文件,需要熟練掌握settings的各種設置。
  4. 可以重新定義def start_requests(self)函數來載入cookie信息,form信息的提交用scrapy.FormRequest以及scrapy.FormRequest.from_response這兩個函數,scrapy.FormRequest.from_response能實現自動提交form數據。
  5. 採用Scrapy+phantomJS,。 downloadMiddleware 對從 scheduler 送來的 Request 對象在請求之前進行預處理,可以實現添加 headers, user_agent,還有 cookie 等功能 。但也可以通過中間件直接返回 HtmlResponse 對象,略過請求的模塊,直接扔給 response 的回調函數處理。

class CustomMetaMiddleware(object):n def process_request(self,request,spider):n dcap = dict(DesiredCapabilities.PHANTOMJS) n dcap["phantomjs.page.settings.loadImages"] = False n dcap["phantomjs.page.settings.resourceTimeout"] = 10n driver = webdriver.PhantomJS("D:xxxx",desired_capabilities=dcap)n driver.get(request.url)n body = driver.page_source.encode(utf8)n url = driver.current_urln driver.quit()n return HtmlResponse(request.url,body=body)n

綜上,是對Scrapy的各個組件一些個人的經驗總結。

3. 尾言

下一篇,我們通過一個稍微複雜一些的實例實戰演習scrapy的具體應用。

敬請期待~

歡迎關注我的微信公眾號:一隻IT汪。我將不定期分享和更新各種IT資源。

再次感謝!


推薦閱讀:

【記錄】Scrapy模擬登錄cookie失效問題
如何用scrapy爬取搜房網上小區的坐標值?
基於Scrapy如何寫一個爬蟲抓取藝龍、攜程等網站的機票價格進行分析並做機票價格預測?
為什麼覺得Scrapy很難?
Python安裝Scrapy出現以下錯誤怎麼辦?

TAG:Python | scrapy | 爬虫 |