【網絡爬蟲】【python】網絡爬蟲(四):scrapy爬蟲框架(架構、win/linux安裝、文件結構)

        scrapy框架的學習,目前個人覺得比較詳盡的資料主要有兩個:

1.官方教程文檔、scrapy的github wiki;

2.一個很好的scrapy中文文檔:http://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html

        剩下的就是網上其他的一些demo。

 

一、scrapy框架結構

        還是先上個圖吧,這個圖幾乎在網上一搜scrapy隨處可見,其實它很好地反應了這個框架的運作流程及各個組件之間交互的過程。



        scrapy之所以能作爲框架,是因爲其抽取了普通爬蟲的共同特徵和基本原理並加以封裝,有沒有發現其實我們之前寫的各種爬蟲,原理其實都大同小異?什麼抓頁面、存儲、解析頁面、提取特徵信息……爬蟲就這麼幾個步驟,當然工業界的爬蟲可能還要考慮更多比如爬蟲效率、穩定性、分佈式爬蟲協調、兼容、信息清洗判重、數據結構化存儲等等。一般程序員的習慣是在寫過程序之後總想着重構一下,抽出一些公共的方法將其模板化,下次再用時就方便了。是的,你當然可以將自己寫過的代碼重構,但是這些工作早就有人幫做好了,直接拿來用甚至還比你自己寫的要方便:“scrapy是一套基於Twisted的異步處理框架,是純python實現的爬蟲框架,用戶只需要定製開發幾個模塊就可以輕鬆的實現一個爬蟲”。並且其優秀的思想也是值得借鑑的——入門階段:學會怎麼使用scrapy,調用其接口能完成一個爬蟲的功能;提高階段:研究scrapy的源碼也很有必要,看看一個優秀的爬蟲框架是怎麼寫的。

 

scrapy的幾個組件:

(1) Scrapy Engine(引擎):整體驅動數據流和控制流,觸發事務處理。

(2) Scheduler(調度):維護一個引擎與其交互的請求隊列,引擎發出請求後返還給它們。

(3) Downloader(下載器):下載網頁,將網頁給蜘蛛Spider.

(4) Spider(蜘蛛):這個是核心,一個蜘蛛能處理一個域名或一組域名,作用是定義特定網站的抓取和解析規則。定義對於不同網頁結構,處理的方式也不一樣,需要定義不同的蜘蛛。

        蜘蛛抓取流程:

  • step1:調用start_requests()獲取第一個url請求,請求返回後調取回調函數parse。
  • step2:回調函數中解析網頁,返回項目對象請求對象兩者的迭代。請求也包含一個回調,然後被scrapy下載,然後指定其他回調處理。
  • step3:回調函數parse()中解析網頁,方法:Xpath選擇器(或者可以用BeautifulSoup, lxml等),生成解析的數據項。
  • step4:蜘蛛spider返回項目給項目管道Item Pipeline。

(5) Item Pipeline(項目管道):處理蜘蛛解析過後的數據結果,清洗、驗證、存儲數據,存放給item字段field。

(6) Downloader middlewares(下載器中間件):引擎與下載器之間的鉤子框架,處理引擎與下載器之間的請求/響應。可以自定義代碼擴展scrapy

(7) Spider middlewares(蜘蛛中間件):引擎與蜘蛛之間的鉤子框架,處理蜘蛛的響應輸入/請求輸出。可以自定義代碼擴展scrapy

(8) Scheduler middlewares(調度中間件):引擎與調度之間的中間件,處理引擎與調度的請求/響應。可以自定義代碼擴展scrapy

 

二、Scrapy安裝(win/linux)

        搭建scrapy框架需要的幾個模塊:python2.7.6, pywin32, twisted(zope.interface + pyOpenSSL + twisted),lxml, scrapy(安裝之前要安裝easytool)

1.windows安裝

(1) 安裝python 2.7:官網下載安裝包,雙擊運行,最後需要將python安裝目錄添加到系統變量裏,然後才能在控制檯進入python shell。

(2) 安裝pywin32:注意對應python版本,下載地址:http://sourceforge.net/projects/pywin32/files/,或者點擊這裏下載

(3) 安裝twisted

依賴幾個包:

(4) 安裝lxml:https://pypi.python.org/pypi/lxml/,或者點擊這裏下載,安裝後在cmd進入python shell,如果”import lxml”沒有問題說明安裝成功。

(5) 安裝scrapy:



2.linux安裝

        可以按照這裏的方法安裝:(轉載http://www.cnblogs.com/HelloPython/

第一步:爲了安裝這個packages,在ubuntu下運行lsb_release -cs,顯示



第二步:現在需要做的就是用vi添加deb http://archive.scrapy.org/ubuntu precise main 到 /etc/apt/sources.list中去



第三步:然後運行 curl -s http://archive.scrapy.org/ubuntu/archive.key | sudo apt-key add-

第四步:再更新源sudo apt-get update

第五步:最後安裝  sudo apt-get install scrapy-0.1X,可選擇不同版本,我安裝的是0.16



三、scrapy文件結構

1.新建scrapy項目

        設定項目名稱爲mytest,cd到需要創建項目的目錄:scrapy startproject mytest,會自動生成目錄結構,如下:

	mytest/  
	    scrapy.cfg  #-------------------項目配置文件
	    mytest/  
	        __init__.py  
	        items.py     #-------項目數據字段文件
	        pipelines.py  #-------項目管道文件
	        settings.py  #---------項目配置文件
	        spiders/    #----------項目存放蜘蛛的目錄
	            __init__.py  
	            ...  

2.文件結構

(1) item.py:項目數據字段文件,定義需要的數據段,這些字段即爲爬取下來數據中提取的,可以通過定義Item類實現。

from scrapy.item import Item, Field
class MyItem(Item):
    userid = Field()
    username = Field()
    tweeted = Field()
    time = Field()

(2) spider.py:用戶自定義蜘蛛,其中:

  • name:網絡蜘蛛名稱,要唯一
  • start_urls:是網絡蜘蛛開始爬取第一個url,可以包括多個url。
  • parse()函數: 網絡蜘蛛爬取後response的對象。負責解析響應數據,是spider函數抓到第一個網頁以後默認調用的callback,避免使用個這個名字來定義自己的方法。

from scrapy.spider import BaseSpider
class MySpider(BaseSpider):
name = "myspider"
allowed_domains = ["sina.com"]
start_urls = ["http://www.sina.com",
              "http://www.sina.com/news"
	         ]
def parse(self, response):   #--------------------這就是callback回調函數
    filename = response.url.split("/")[-2]
    open(filename, 'wb').write(response.body)

(3) pipeline.py:管道文件,接收item各字段對應數據,放到數據庫mongodb或mysqldb

(4) setting.py:配置信息


3.spider的選擇器Xpath(解析網頁)

(1) 選擇器的四個基本方法

xpath():返回一個選擇器列表,每個代表xpath選擇的,當於正則解析

css():返回一選擇器列表,每個代表css選擇的。

extract():返回一個unicode字符串。

re():返回一個unicode字符串從正則表達式中選出的。

 

(2) 幾個xpath例子

/html/head/title: 選擇所有<head>標籤內部的<title>標籤內容

/html/head/title/text(): 選擇所有的位於<title>標籤內部的<text>標籤(文本)內容

//td: 選擇所有的<td>元素

//div[@class="mine"]: 選擇所有包含class=”mine“屬性的div標籤元素


(3) xpath路徑表達式:

表達式

描述

nodename

選取此節點的所有子節點

/

從根節點選取

//

從匹配選擇的當前節點選擇文檔中的節點,不考慮它們的位置

.

選取當前節點

..

選取當前節點的父節點

@

選取屬性

  

關於選擇器,這個再下一篇python系列五當中會提到具體實例應用,這裏暫且先寫到這裏。


原創文章,轉載請註明出處http://blog.csdn.net/dianacody/article/details/39743379


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