scrapy框架的學習,目前個人覺得比較詳盡的資料主要有兩個:
1.官方教程文檔、scrapy的github wiki;
2.一個很好的scrapy中文文檔:[http://scrapy-chs.readthedocs.org/zh_CN/0.24/index.html](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/](http://sourceforge.net/projects/pywin32/files/),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7997941)。
(3) 安裝twisted
依賴幾個包:
- zope.interface:[https://pypi.python.org/pypi/zope.interface#download](https://pypi.python.org/pypi/zope.interface#download),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7997947),安裝后在cmd進入python shell,如果”import zope.interface“沒有問題說明安裝成功。
- pyOpenSSL:(注意對應python版本)[https://pypi.python.org/pypi/pyOpenSSL](https://pypi.python.org/pypi/pyOpenSSL),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7997953),安裝后在cmd進入python shell,如果”import OpenSSL”沒有問題說明安裝成功。
- twisted:(注意對應python版本)[http://twistedmatrix.com/trac/wiki/Downloads](http://twistedmatrix.com/trac/wiki/Downloads),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7997961)。安裝后在cmd進入python shell,如果”import twisted”沒有問題說明安裝成功。
(4) 安裝lxml:[https://pypi.python.org/pypi/lxml/](https://pypi.python.org/pypi/lxml/),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7997965),安裝后在cmd進入python shell,如果”import lxml”沒有問題說明安裝成功。
(5) 安裝scrapy:
- 通過easytool安裝,easytool下載:[http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11.win32-py2.7.exe](http://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11.win32-py2.7.exe),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7998115),安裝完后要將python安裝目錄下Scripts目錄路徑添加到系統變量中(就是**Path變量**D:\Python27\Scripts)。
- 下載scrapy:[https://pypi.python.org/pypi/Scrapy](https://pypi.python.org/pypi/Scrapy),或者[點擊這里下載](http://download.csdn.net/detail/dianacody/7997969),下載完后,在D:\Python27,解壓出來(有個dist文件夾,里面有Scrapy-0.24.2.tar文件),運行cmd,cd到該解壓目錄下,在cmd中輸入”easy_install Scrapy”,完成scrapy的安裝,然后在cmd中,cd D:\Python27,輸入scrapy進行驗證,如果下圖,則安裝成功。

###2.linux安裝
可以按照這里的方法安裝:(轉載[http://www.cnblogs.com/HelloPython/](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路徑表達式:
<table border="1" cellspacing="0" cellpadding="0" width="527"><tbody><tr><td valign="top"><p><strong>表達式</strong></p></td><td valign="top"><p><strong>描述</strong></p></td></tr><tr><td valign="top"><p>nodename</p></td><td valign="top"><p>選取此節點的所有子節點</p></td></tr><tr><td valign="top"><p>/</p></td><td valign="top"><p>從根節點選取</p></td></tr><tr><td valign="top"><p>//</p></td><td valign="top"><p>從匹配選擇的當前節點選擇文檔中的節點,不考慮它們的位置</p></td></tr><tr><td valign="top"><p>.</p></td><td valign="top"><p>選取當前節點</p></td></tr><tr><td valign="top"><p>..</p></td><td valign="top"><p>選取當前節點的父節點</p></td></tr><tr><td valign="top"><p>@</p></td><td valign="top"><p>選取屬性</p></td></tr></tbody></table>
?
關于選擇器,這個再下一篇python系列五當中會提到具體實例應用,這里暫且先寫到這里。
原創文章,轉載請注明出處[http://blog.csdn.net/dianacody/article/details/39743379](http://blog.csdn.net/dianacody/article/details/39743379)
- 前言
- 【java】微博爬蟲(一):小試牛刀——網易微博爬蟲(自定義關鍵字爬取微博數據)(附軟件源碼)
- 【java】微博爬蟲(二):如何抓取HTML頁面及HttpClient使用
- 【java】微博爬蟲(三):庖丁解牛——HTML結構分析與正則切分
- 【java】微博爬蟲(四):數據處理——jsoup工具解析html、dom4j讀寫xml
- 【java】微博爬蟲(五):防止爬蟲被墻的幾個技巧(總結篇)
- 【python】網絡爬蟲(一):python爬蟲概述
- 【python】網絡爬蟲(二):網易微博爬蟲軟件開發實例(附軟件源碼)
- 【python】網絡爬蟲(三):模擬登錄——偽裝瀏覽器登錄爬取過程
- 【python】網絡爬蟲(四):scrapy爬蟲框架(架構、win/linux安裝、文件結構)
- 【python】網絡爬蟲(五):scrapy爬蟲初探——爬取網頁及選擇器
- 打包python文件為exe文件(PyInstaller工具使用方法)