Python-Scrapy

1、安裝Scrapy 
在安裝scrapy以前有一些依賴須要安裝,不然可能會安裝失敗,scrapy的選擇器依賴於lxml,還有Twisted網絡引擎,下面是ubuntu下安裝的過程
linux下安裝
# 1. 安裝xml依賴庫
$ sudo apt-get install libxml2 libxml2-dev
$ sudo apt-get install libxslt1-dev
$ sudo apt-get install python-libxml2
 
# 2. 安裝lxml
$ sudo pip install lxml
 
# 3. 安裝Twisted(版本能夠換成最新的),用pip也能夠,若是失敗的話下載源碼安裝,以下
$ wget https://pypi.python.org/packages/6b/23/8dbe86fc83215015e221fbd861a545c6ec5c9e9cd7514af114d1f64084ab/Twisted-16.4.1.tar.bz2#md5=c6d09bdd681f538369659111f079c29d
$ tar xjf Twisted-16.4.1.tar.bz2
$ cd Twisted-16.4.1
$ sudo python setup.py install
 
# 4. 安裝scrapy
$ sudo pip install scrapy
http://lxml.de/installation.html
 
Mac下安裝
# 安裝xml依賴庫
$ xcode-select —install
 
# 其實相關依賴pip會自動幫咱們裝上
$ pip install scrapy
mac下安裝有時候會失敗,建議使用virtualenv安裝在獨立的環境下,能夠減小一些問題,由於mac系統自帶python,例如一些依賴庫依賴的一些新的版本,而升級新版本會把舊版本卸載掉,卸載可能會有權限的問題
 
2、Scrapy簡介
官方描述:Scrapy is a fast high-level screen scraping and web crawling framework, used to crawl websites and extract structured data from their pages. It can be used for a wide range of purposes, from data mining to monitoring and automated testing
 
官方文檔對其詳細描述:
「Scrapy是一個爲了爬取網站數據,提取結構性數據而編寫的應用框架。 能夠應用在包括數據挖掘,信息處理或存儲歷史數據等一系列的程序中。其最初是爲了頁面抓取 (更確切來講, 網絡抓取 )所設計的, 也能夠應用在獲取API所返回的數據(例如 Amazon Associates Web Services ) 或者通用的網絡爬蟲。」
 
網絡爬蟲,就是一個在網上處處或定向抓取數據的程序。或者,更專業的來講,網絡爬蟲會抓取特定網站網頁的HTML數據。抓取網頁的通常方法是,定義一個入口頁面,而後通常一個頁面會有其餘頁面的URL,因而從當前頁面獲取到這些URL加入到爬蟲的抓取隊列中,而後進入到新頁面後再遞歸的進行上述的操做,其實說來就跟深度遍歷(DFS)或廣度(BFS)遍歷同樣。
 
Scrapy 使用 Twisted(http://twistedmatrix.com/trac/)這個異步網絡庫來處理網絡通信,架構清晰,而且包含了各類中間件接口,能夠靈活的完成各類需求。
 

3、概述css

下圖表展示了Scrapy的架構,包括組件及在系統中發生的數據流的概覽(綠色箭頭所示)。 下面對每一個組件都作了簡單介紹,並給出了詳細內容的連接。數據流以下所描述。

 
4、Scrapy結構說明
 
組件
Scrapy Engine
引擎負責控制數據流在系統中全部組件中流動,並在相應動做發生時觸發事件。 詳細內容查看下面的數據流(Data Flow)部分。
 
調度器(Scheduler)
調度器從引擎接受request並將他們入隊,以便以後引擎請求他們時提供給引擎。
 
下載器(Downloader)
下載器負責獲取頁面數據並提供給引擎,然後提供給spider。
 
Spiders
Spider是Scrapy用戶編寫用於分析response並提取item(即獲取到的item)或額外跟進的URL的類。 每一個spider負責處理一個特定(或一些)網站。 更多內容請看 Spiders 。
 
Item Pipeline
Item Pipeline負責處理被spider提取出來的item。典型的處理有清理、 驗證及持久化(例如存取到數據庫中)。 更多內容查看 Item Pipeline 。
 
下載器中間件(Downloader middlewares)
下載器中間件是在引擎及下載器之間的特定鉤子(specific hook),處理Downloader傳遞給引擎的response。 其提供了一個簡便的機制,經過插入自定義代碼來擴展Scrapy功能。更多內容請看 下載器中間件(Downloader Middleware) 。
 
Spider中間件(Spider middlewares)
Spider中間件是在引擎及Spider之間的特定鉤子(specific hook),處理spider的輸入(response)和輸出(items及requests)。 其提供了一個簡便的機制,經過插入自定義代碼來擴展Scrapy功能。更多內容請看 Spider中間件(Middleware) 。
 
 
5、數據流(data flow)
 
Scrapy中的數據流由執行引擎控制,其過程以下:
 
1.引擎打開一個網站(open a domain),找處處理該網站的Spider並向該spider請求第一個要爬取的URL(s)。
2.引擎從Spider中獲取到第一個要爬取的URL並在調度器(Scheduler)以Request調度。
3.引擎向調度器請求下一個要爬取的URL。
4.調度器返回下一個要爬取的URL給引擎,引擎將URL經過下載中間件(請求(request)方向)轉發給下載器(Downloader)。
5.一旦頁面下載完畢,下載器生成一個該頁面的Response,並將其經過下載中間件(返回(response)方向)發送給引擎。
6.引擎從下載器中接收到Response並經過Spider中間件(輸入方向)發送給Spider處理。
7.Spider處理Response並返回爬取到的Item及(跟進的)新的Request給引擎。
8.引擎將(Spider返回的)爬取到的Item給Item Pipeline,將(Spider返回的)Request給調度器。
9.(從第二步)重複直到調度器中沒有更多地request,引擎關閉該網站。
 
綠線是數據流向,首先從初始 URL 開始,Scheduler 會將其交給 Downloader 進行下載,下載以後會交給 Spider 進行分析,Spider 分析出來的結果有兩種:一種是須要進一步抓取的連接,例如以前分析的「下一頁」的連接,這些東西會被傳回 Scheduler ;另外一種是須要保存的數據,它們則被送到 Item Pipeline 那裏,那是對數據進行後期處理(詳細分析、過濾、存儲等)的地方。另外,在數據流動的通道里還能夠安裝各類中間件,進行必要的處理。
 
6、Scrapy入門教程
 
這個教程會交給咱們如下的任務:
1.創建一個新的scrapy任務
2.寫一個爬蟲用來爬網站並採集信息
3.用command line來輸出採集到的信息
4.建立一個爬蟲來遞歸地爬取網站
5.使用爬蟲參數
 
由於Scrapy是用python寫的,對於不熟悉python而用過其餘語言的,能夠參考這個教程:http://www.diveintopython3.net。或者也能夠參考python的教程:
https://docs.python.org/3/tutorial/ 
 
創建一個新的scrapy任務
首先要寫一個directory,規定代碼
 
scrapy startproject tutorial
 
這會創建一個名叫tutorial的directory並含有以下的內容:
tutorial/
    scrapy.cfg            # deploy configuration file
    tutorial/             # project's Python module, you'll import your code from here
        __init__.py
        items.py          # project items definition file
        pipelines.py      # project pipelines file
        settings.py       # project settings file
        spiders/          # a directory where you'll later put your spiders
            __init__.py
 
定義Item 
Item 是保存爬取到的數據的容器;其使用方法和python dict相似。雖然也能夠在Scrapy中直接使用dict,可是 Item 提供了額外保護機制來避免拼寫錯誤致使的未定義字段錯誤。也可以使用Item Loaders,以便提供更方便的API. 
 
相似在ORM中作的同樣,能夠經過建立一個 scrapy.Item 類, 而且定義類型爲 scrapy.Field 的類屬性來定義一個Item。
 
首先根據須要從dmoztools.org獲取到的數據對item進行建模。 咱們須要從dmoztools中獲取名字,url,以及網站的描述。 對此,在item中定義相應的字段。編輯 tutorial 目錄中的 items.py 文件:
 
import scrapy
class DmozItem(scrapy.Item):
    title = scrapy.Field()
    link = scrapy.Field()
    desc = scrapy.Field()
 
一開始這看起來可能有點複雜,可是經過定義item, 能夠很方便的使用Scrapy的其餘方法。而這些方法須要知道item的定義。
 
編寫第一個爬蟲
Spider是用戶編寫用於從單個網站(或者一些網站)爬取數據的類。
其包含了一個用於下載的初始URL,如何跟進網頁中的連接以及如何分析頁面中的內容, 提取生成 item 的方法。
爲了建立一個Spider,咱們必須繼承 scrapy.Spider 類, 且定義一些屬性:
 • name: 用於區別Spider。 該名字必須是惟一的,咱們不能夠爲不一樣的Spider設定相同的名字。
 • start_urls: 包含了Spider在啓動時進行爬取的url列表。 所以,第一個被獲取到的頁面將是其中之一。 後續的URL則從初始的URL獲取到的數據中提取。
 • parse() 是spider的一個方法。 被調用時,每一個初始URL完成下載後生成的 Response 對象將會做爲惟一的參數傳遞給該函數。 該方法負責解析返回的數據(response data),提取數據(生成item)以及生成須要進一步處理的URL的 Request 對象。
 
如下爲咱們的第一個Spider代碼,保存在 tutorial/spiders 目錄下的 dmoztools_spider.py 文件中:
 
import scrapy
class DmozSpider(scrapy.Spider):
    name = "dmoztools"
    allowed_domains = ["dmoztools.net"]
    start_urls = [
        "http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/"
    ]
 
    def parse(self, response):
        filename = response.url.split("/")[-2] + '.html'
        with open(filename, 'wb') as f:
            f.write(response.body)
 
爬取
 
進入項目的根目錄,執行下列命令啓動spider:
scrapy crawl dmoztools
 
出現問題:Unknown command: crawl 
解決方法:https://stackoverflow.com/questions/4988297/trying-to-get-scrapy-into-a-project-to-run-crawl-command
 
剛纔輸入的命令啓動了咱們剛剛添加的domztools spider,向dmoztools.org發送了一些請求,獲得輸出相似以下:
 
2017-07-06 15:34:43 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: tutorial)
2017-07-06 15:34:43 [scrapy.utils.log] INFO: Overridden settings: {}
2017-07-06 15:34:43 [scrapy.middleware] INFO: Enabled extensions:..
2017-07-06 15:34:44 [scrapy.middleware] INFO: Enabled downloader middlewares:..
2017-07-06 15:34:44 [scrapy.middleware] INFO: Enabled spider middlewares:..
2017-07-06 15:34:44 [scrapy.middleware] INFO: Enabled item pipelines:[]
2017-07-06 15:34:44 [scrapy.core.engine] INFO: Spider opened
2017-07-06 15:34:44 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-07-06 15:34:44 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-07-06 15:34:45 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.dmoztools.net/robots.txt> (referer: None)
2017-07-06 15:34:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/> (referer: None)
2017-07-06 15:34:46 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/> (referer: None)
2017-07-06 15:34:46 [scrapy.core.engine] INFO: Closing spider (finished)
2017-07-06 15:34:46 [scrapy.statscollectors] INFO: Dumping Scrapy stats:{}
2017-07-06 15:34:46 [scrapy.core.engine] INFO: Spider closed (finished)
Minnas-MacBook-Pro:tutorial minnawu$ scrapy crawl dmoztools
2017-07-06 15:35:16 [scrapy.utils.log] INFO: Scrapy 1.4.0 started (bot: tutorial)
2017-07-06 15:35:16 [scrapy.utils.log] INFO: Overridden settings: {'NEWSPIDER_MODULE': 'tutorial.spiders', 'SPIDER_MODULES': ['tutorial.spiders'], 'ROBOTSTXT_OBEY': True, 'BOT_NAME': 'tutorial'}
2017-07-06 15:35:16 [scrapy.middleware] INFO: Enabled extensions:..
2017-07-06 15:35:17 [scrapy.middleware] INFO: Enabled downloader middlewares:..
2017-07-06 15:35:17 [scrapy.middleware] INFO: Enabled spider middlewares:..
2017-07-06 15:35:17 [scrapy.middleware] INFO: Enabled item pipelines:[]
2017-07-06 15:35:17 [scrapy.core.engine] INFO: Spider opened
2017-07-06 15:35:17 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-07-06 15:35:17 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6023
2017-07-06 15:35:17 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.dmoztools.net/robots.txt> (referer: None)
2017-07-06 15:35:18 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.dmoztools.net/Computers/Programming/Languages/Python/Books/> (referer: None)
2017-07-06 15:35:18 [scrapy.core.engine] DEBUG: Crawled (200) <GET http://www.dmoztools.net/Computers/Programming/Languages/Python/Resources/> (referer: None)
2017-07-06 15:35:18 [scrapy.core.engine] INFO: Closing spider (finished)
2017-07-06 15:35:18 [scrapy.statscollectors] INFO: Dumping Scrapy stats:{}
2017-07-06 15:35:18 [scrapy.core.engine] INFO: Spider closed (finished)
 
如今,查看當前目錄,會注意到有兩個包含url所對應的內容的文件被建立了: Book , Resources,正如parse 方法裏作的同樣。
 
Scrapy爲Spider的 start_urls 屬性中的每一個URL建立了 scrapy.Request 對象,並將 parse 方法做爲回調函數(callback)賦值給了Request。
Request對象通過調度,執行生成 scrapy.http.Response 對象並送回給spider parse() 方法。
 
提取Items 
 
從網頁中提取數據有不少方法。Scrapy使用了一種基於 XPathCSS 表達式機制: Scrapy Selectors 。 關於selector和其餘提取機制的信息請參考 Selector文檔 (http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/selectors.html#topics-selectors) 
 
Selector有四個基本的方法(點擊相應的方法能夠看到詳細的API文檔):
 • xpath(): 傳入xpath表達式,返回該表達式所對應的全部節點的selector list列表 。
 • css(): 傳入CSS表達式,返回該表達式所對應的全部節點的selector list列表.
 • extract(): 序列化該節點爲unicode字符串並返回list。
 • re(): 根據傳入的正則表達式對數據進行提取,返回unicode字符串list列表。
 
 
在Shell中嘗試Selector選擇器
爲了介紹Selector的使用方法,接下來咱們將要使用內置的 Scrapy shell
Scrapy Shell須要預裝好 IPython (一個擴展的Python終端)。
咱們須要進入項目的根目錄,執行下列命令來啓動shell:
scrapy shell "http://www.dmoztools.org/Computers/Programming/Languages/Python/Books/"
 
shell的輸出相似:
[ ... Scrapy log here ... ]
 
2017-07-06 17:03:14 [scrapy.core.engine] DEBUG: Crawled (403) <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: None)
[s] Available Scrapy objects:
[s]   scrapy     scrapy module (contains scrapy.Request, scrapy.Selector, etc)
[s]   crawler    <scrapy.crawler.Crawler object at 0x10e96fa90>
[s]   item       {}
[s]   request    <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   response   <403 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s]   settings   <scrapy.settings.Settings object at 0x10e96fa10>
[s]   spider     <DefaultSpider 'default' at 0x10f463690>
[s] Useful shortcuts:
[s]   fetch(url[, redirect=True]) Fetch URL and update local objects (by default, redirects are followed)
[s]   fetch(req)                  Fetch a scrapy.Request and update local objects 
[s]   shelp()           Shell help (print this help)
[s]   view(response)    View response in a browser
 
當shell載入後,將獲得一個包含response數據的本地 response 變量。輸入 response.body 將輸出response的包體, 輸出 response.headers 能夠看到response的包頭。
 
更爲重要的是, response 擁有一個 selector 屬性, 該屬性是以該特定 response 初始化的類 Selector 的對象。 能夠經過使用 response.selector.xpath() 或 response.selector.css() 來對 response 進行查詢。 此外,scrapy也對 response.selector.xpath() 及 response.selector.css() 提供了一些快捷方式, 例如 response.xpath() 或 response.css() ,
 
同時,shell根據response提早初始化了變量 sel 。該selector根據response的類型自動選擇最合適的分析規則(XML vs HTML)。
 
例子:
 
In [1]: response.xpath('//title')
Out[1]: [<Selector xpath='//title' data=u'<title>Open Directory - Computers: Progr'>]
 
In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books</title>']
 
In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath='//title/text()' data=u'Open Directory - Computers: Programming:'>]
 
In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'Open Directory - Computers: Programming: Languages: Python: Books']
 
In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Computers', u'Programming', u'Languages', u'Python']
 
提取數據
如今,咱們來嘗試從這些頁面中提取些有用的數據。
咱們能夠在終端中輸入 response.body 來觀察HTML源碼並肯定合適的XPath表達式。可使用Firefox的Firebug擴展。
 
好比:咱們能夠經過這段代碼選擇該頁面中網站列表裏全部 <li> 元素:
response.xpath(‘//ul/li')
 
網站的描述:
response.xpath(‘//ul/li/text()').extract()
 
網站的標題:
response.xpath(‘//ul/li/a/text()').extract()
 
以及網站的連接:
response.xpath(‘//ul/li/a/@href').extract()
 
以前提到過,每一個 .xpath() 調用返回selector組成的list,所以咱們能夠拼接更多的 .xpath() 來進一步獲取某個節點。咱們將在下邊使用這樣的特性:
for sel in response.xpath('//ul/li'):
    title = sel.xpath('a/text()').extract()
    link = sel.xpath('a/@href').extract()
    desc = sel.xpath('text()').extract()
    print title, link, desc
 
在咱們的spider中加入這段代碼:
import scrapy
class DmozSpider(scrapy.Spider):
    name = "dmoz"
    allowed_domains = ["dmoztools.org"]
    start_urls = [
        "http://www.dmoztools.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoztools.org/Computers/Programming/Languages/Python/Resources/"
    ]
 
    def parse(self, response):
        for sel in response.xpath('//ul/li'):
            title = sel.xpath('a/text()').extract()
            link = sel.xpath('a/@href').extract()
            desc = sel.xpath('text()').extract()
            print title, link, desc
 
如今嘗試再次爬取dmoztools.org,咱們將看到爬取到的網站信息被成功輸出:
scrapy crawl dmoztools
 
使用item
Item 對象是自定義的python字典。 可使用標準的字典語法來獲取到其每一個字段的值。(字段便是咱們以前用Field賦值的屬性):
 
>>> item = DmozItem()
>>> item['title'] = 'Example title'
>>> item[‘title']
'Example title’
 
爲了將爬取的數據返回,咱們最終的代碼將是:
 
import scrapy
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
    name = "dmoztools"
    allowed_domains = ["dmoztools.org"]
    start_urls = [
        "http://www.dmoztools.org/Computers/Programming/Languages/Python/Books/",
        "http://www.dmoztools.org/Computers/Programming/Languages/Python/Resources/"
    ]
 
    def parse(self, response):
        for sel in response.xpath('//ul/li'):
            item = DmozItem()
            item['title'] = sel.xpath('a/text()').extract()
            item['link'] = sel.xpath('a/@href').extract()
            item['desc'] = sel.xpath('text()').extract()
            yield item
 
如今對dmoztools.org進行爬取將會產生 DmozItem 對象:
[scrapy] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
     {'desc': [u' - By David Mertz; Addison Wesley. Book in progress, full text, ASCII format. Asks for feedback. [author website, Gnosis Software, Inc.\n],
      'link': [u'http://gnosis.cx/TPiP/'],
      'title': [u'Text Processing in Python']}
[scrapy] DEBUG: Scraped from <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
     {'desc': [u' - By Sean McGrath; Prentice Hall PTR, 2000, ISBN 0130211192, has CD-ROM. Methods to build XML applications fast, Python tutorial, DOM and SAX, new Pyxie open source XML processing library. [Prentice Hall PTR]\n'],
      'link': [u'http://www.informit.com/store/product.aspx?isbn=0130211192'],
      'title': [u'XML Processing with Python’]}
 
追蹤連接(Following links)
接下來, 不只僅知足於爬取 Books 及 Resources 頁面, 咱們想要獲取獲取全部 Python directory 的內容。
既然已經能從頁面上爬取數據了,爲何不提取咱們感興趣的頁面的連接,追蹤他們, 讀取這些連接的數據呢?
下面是實現這個功能的改進版spider:
 
import scrapy
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
    name = "dmoztools"
    allowed_domains = ["dmoztools.org"]
    start_urls = [
        "http://www.dmoztools.org/Computers/Programming/Languages/Python/",
    ]
 
    def parse(self, response):
        for href in response.css("ul.directory.dir-col > li > a::attr('href')"):
            url = response.urljoin(response.url, href.extract())
            yield scrapy.Request(url, callback=self.parse_dir_contents)
 
    def parse_dir_contents(self, response):
        for sel in response.xpath('//ul/li'):
            item = DmozItem()
            item['title'] = sel.xpath('a/text()').extract()
            item['link'] = sel.xpath('a/@href').extract()
            item['desc'] = sel.xpath('text()').extract()
            yield item
 
如今, parse() 僅僅從頁面中提取咱們感興趣的連接,使用 response.urljoin 方法構造一個絕對路徑的URL(頁面上的連接都是相對路徑的), 產生(yield)一個請求, 該請求使用 parse_dir_contents() 方法做爲回調函數, 用於最終產生咱們想要的數據.
 
這裏展示的便是Scrpay的追蹤連接的機制: 當在回調函數中yield一個Request後, Scrpay將會調度,發送該請求,而且在該請求完成時,調用所註冊的回調函數。
基於此方法,咱們能夠根據定義的跟進連接的規則,建立複雜的crawler,而且, 根據所訪問的頁面,提取不一樣的數據.
一種常見的方法是,回調函數負責提取一些item,查找能跟進的頁面的連接, 而且使用相同的回調函數yield一個 Request:
 
def parse_articles_follow_next_page(self, response):
    for article in response.xpath("//article"):
        item = ArticleItem()
 
        ... extract article data here
 
        yield item
 
    next_page = response.css("ul.navigation > li.next-page > a::attr('href')")
    if next_page:
        url = response.urljoin(next_page[0].extract())
        yield scrapy.Request(url, self.parse_articles_follow_next_page)
 
上述代碼將建立一個循環,跟進全部下一頁的連接,直到找不到爲止 – 對於爬取博客、論壇以及其餘作了分頁的網站十分有效。
另外一種常見的需求是從多個頁面構建item的數據, 這可使用 http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/request-response.html#topics-request-response-ref-request-callback-arguments
 
注:若是想知道如何實現一線擁有小型的規則引擎的通用spider開構建crawler, 請見CrawlSpider (http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/spiders.html#scrapy.spiders.CrawlSpider )
 
保存爬取到的數據
最簡單存儲爬取的數據的方式是使用 Feed exports:
scrapy crawl dmoz -o items.json
該命令將採用 JSON 格式對爬取的數據進行序列化,生成 items.json 文件。
在相似本篇教程裏這樣小規模的項目中,這種存儲方式已經足夠。 若是須要對爬取到的item作更多更爲複雜的操做,能夠編寫 Item Pipeline 。 相似於咱們在建立項目時對Item作的,用於編寫本身的 tutorial/pipelines.py 也被建立。 不過若是僅僅想要保存item,咱們不須要實現任何的pipeline。
 
 
還有什麼?
咱們已經瞭解瞭如何經過Scrapy提取存儲網頁中的信息,但這僅僅只是冰山一角。Scrapy提供了不少強大的特性來使得爬取更爲簡單高效, 例如:
 • 對HTML, XML源數據 選擇及提取 的內置支持, 提供了CSS選擇器(selector)以及XPath表達式進行處理, 以及一些幫助函數(helper method)來使用正則表達式來提取數據.
 • 提供 交互式shell終端 , 爲測試CSS及XPath表達式,編寫和調試爬蟲提供了極大的方便
 • 經過 feed導出 提供了多格式(JSON、CSV、XML),多存儲後端(FTP、S三、本地文件系統)的內置支持
 • 提供了一系列在spider之間共享的可複用的過濾器(即 Item Loaders),對智能處理爬取數據提供了內置支持。
 • 針對非英語語系中不標準或者錯誤的編碼聲明, 提供了自動檢測以及健壯的編碼支持。
 • 高擴展性。能夠經過使用 signals ,設計好的API(中間件, extensions, pipelines)來定製實現咱們的功能。
 • 內置的中間件及擴展爲下列功能提供了支持: * cookies and session 處理 * HTTP 壓縮 * HTTP 認證 * HTTP 緩存 * user-agent模擬 * robots.txt * 爬取深度限制 * 其餘
 • 內置 Telnet終端 ,經過在Scrapy進程中鉤入Python終端,使咱們能夠查看而且調試爬蟲
 • 以及其餘一些特性,例如可重用的,從 Sitemaps 及 XML/CSV feeds中爬取網站的爬蟲、 能夠 自動下載 爬取到的數據中的圖片(或者其餘資源)的media pipeline、 帶緩存的DNS解析器,以及更多的特性。
 
References:
官方:
https://doc.scrapy.org/en/latest/index.html 
中文:
https://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html 
https://segmentfault.com/a/1190000007073049#articleHeader13 
http://python.jobbole.com/86405/ 
經過練習來學習scrapy:
https://github.com/scrapy/quotesbot 
相關文章
相關標籤/搜索