作者:蚍蜉撼大樹

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

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

  2. 舉實例講解其具體應用。

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

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

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

安裝Scrapy需要一些依賴:

  • Python

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

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

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

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

然後運行:

scrapy startproject tutorial

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

tutorial/
    scrapy.cfg
    tutorial/
        __init__. py 
        items . py 
        pipelines. py 
        settings. py
        spiders/
            __init__. py 
            ...

其中:

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

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

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

  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) : 
    def  process_request (self,request,spider) :
        dcap = dict(DesiredCapabilities.PHANTOMJS)     
        dcap[ "phantomjs.page.settings.loadImages" ] = False   
        dcap[ "phantomjs.page.settings.resourceTimeout" ] = 10 
        driver = webdriver.PhantomJS( "D:xx\xx" ,desired_capabilities=dcap)
        driver.get(request.url)
        body = driver.page_source.encode( 'utf8' )
        url = driver.current_url
        driver.quit()
        return HtmlResponse(request.url,body=body)

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

via:知乎

End.

轉貼自: 36大數據


留下你的回應

以訪客張貼回應

0

在此對話中的人們

Popular Tags

I was checking continually this blog and I'm impressed! To a great degree useful info exceptionally ...
Great Information sharing .. I am very happy to read this article .. thanks for giving us go through...
Great blog this is so interesting information i have read this article thank you so much for sharing...
This is a wonderful article, Given so much info in it, These type of articles keeps the users intere...
Some days you eat what's on your plate and move on, while others it's like your stomach is an empty ...