Scrapy開發

最近要開發一個軟件須要爬取網站信息,因而選擇了python 和scrapy下面作一下簡單介紹:Scrapy安裝鏈接,scrapy官網鏈接html

所謂網絡爬蟲,就是一個在網上處處或定向抓取數據的程序,固然,這種說法不夠專業,更專業的描述就是,抓取特定網站網頁的HTML數據。不過因爲一個網站的網頁不少,而咱們又不可能事先知道全部網頁的URL地址,因此,如何保證咱們抓取到了網站的全部HTML頁面就是一個有待考究的問題了。python

通常的方法是,定義一個入口頁面,而後通常一個頁面會有其餘頁面的URL,因而從當前頁面獲取到這些URL加入到爬蟲的抓取隊列中,而後進入到新新頁面後再遞歸的進行上述的操做,其實說來就跟深度遍歷或廣度遍歷同樣。正則表達式

上面介紹的只是爬蟲的一些概念而非搜索引擎,實際上搜索引擎的話其系統是至關複雜的,爬蟲只是搜索引擎的一個子系統而已。下面介紹一個開源的爬蟲框架Scrapy。shell

1、概述
數據庫

Scrapy是一個用 Python 寫的 Crawler Framework ,簡單輕巧,而且很是方便,而且官網上說已經在實際生產中在使用了,不過如今尚未 Release 版本,能夠直接使用他們的 Mercurial 倉庫裏抓取源碼進行安裝。json

Scrapy 使用 Twisted 這個異步網絡庫來處理網絡通信,架構清晰,而且包含了各類中間件接口,能夠靈活的完成各類需求。總體架構以下圖所示:api



綠線是數據流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載以後會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是須要進一步抓取的連接,例如以前分析的「下一頁」的連接,這些東西會被傳回 Scheduler ;另外一種是須要保存的數據,它們則被送到 Item Pipeline 那裏,那是對數據進行後期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還能夠安裝各類中間件,進行必要的處理。
網絡

入門:數據結構

本文參考Scrapy Tutorial裏面的文檔,翻譯出來加上本身的理解,供你們學習。架構

在本文中,咱們將學會如何使用Scrapy創建一個爬蟲程序,並爬取指定網站上的內容,這一切在Scrapy框架內實現將是很簡單輕鬆的事情。

本教程主要內容包括一下四步:

1. 建立一個新的Scrapy Project
2. 定義你須要從網頁中提取的元素Item
3. 實現一個Spider類,經過接口完成爬取URL和提取Item的功能
4. 實現一個Item PipeLine類,完成Item的存儲功能

新建工程

首先,爲咱們的爬蟲新建一個工程,首先進入一個目錄(任意一個咱們用來保存代碼的目錄),執行:

[python]  view plain copy
  1. scrapy startproject Domz  


最後的Domz就是項目名稱。這個命令會在當前目錄下建立一個新目錄Domz,結構以下:

[python]  view plain copy
  1. dmoz/  
  2.    scrapy.cfg     
  3.    dmoz/  
  4.        __init__.py  
  5.        items.py  
  6.        pipelines.py  
  7.        settings.py  
  8.        spiders/  
  9.            __init__.py  

scrapy.cfg: 項目配置文件

items.py: 須要提取的數據結構定義文件
pipelines.py: 管道定義,用來對items裏面提取的數據作進一步處理,如保存等
settings.py: 爬蟲配置文件
spiders: 放置spider的目錄

定義Item

在items.py裏面定義咱們要抓取的數據:

[python]  view plain copy
  1. from scrapy.item import Item, Field  
  2.    
  3. class DmozItem(Item):  
  4.    title = Field()  
  5.    link = Field()  
  6.    desc = Field()  


這裏咱們須要獲取dmoz頁面上的標題,連接,描述,因此定義一個對應的items結構,不像Django裏面models的定義有那麼多種類的Field,這裏只有一種就叫Field(),再複雜就是Field能夠接受一個default值。

實現Spider

spider只是一個繼承字scrapy.spider.BaseSpider的Python類,有三個必需的定義的成員

name: 名字,這個spider的標識
start_urls: 一個url列表,spider從這些網頁開始抓取
parse(): 一個方法,當start_urls裏面的網頁抓取下來以後須要調用這個方法解析網頁內容,同時須要返回下一個須要抓取的網頁,或者返回items列表

因此在spiders目錄下新建一個spider,dmoz_spider.py:

[python]  view plain copy
  1. class DmozSpider(BaseSpider):  
  2.    name = "dmoz.org"  
  3.    start_urls = [  
  4.        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",  
  5.        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"  
  6.    ]  
  7.    
  8.    def parse(self, response):  
  9.        filename = response.url.split("/")[-2]  
  10.        open(filename, 'wb').write(response.body)  


提取Item

提取數據到Items裏面,主要用到XPath提取網頁數據:

scrapy有提供兩個XPath選擇器,HtmlXPathSelector和XmlXPathSelector,一個用於HTML,一個用於XML,XPath選擇器有三個方法

select(xpath): 返回一個相對於當前選中節點的選擇器列表(一個XPath可能選到多個節點)
extract(): 返回選擇器(列表)對應的節點的字符串(列表)
re(regex): 返回正則表達式匹配的字符串(分組匹配)列表
一種很好的方法是在Shell裏面對XPath進行測試:

[python]  view plain copy
  1. scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/  

如今修改parse()方法看看如何提取數據到items裏面去:

[python]  view plain copy
  1. def parse(self, response):  
  2.       hxs = HtmlXPathSelector(response)  
  3.       sites = hxs.select('//ul/li')  
  4.       items = []  
  5.       for site in sites:  
  6.           item = DmozItem()  
  7.           item['title'] = site.select('a/text()').extract()  
  8.           item['link'] = site.select('a/@href').extract()  
  9.           item['desc'] = site.select('text()').extract()  
  10.           items.append(item)  
  11.       return items  


實現PipeLine

PipeLine用來對Spider返回的Item列表進行保存操做,能夠寫入到文件、或者數據庫等。

PipeLine只有一個須要實現的方法:process_item,例如咱們將Item保存到一個文件中:

[python]  view plain copy
  1. def __init__(self):  
  2.     self.file = open('jingdong.txt''wb')  
  3.    
  4. def process_item(self, item, spider):  
  5.     self.file.write(item['title'] + '\t'+ item['link'] + '\t' + item['desc']+'\n')  


到如今,咱們就完成了一個基本的爬蟲的實現,能夠輸入下面的命令來啓動這個Spider:

[python]  view plain copy
  1. scrapy crawl dmoz.org  


Scrapy之URL解析與遞歸爬取:


前面介紹了Scrapy如何實現一個最簡單的爬蟲,可是這個Demo裏只是對一個頁面進行了抓取。在實際應用中,爬蟲一個重要功能是」發現新頁面」,而後遞歸的讓爬取操做進行下去。

發現新頁面的方法很簡單,咱們首先定義一個爬蟲的入口URL地址,好比Scrapy入門教程中的start_urls,爬蟲首先將這個頁面的內容抓取以後,解析其內容,將全部的連接地址提取出來。這個提取的過程是很簡單的,經過一個html解析庫,將這樣的節點內容提取出來,href參數的值就是一個新頁面的URL。獲取這個URL值以後,將其加入到任務隊列中,爬蟲不斷的從隊列中取URL便可。這樣,只須要爲爬蟲定義一個入口的URL,那麼爬蟲就可以自動的爬取到指定網站的絕大多數頁面。

固然,在具體的實現中,咱們還須要對提取的URL作進一步處理:

1. 判斷URL指向網站的域名,若是指向的是外部網站,那麼能夠將其丟棄
2. URL去重,能夠將全部爬取過的URL存入數據庫中,而後查詢新提取的URL在數據庫中是否存在,若是存在的話,固然就無需再去爬取了。

下面介紹一下如何在Scrapy中完成上述這樣的功能。

咱們只須要改寫spider的那個py文件便可,修改parse()方法代碼以下:

[python]  view plain copy
  1. from scrapy.selector import HtmlXPathSelector  
  2.    
  3. def parse(self, response):  
  4.     hxs = HtmlXPathSelector(response)  
  5.     items = []  
  6.    
  7.     newurls = hxs.select('//a/@href').extract()  
  8.     validurls = []  
  9.         for url in newurls:  
  10.                 #判斷URL是否合法  
  11.                 if true:  
  12.                         validurls.append(url)  
  13.    
  14.         items.extend([self.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])  
  15.    
  16.         sites = hxs.select('//ul/li')  
  17.         items = []  
  18.         for site in sites:  
  19.                 item = DmozItem()  
  20.                 item['title'] = site.select('a/text()').extract()  
  21.                 item['link'] = site.select('a/@href').extract()  

新建工程

在抓取以前,你須要新建一個Scrapy工程。進入一個你想用來保存代碼的目錄,而後執行:

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

T:\>scrapy startproject tutorial
T:\>

這個命令會在當前目錄下建立一個新目錄tutorial,它的結構以下:

複製代碼
T:\tutorial>tree /f
Folder PATH listing
Volume serial number is 0006EFCF C86A:7C52
T:.
│  scrapy.cfg
│
└─tutorial
    │  items.py
    │  pipelines.py
    │  settings.py
    │  __init__.py
    │
    └─spiders
            __init__.py
複製代碼

這些文件主要是:

  • scrapy.cfg: 項目配置文件
  • tutorial/: 項目python模塊, 呆會代碼將從這裏導入
  • tutorial/items.py: 項目items文件
  • tutorial/pipelines.py: 項目管道文件
  • tutorial/settings.py: 項目配置文件
  • tutorial/spiders: 放置spider的目錄

 

定義Item

Items是將要裝載抓取的數據的容器,它工做方式像python裏面的字典,但它提供更多的保護,好比對未定義的字段填充以防止拼寫錯誤。

它經過建立一個scrapy.item.Item類來聲明,定義它的屬性爲scrpy.item.Field對象,就像是一個對象關係映射(ORM). 
咱們經過將須要的item模型化,來控制從dmoz.org得到的站點數據,好比咱們要得到站點的名字,url和網站描述,咱們定義這三種屬性的域。要作到這點,咱們編輯在tutorial目錄下的items.py文件,咱們的Item類將會是這樣

from scrapy.item import Item, Field 
class DmozItem(Item):
    title = Field()
    link = Field()
    desc = Field()

剛開始看起來可能會有些困惑,可是定義這些item能讓你用其餘Scrapy組件的時候知道你的 items究竟是什麼。

 

 

咱們的第一個爬蟲(Spider)

Spider是用戶編寫的類,用於從一個域(或域組)中抓取信息。

他們定義了用於下載的URL的初步列表,如何跟蹤連接,以及如何來解析這些網頁的內容用於提取items。

要創建一個Spider,你必須爲scrapy.spider.BaseSpider建立一個子類,並肯定三個主要的、強制的屬性:

  • name:爬蟲的識別名,它必須是惟一的,在不一樣的爬蟲中你必須定義不一樣的名字.
  • start_urls:爬蟲開始爬的一個URL列表。爬蟲從這裏開始抓取數據,因此,第一次下載的數據將會從這些URLS開始。其餘子URL將會從這些起始URL中繼承性生成。
  • parse():爬蟲的方法,調用時候傳入從每個URL傳回的Response對象做爲參數,response將會是parse方法的惟一的一個參數,

這個方法負責解析返回的數據、匹配抓取的數據(解析爲item)並跟蹤更多的URL。

 

這是咱們的第一隻爬蟲的代碼,將其命名爲dmoz_spider.py並保存在tutorial\spiders目錄下。

複製代碼
from scrapy.spider import BaseSpider

class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
    ]

    def parse(self, response):
        filename = response.url.split("/")[-2]
        open(filename, 'wb').write(response.body)
複製代碼

 

爲了讓咱們的爬蟲工做,咱們返回項目主目錄執行如下命令

T:\tutorial>scrapy crawl dmoz

crawl dmoz 命令從dmoz.org域啓動爬蟲。 你將會得到以下相似輸出 

複製代碼
T:\tutorial>scrapy crawl dmoz
2012-07-13 19:14:45+0800 [scrapy] INFO: Scrapy 0.14.4 started (bot: tutorial)
2012-07-13 19:14:45+0800 [scrapy] DEBUG: Enabled extensions: LogStats, TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2012-07-13 19:14:45+0800 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats
2012-07-13 19:14:45+0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2012-07-13 19:14:45+0800 [scrapy] DEBUG: Enabled item pipelines:
2012-07-13 19:14:45+0800 [dmoz] INFO: Spider opened
2012-07-13 19:14:45+0800 [dmoz] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2012-07-13 19:14:45+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2012-07-13 19:14:45+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2012-07-13 19:14:46+0800 [dmoz] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: None)
2012-07-13 19:14:46+0800 [dmoz] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)
2012-07-13 19:14:46+0800 [dmoz] INFO: Closing spider (finished)
2012-07-13 19:14:46+0800 [dmoz] INFO: Dumping spider stats:
        {'downloader/request_bytes': 486,
         'downloader/request_count': 2,
         'downloader/request_method_count/GET': 2,
         'downloader/response_bytes': 13063,
         'downloader/response_count': 2,
         'downloader/response_status_count/200': 2,
         'finish_reason': 'finished',
         'finish_time': datetime.datetime(2012, 7, 13, 11, 14, 46, 703000),
         'scheduler/memory_enqueued': 2,
         'start_time': datetime.datetime(2012, 7, 13, 11, 14, 45, 500000)}
2012-07-13 19:14:46+0800 [dmoz] INFO: Spider closed (finished)
2012-07-13 19:14:46+0800 [scrapy] INFO: Dumping global stats:
        {}
複製代碼

注意包含 [dmoz]的行 ,那對應着咱們的爬蟲。你能夠看到start_urls中定義的每一個URL都有日誌行。由於這些URL是起始頁面,因此他們沒有引用(referrers),因此在每行的末尾你會看到 (referer: <None>). 
有趣的是,在咱們的 parse  方法的做用下,兩個文件被建立:分別是 Books 和 Resources,這兩個文件中有URL的頁面內容。 

發生了什麼事情?

Scrapy爲爬蟲的 start_urls屬性中的每一個URL建立了一個 scrapy.http.Request 對象 ,並將爬蟲的parse 方法指定爲回調函數。 
這些 Request首先被調度,而後被執行,以後經過parse()方法,scrapy.http.Response 對象被返回,結果也被反饋給爬蟲。

 

 

提取Item

選擇器介紹

咱們有不少方法從網站中提取數據。Scrapy 使用一種叫作 XPath selectors的機制,它基於 XPath表達式。若是你想了解更多selectors和其餘機制你能夠查閱資料http://doc.scrapy.org/topics/selectors.html#topics-selectors 
這是一些XPath表達式的例子和他們的含義

  • /html/head/title: 選擇HTML文檔<head>元素下面的<title> 標籤。
  • /html/head/title/text(): 選擇前面提到的<title> 元素下面的文本內容
  • //td: 選擇全部 <td> 元素
  • //div[@class="mine"]: 選擇全部包含 class="mine" 屬性的div 標籤元素

這只是幾個使用XPath的簡單例子,可是實際上XPath很是強大。若是你想了解更多XPATH的內容,咱們向你推薦這個XPath教程http://www.w3schools.com/XPath/default.asp

爲了方便使用XPaths,Scrapy提供XPathSelector 類, 有兩種口味能夠選擇, HtmlXPathSelector (HTML數據解析) 和XmlXPathSelector (XML數據解析)。 爲了使用他們你必須經過一個 Response 對象對他們進行實例化操做。你會發現Selector對象展現了文檔的節點結構。所以,第一個實例化的selector必與根節點或者是整個目錄有關 。 
Selectors 有三種方法

  • select():返回selectors列表, 每個select表示一個xpath參數表達式選擇的節點.
  • extract():返回一個unicode字符串,該字符串爲XPath選擇器返回的數據
  • re(): 返回unicode字符串列表,字符串做爲參數由正則表達式提取出來

嘗試在shell中使用Selectors

爲了演示Selectors的用法,咱們將用到 內建的Scrapy shell,這須要系統已經安裝IPython (一個擴展python交互環境) 。

附IPython下載地址:http://pypi.python.org/pypi/ipython#downloads

要開始shell,首先進入項目頂層目錄,而後輸入

T:\tutorial>scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

輸出結果相似這樣:

複製代碼
2012-07-16 10:58:13+0800 [scrapy] INFO: Scrapy 0.14.4 started (bot: tutorial)
2012-07-16 10:58:13+0800 [scrapy] DEBUG: Enabled extensions: TelnetConsole, CloseSpider, WebService, CoreStats, SpiderState
2012-07-16 10:58:13+0800 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, RetryMiddleware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, ChunkedTransferMiddleware, DownloaderStats
2012-07-16 10:58:13+0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddleware, DepthMiddleware
2012-07-16 10:58:13+0800 [scrapy] DEBUG: Enabled item pipelines:
2012-07-16 10:58:13+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2012-07-16 10:58:13+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2012-07-16 10:58:13+0800 [dmoz] INFO: Spider opened
2012-07-16 10:58:18+0800 [dmoz] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)
[s] Available Scrapy objects:
[s]   hxs        <HtmlXPathSelector xpath=None data=u'<html><head><meta http-equiv="Content-Ty'>
[s]   item       {}
[s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   response   <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   settings   <CrawlerSettings module=<module 'tutorial.settings' from 'T:\tutorial\tutorial\settings.pyc'>>
[s]   spider     <DmozSpider 'dmoz' at 0x1f68230>
[s] Useful shortcuts:
[s]   shelp()           Shell help (print this help)
[s]   fetch(req_or_url) Fetch request (or URL) and update local objects
[s]   view(response)    View response in a browser
WARNING: Readline services not available or not loaded.WARNING: Proper color support under MS Windows requires the pyreadline library.
You can find it at:
http://ipython.org/pyreadline.html
Gary's readline needs the ctypes module, from:
http://starship.python.net/crew/theller/ctypes
(Note that ctypes is already part of Python versions 2.5 and newer).

Defaulting color scheme to 'NoColor'Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)]
Type "copyright", "credits" or "license" for more information.

IPython 0.13 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:
複製代碼

Shell載入後,你將得到迴應,這些內容被存儲在本地變量 response 中,因此若是你輸入response.body 你將會看到response的body部分,或者輸入response.headers 來查看它的 header部分。 
Shell也實例化了兩種selectors,一個是解析HTML的  hxs 變量,一個是解析 XML 的 xxs 變量。咱們來看看裏面有什麼:

複製代碼
In [1]: hxs.select('//title')
Out[1]: [<HtmlXPathSelector xpath='//title' data=u'<title>Open Directory - Computers: Progr'>]

In [2]: hxs.select('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']

In [3]: hxs.select('//title/text()')
Out[3]: [<HtmlXPathSelector xpath='//title/text()' data=u'Open Directory - Computers: Programming:'>]

In [4]: hxs.select('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']

In [5]: hxs.select('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']

In [6]:
複製代碼

 

 

提取數據

如今咱們嘗試從網頁中提取數據。 
你能夠在控制檯輸入 response.body, 檢查源代碼中的 XPaths 是否與預期相同。然而,檢查HTML源代碼是件很枯燥的事情。爲了使事情變得簡單,咱們使用Firefox的擴展插件Firebug。更多信息請查看Using Firebug for scraping 和Using Firefox for scraping.
txw1958注:事實上我用的是Google Chrome的Inspect Element功能,並且能夠提取元素的XPath。
檢查源代碼後,你會發現咱們須要的數據在一個 <ul>元素中,並且是第二個<ul>。 
咱們能夠經過以下命令選擇每一個在網站中的 <li> 元素:

hxs.select('//ul/li') 

而後是網站描述:

hxs.select('//ul/li/text()').extract()

網站標題:

hxs.select('//ul/li/a/text()').extract()

網站連接:

hxs.select('//ul/li/a/@href').extract()

如前所述,每一個select()調用返回一個selectors列表,因此咱們能夠結合select()去挖掘更深的節點。咱們將會用到這些特性,因此:


sites = hxs.select('//ul/li')
for site in sites:
    title = site.select('a/text()').extract()
    link = site.select('a/@href').extract()
    desc = site.select('text()').extract()
    print title, link, desc

 

Note 
更多關於嵌套選擇器的內容,請閱讀Nesting selectors 和 Working with relative XPaths

將代碼添加到爬蟲中:

txw1958注:代碼有修改,綠色註釋掉的代碼爲原教程的,你懂的

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector


class DmozSpider(BaseSpider):
    name = "dmoz"
    allowed_domains = ["dmoz.org"]
    start_urls = [
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]    
  
    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        sites = hxs.select('//fieldset/ul/li')
        #sites = hxs.select('//ul/li')
        for site in sites:
            title = site.select('a/text()').extract()
            link = site.select('a/@href').extract()
            desc = site.select('text()').extract()
            #print title, link, desc
            print title, link

如今咱們再次抓取dmoz.org,你將看到站點在輸出中被打印 ,運行命令

T:\tutorial>scrapy crawl dmoz

 

 

使用條目(Item)

Item 對象是自定義的python字典,使用標準字典相似的語法,你能夠獲取某個字段(即以前定義的類的屬性)的值:

>>> item = DmozItem() 
>>> item['title'] = 'Example title' 
>>> item['title'] 
'Example title' 

Spiders但願將其抓取的數據存放到Item對象中。爲了返回咱們抓取數據,spider的最終代碼應當是這樣:


from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from tutorial.items import DmozItem

class DmozSpider(BaseSpider):
   name = "dmoz"
   allowed_domains = ["dmoz.org"]
   start_urls = [
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
       "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
   ]

   def parse(self, response):
       hxs = HtmlXPathSelector(response)
       sites = hxs.select('//fieldset/ul/li')
       #sites = hxs.select('//ul/li')
       items = []
       for site in sites:
           item = DmozItem()
           item['title'] = site.select('a/text()').extract()
           item['link'] = site.select('a/@href').extract()
           item['desc'] = site.select('text()').extract()
           items.append(item)
       return items
複製代碼

如今咱們再次抓取 : 


2012-07-16 14:52:36+0800 [dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
        {'desc': [u'\n\t\t\t\n\t',
                  u' \n\t\t\t\n\t\t\t\t\t\n - Free Python books and tutorials.\n \n'],
         'link': [u'http://www.techbooksforfree.com/perlpython.shtml'],
         'title': [u'Free Python books']}
2012-07-16 14:52:36+0800 [dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
        {'desc': [u'\n\t\t\t\n\t',
                  u' \n\t\t\t\n\t\t\t\t\t\n - Annotated list of free online books on Python scripting language. Topics range from beginner to advanced.\n \n
          '],
         'link': [u'http://www.freetechbooks.com/python-f6.html'],
         'title': [u'FreeTechBooks: Python Scripting Language']}
2012-07-16 14:52:36+0800 [dmoz] DEBUG: Crawled (200) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: None)
2012-07-16 14:52:36+0800 [dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/>
        {'desc': [u'\n\t\t\t\n\t',
                  u' \n\t\t\t\n\t\t\t\t\t\n - A directory of free Python and Zope hosting providers, with reviews and ratings.\n \n'],
         'link': [u'http://www.oinko.net/freepython/'],
         'title': [u'Free Python and Zope Hosting Directory']}
2012-07-16 14:52:36+0800 [dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/>
        {'desc': [u'\n\t\t\t\n\t',
                  u' \n\t\t\t\n\t\t\t\t\t\n - Features Python books, resources, news and articles.\n \n'],
         'link': [u'http://oreilly.com/python/'],
         'title': [u"O'Reilly Python Center"]}
2012-07-16 14:52:36+0800 [dmoz] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/>
        {'desc': [u'\n\t\t\t\n\t',
                  u' \n\t\t\t\n\t\t\t\t\t\n - Resources for reporting bugs, accessing the Python source tree with CVS and taking part in the development of Python.\n\n'],
         'link': [u'http://www.python.org/dev/'],
         'title': [u"Python Developer's Guide"]}


 

保存抓取的數據

保存信息的最簡單的方法是經過Feed exports,命令以下:

T:\tutorial>scrapy crawl dmoz -o items.json -t json

全部抓取的items將以JSON格式被保存在新生成的items.json 文件中 在像本教程同樣的小型項目中,這些已經足夠。然而,若是你想用抓取的items作更復雜的事情,你能夠寫一個 Item Pipeline(條目管道)。由於在項目建立的時候,一個專門用於條目管道的佔位符文件已經隨着items一塊兒被創建,目錄在tutorial/pipelines.py。若是你只須要存取這些抓取後的items的話,就不須要去實現任何的條目管道。

相關文章
相關標籤/搜索