最近要開發一個軟件需要爬取網站信息,於是選擇了python 和scrapy下面做一下簡單介紹:Scrapy安裝連接,scrapy官網連接
所謂網絡爬蟲,就是一個在網上到處或定向抓取數據的程序,當然,這種說法不夠專業,更專業的描述就是,抓取特定網站網頁的HTML數據。不過由於一個網站的網頁很多,而我們又不可能事先知道所有網頁的URL地址,所以,如何保證我們抓取到了網站的所有HTML頁面就是一個有待考究的問題了。
一般的方法是,定義一個入口頁面,然后一般一個頁面會有其他頁面的URL,於是從當前頁面獲取到這些URL加入到爬蟲的抓取隊列中,然后進入到新新頁面后再遞歸的進行上述的操作,其實說來就跟深度遍歷或廣度遍歷一樣。
上面介紹的只是爬蟲的一些概念而非搜索引擎,實際上搜索引擎的話其系統是相當復雜的,爬蟲只是搜索引擎的一個子系統而已。下面介紹一個開源的爬蟲框架Scrapy。
一、概述
Scrapy是一個用 Python 寫的 Crawler Framework ,簡單輕巧,並且非常方便,並且官網上說已經在實際生產中在使用了,不過現在還沒有 Release 版本,可以直接使用他們的 Mercurial 倉庫里抓取源碼進行安裝。
Scrapy 使用 Twisted 這個異步網絡庫來處理網絡通訊,架構清晰,並且包含了各種中間件接口,可以靈活的完成各種需求。整體架構如下圖所示:
綠線是數據流向,首先從初始 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的存儲功能
新建工程
首先,為我們的爬蟲新建一個工程,首先進入一個目錄(任意一個我們用來保存代碼的目錄),執行:
- scrapy startproject Domz
最后的Domz就是項目名稱。這個命令會在當前目錄下創建一個新目錄Domz,結構如下:
- dmoz/
- scrapy.cfg
- dmoz/
- __init__.py
- items.py
- pipelines.py
- settings.py
- spiders/
- __init__.py
scrapy.cfg: 項目配置文件
items.py: 需要提取的數據結構定義文件
pipelines.py: 管道定義,用來對items里面提取的數據做進一步處理,如保存等
settings.py: 爬蟲配置文件
spiders: 放置spider的目錄
定義Item
在items.py里面定義我們要抓取的數據:
- from scrapy.item import Item, Field
- class DmozItem(Item):
- title = Field()
- link = Field()
- 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:
- class DmozSpider(BaseSpider):
- name = "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)
提取Item
提取數據到Items里面,主要用到XPath提取網頁數據:
scrapy有提供兩個XPath選擇器,HtmlXPathSelector和XmlXPathSelector,一個用於HTML,一個用於XML,XPath選擇器有三個方法
select(xpath): 返回一個相對於當前選中節點的選擇器列表(一個XPath可能選到多個節點)
extract(): 返回選擇器(列表)對應的節點的字符串(列表)
re(regex): 返回正則表達式匹配的字符串(分組匹配)列表
一種很好的方法是在Shell里面對XPath進行測試:
- scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/
現在修改parse()方法看看如何提取數據到items里面去:
- def parse(self, response):
- hxs = HtmlXPathSelector(response)
- 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
實現PipeLine
PipeLine用來對Spider返回的Item列表進行保存操作,可以寫入到文件、或者數據庫等。
PipeLine只有一個需要實現的方法:process_item,例如我們將Item保存到一個文件中:
- def __init__(self):
- self.file = open('jingdong.txt', 'wb')
- def process_item(self, item, spider):
- self.file.write(item['title'] + '\t'+ item['link'] + '\t' + item['desc']+'\n')
到現在,我們就完成了一個基本的爬蟲的實現,可以輸入下面的命令來啟動這個Spider:
- 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()方法代碼如下:
- from scrapy.selector import HtmlXPathSelector
- def parse(self, response):
- hxs = HtmlXPathSelector(response)
- items = []
- newurls = hxs.select('//a/@href').extract()
- validurls = []
- for url in newurls:
- #判斷URL是否合法
- if true:
- validurls.append(url)
- items.extend([self.make_requests_from_url(url).replace(callback=self.parse) for url in validurls])
- 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()
新建工程
在抓取之前,你需要新建一個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的話,就不需要去實現任何的條目管道。