這是一款提取網站資料的開源工具。scrapy架構用python開發而成,它使抓取工作又快又簡單,且可擴充。我們已經在virtual box中建立一台虛拟機(vm)并且在上面安裝了ubuntu 14.04 lts。
<a target="_blank"></a>
scrapy依賴于python、開發庫和pip。python最新的版本已經在ubuntu上預裝了。是以我們在安裝scrapy之前隻需安裝pip和python開發庫就可以了。
pip是作為python包索引器easy_install的替代品,用于安裝和管理python包。pip包的安裝可見圖 1。
<code>sudo apt-get install python-pip</code>
圖:1 pip安裝
我們必須要用下面的指令安裝python開發庫。如果包沒有安裝那麼就會在安裝scrapy架構的時候報關于python.h頭檔案的錯誤。
<code>sudo apt-get install python-dev</code>
圖:2 python 開發庫
scrapy架構既可從deb包安裝也可以從源碼安裝。在圖3中我們用pip(python 包管理器)安裝了deb包了。
<code>sudo pip install scrapy</code>
圖:3 scrapy 安裝
圖4中scrapy的成功安裝需要一些時間。
圖:4 成功安裝scrapy架構
我們将用scrapy從fatwallet.com上提取商店名稱(賣卡的店)。首先,我們使用下面的指令建立一個scrapy項目“store name”, 見圖5。
<code>$sudo scrapy startproject store_name</code>
圖:5 scrapy架構建立項目
上面的指令在目前路徑建立了一個“store_name”的目錄。項目主目錄下包含的檔案/檔案夾見圖6。
<code>$sudo ls –lr store_name</code>
圖:6 store_name項目的内容
每個檔案/檔案夾的概要如下:
scrapy.cfg 是項目配置檔案
store_name/ 主目錄下的另一個檔案夾。 這個目錄包含了項目的python代碼
store_name/items.py 包含了将由蜘蛛爬取的項目
store_name/pipelines.py 是管道檔案
store_name/settings.py 是項目的配置檔案
store_name/spiders/, 包含了用于爬取的蜘蛛
由于我們要從fatwallet.com上如提取店名,是以我們如下修改檔案(lctt 譯注:這裡沒說明是哪個檔案,譯者認為應該是 items.py)。
<code>import scrapy</code>
<code></code>
<code>class storenameitem(scrapy.item):</code>
<code>name = scrapy.field() # 取出卡片商店的名稱</code>
之後我們要在項目的store_name/spiders/檔案夾下寫一個新的蜘蛛。蜘蛛是一個python類,它包含了下面幾個必須的屬性:
蜘蛛名 (name )
爬取起點url (start_urls)
包含了從響應中提取需要内容相應的正規表達式的解析方法。解析方法對爬蟲而言很重要。
我們在storename/spiders/目錄下建立了“storename.py”爬蟲,并添加如下的代碼來從fatwallet.com上提取店名。爬蟲的輸出寫到檔案(storename.txt)中,見圖7。
<code>from scrapy.selector import selector</code>
<code>from scrapy.spider import basespider</code>
<code>from scrapy.http import request</code>
<code>from scrapy.http import formrequest</code>
<code>import re</code>
<code>class storenameitem(basespider):</code>
<code>name = "storename"</code>
<code>allowed_domains = ["fatwallet.com"]</code>
<code>start_urls = ["http://fatwallet.com/cash-back-shopping/"]</code>
<code>def parse(self,response):</code>
<code>output = open('storename.txt','w')</code>
<code>resp = selector(response)</code>
<code>tags = resp.xpath('//tr[@class="storelistrow"]|\</code>
<code>//tr[@class="storelistrow even"]|\</code>
<code>//tr[@class="storelistrow even last"]|\</code>
<code>//tr[@class="storelistrow last"]').extract()</code>
<code>for i in tags:</code>
<code>i = i.encode('utf-8', 'ignore').strip()</code>
<code>store_name = ''</code>
<code>if re.search(r"class=\"storeliststorename\">.*?<",i,re.i|re.s):</code>
<code>store_name = re.search(r"class=\"storeliststorename\">.*?<",i,re.i|re.s).group()</code>
<code>store_name = re.search(r">.*?<",store_name,re.i|re.s).group()</code>
<code>store_name = re.sub(r'>',"",re.sub(r'<',"",store_name,re.i))</code>
<code>store_name = re.sub(r'&amp;',"&",re.sub(r'&amp;',"&",store_name,re.i))</code>
<code>#print store_name</code>
<code>output.write(store_name+""+"\n")</code>
圖:7 爬蟲的輸出
注意: 本教程的目的僅用于了解scrapy架構
----------------------------------------------------------------------------------------------------------------------------