一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

使用Python的Scrapy框架編寫web爬蟲的簡(jiǎn)單示例

 幸運(yùn)符hjssc716 2016-10-24

 在這個(gè)教材中,我們假定你已經(jīng)安裝了Scrapy。假如你沒有安裝,你可以參考這個(gè)安裝指南

我們將會(huì)用開放目錄項(xiàng)目(dmoz)作為我們例子去抓取。

這個(gè)教材將會(huì)帶你走過下面這幾個(gè)方面:

  •     創(chuàng)造一個(gè)新的Scrapy項(xiàng)目
  •     定義您將提取的Item
  •     編寫一個(gè)蜘蛛去抓取網(wǎng)站并提取Items
  •     編寫一個(gè)Item Pipeline用來(lái)存儲(chǔ)提出出來(lái)的Items

Scrapy由Python寫成。假如你剛剛接觸Python這門語(yǔ)言,你可能想要了解這門語(yǔ)言起,怎么最好的利用這門語(yǔ)言。假如你已經(jīng)熟悉其它類似的語(yǔ)言,想要快速地學(xué)習(xí)Python,我們推薦這種深入方式學(xué)習(xí)Python。假如你是新手,想從開始使用Python學(xué)習(xí),可以嘗試去看看非程序員Python資源列表。

創(chuàng)造一個(gè)項(xiàng)目

在你要抓取之前,首先要建立一個(gè)新的Scrapy項(xiàng)目。然后進(jìn)去你的存放代碼目錄,執(zhí)行如下命令。

scrapy startproject tutorial

它將會(huì)創(chuàng)建如下的向?qū)夸?

tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

這是一些基本信息:

  •     scrapy.cfg: 項(xiàng)目的配置文件。
  •     tutorial/: 項(xiàng)目的python模塊, 在這里稍后你將會(huì)導(dǎo)入你的代碼。
  •     tutorial/items.py: 項(xiàng)目items文件。
  •     tutorial/pipelines.py: 項(xiàng)目管道文件。
  •     tutorial/settings.py: 項(xiàng)目配置文件。
  •     tutorial/spiders/: 你將要放入你的spider到這個(gè)目錄中。


定義我們的Item

Items是裝載我們抓取數(shù)據(jù)的容器。它們工作像簡(jiǎn)單的Python字典,它提供更多的保護(hù),比如對(duì)未定義的字段提供填充功能防止出錯(cuò)。

它們通過創(chuàng)建scrapy.item.Item類來(lái)聲明并定義它們的屬性作為scrapy.item.Field 對(duì)象,就像是一個(gè)對(duì)象關(guān)系映射(假如你不熟悉ORMs,你將會(huì)看見它是一個(gè)簡(jiǎn)單的任務(wù)).

我們將需要的item模塊化,來(lái)控制從demoz.org網(wǎng)站獲取的數(shù)據(jù),比如我們將要去抓取網(wǎng)站的名字,url和描述信息。我們定義這三種屬性的域。我們編輯items.py文件,它在向?qū)夸浿?。我們Item類看起來(lái)像這樣。

 

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

這個(gè)看起來(lái)復(fù)雜的,但是定義這些item能讓你用其他Scrapy組件的時(shí)候知道你的item到底是什么

我們第一個(gè)Spider

Spiders是用戶寫的類,它用來(lái)去抓取一個(gè)網(wǎng)站的信息(或者一組網(wǎng)站) 。
我們定義一個(gè)初始化的URLs列表去下載,如何跟蹤鏈接,如何去解析這些頁(yè)面的內(nèi)容去提取 items.創(chuàng)建一個(gè)Spider,你必須是scrapy.spider.BaseSpider的子類, 并定義三個(gè)主要的,強(qiáng)制性的屬性。

    名字: Spider的標(biāo)識(shí). 它必須是唯一的, 那就是說,你不能在不同的Spiders中設(shè)置相同的名字。

    開始鏈接:Spider將會(huì)去爬這些URLs的列表。所以剛開始的下載頁(yè)面將要包含在這些列表中。其他子URL將會(huì)從這些起始URL中繼承性生成。

    parse() 是spider的一個(gè)方法, 調(diào)用時(shí)候傳入從每一個(gè)URL傳回的Response對(duì)象作為參數(shù)。response是方法的唯一參數(shù)。

    這個(gè)方法負(fù)責(zé)解析response數(shù)據(jù)和提出抓取的數(shù)據(jù)(作為抓取的items),跟蹤URLs

    parse()方法負(fù)責(zé)處理response和返回抓取數(shù)據(jù)(作為Item對(duì)象) 和跟蹤更多的URLs(作為request的對(duì)象)

這是我們的第一個(gè)Spider的代碼;它保存在moz/spiders文件夾中,被命名為dmoz_spider.py:
 

from scrapy.spider import BaseSpider class DmozSpider(BaseSpider): name = 'dmoz' allowed_domains = [''] start_urls = [ 'http://www./Computers/Programming/Languages/Python/Books/', 'http://www./Computers/Programming/Languages/Python/Resources/' ] def parse(self, response): filename = response.url.split('/')[-2] open(filename, 'wb').write(response.body)

為了使你的spider工作, 到項(xiàng)目的頂級(jí)目錄讓后運(yùn)行:

scrapy crawl dmoz

crawl dmoz命令使spider去爬網(wǎng)站的信息。你將會(huì)得到如下類似的信息:

2008-08-20 03:51:13-0300 [scrapy] INFO: Started project: dmoz2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled extensions: ...2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled downloader middlewares: ...2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled spider middlewares: ...2008-08-20 03:51:13-0300 [tutorial] INFO: Enabled item pipelines: ...2008-08-20 03:51:14-0300 [dmoz] INFO: Spider opened2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled (referer: )2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled (referer: )2008-08-20 03:51:14-0300 [dmoz] INFO: Spider closed (finished)

注意那些行包含[dmoz], 它和我們的spider相關(guān)。你能夠看見每行初始化的URL日志信息。因?yàn)檫@些URLs是起始頁(yè)面,所以他們沒有引用referrers。 所以在每行的末尾部門,你能看見(referer: ).

但是有趣的是,在我們的parse方法作用下,兩個(gè)文件被創(chuàng)建: Books and Resources, 它保航兩個(gè)URLs的內(nèi)容
剛剛發(fā)生了什么事情?

Scrapy為每一個(gè)start_urls創(chuàng)建一個(gè)scrapy.http.Request對(duì)象,并將爬蟲的parse 方法指定為回調(diào)函數(shù)。

這些Request首先被調(diào)度,然后被執(zhí)行,之后通過parse()方法,將scrapy.http.Response對(duì)象被返回,結(jié)果也被反饋給爬蟲。

提取Items
選擇器介紹

我們有多種方式去提取網(wǎng)頁(yè)中數(shù)據(jù)。Scrapy 使用的是XPath表達(dá)式,通常叫做XPath selectors。如果想了解更多關(guān)于選擇器和提取數(shù)據(jù)的機(jī)制,可以看看如下教程XPath selectors documentation.

這里有一些表達(dá)式的例子和它們相關(guān)的含義:

  •     /html/head/title: 選擇元素,在HTML文檔的<head>元素里</li> <li>    /html/head/title/text(): 選擇<title>元素里面的文本</li> <li>    //td: 選擇所有的<td>元素</li> <li>    //div[@class='mine']: 選擇所有的div元素里面class屬性為mine的</li></ul><p>這里有許多的例子關(guān)于怎么使用XPath,可以說XPath表達(dá)式是非常強(qiáng)大的。如果你想要學(xué)習(xí)更多關(guān)于XPath,我們推薦如下教程<a target='_blank' href='http://www./XPath/default.asp'>this XPath tutorial</a>.</p><p>為了更好使用XPaths, Scrapy提供了一個(gè)<a target='_blank' href='http://XPathSelector'>XPathSelector</a>類,它有兩種方式, <a target='_blank' href='http://doc./en/0.16/topics/selectors.html#scrapy.selector.HtmlXPathSelector'>HtmlXPathSelector</a>(HTML相關(guān)數(shù)據(jù))和<a target='_blank' href='http://doc./en/0.16/topics/selectors.html#scrapy.selector.XmlXPathSelector'>XmlXPathSelector</a>(XML相關(guān)數(shù)據(jù))。如果你想使用它們,你必須實(shí)例化一個(gè)<a target='_blank' href='http://doc./en/0.16/topics/request-response.html#scrapy.http.Response'>Response</a>對(duì)象.</p><p>你能夠把selectors作為對(duì)象,它代表文件結(jié)構(gòu)中的節(jié)點(diǎn)。所以,第1個(gè)實(shí)例的節(jié)點(diǎn)相當(dāng)于root節(jié)點(diǎn),或者稱為整個(gè)文檔的節(jié)點(diǎn)。</p><p>選擇器有三種方法(點(diǎn)擊方法你能夠看見完整的API文檔)。</p><ul> <li>    <a target='_blank' href='http://doc./en/0.16/topics/selectors.html#scrapy.selector.XPathSelector.select'>select()</a>: 返回選擇器的列表,每一個(gè)select表示一個(gè)xpath表達(dá)式選擇的節(jié)點(diǎn)。</li> <li>    <a target='_blank' href='http://doc./en/0.16/topics/selectors.html#scrapy.selector.XPathSelector.extract'>extract()</a>: 返回一個(gè)unicode字符串 ,該字符串XPath選擇器返回的數(shù)據(jù)。</li> <li>    <a target='_blank' href='http://doc./en/0.16/topics/selectors.html#scrapy.selector.XPathSelector.re'>re()</a> : 返回unicode字符串列表,字符串作為參數(shù)由正則表達(dá)式提取出來(lái)。</li></ul><p><br><strong>在Shell里面使用選擇器</strong></p><p>為了更加形象的使用選擇器,我們將會(huì)使用<a target='_blank' href='http://doc./en/0.16/topics/shell.html#topics-shell'>Scrapy shell</a>,它同時(shí)需要你的系統(tǒng)安裝IPython (一個(gè)擴(kuò)展的Python控制臺(tái))。</p><p>如果使用shell,你必須到項(xiàng)目的頂級(jí)目錄上,讓后運(yùn)行如下命令:</p><p>scrapy shell http://www./Computers/Programming/Languages/Python/Books/</p><p>shell將會(huì)顯示如下的信息</p><div><div>[ ... Scrapy log here ... ][s] Available Scrapy objects:[s] 2010-08-19 21:45:59-0300 [default] INFO: Spider closed (finished)[s] hxs <HtmlXPathSelector (http://www./Computers/Programming/Languages/Python/Books/) xpath=None>[s] item Item()[s] request <GET http://www./Computers/Programming/Languages/Python/Books/>[s] response <200 http://www./Computers/Programming/Languages/Python/Books/>[s] spider <base href="http://shoufuban.net/"/>[s] xxs <XmlXPathSelector (http://www./Computers/Programming/Languages/Python/Books/) xpath=None>[s] Useful shortcuts:[s] shelp() Print this help[s] fetch(req_or_url) Fetch a new request or URL and update shell objects[s] view(response) View response in a browserIn [1]:</div></div><p>當(dāng)shell裝載之后,你將會(huì)得到一個(gè)response的本地變量。所以你輸入reponse.body,你能夠看見response的body部分或者你能夠輸入response.headers,你能夠看見reponse.headers部分。</p><p>shell同樣實(shí)例化了兩個(gè)選擇器,一個(gè)是HTML(在hvx變量里),一個(gè)是XML(在xxs變量里)。所以我們嘗試怎么使用它們:</p><div><div>In [1]: hxs.select('//title')Out[1]: [<HtmlXPathSelector (title) xpath=//title>]In [2]: hxs.select('//title').extract()Out[2]: [u'<title>Open Directory - Computers: Programming: Languages: Python: Books']In [3]: hxs.select('//title/text()')Out[3]: []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']

    提取數(shù)據(jù)Extracting the data

    現(xiàn)在我們開始嘗試在這幾個(gè)頁(yè)面里提取真正的信息。

    你能夠在控制臺(tái)里面輸入response.body,檢查源代碼里面的XPaths是否與預(yù)期相同。然而,檢查原始的HTML代碼是一件非??菰锓ξ兜氖虑椤<偃缒阆胱屇愕墓ぷ髯兊暮?jiǎn)單,你使用Firefox擴(kuò)展的插件例如Firebug來(lái)做這項(xiàng)任務(wù)。更多關(guān)于介紹信息請(qǐng)看Using Firebug for scrapingUsing Firefox for scraping。

    當(dāng)你檢查了頁(yè)面源代碼之后,你將會(huì)發(fā)現(xiàn)頁(yè)面的信息放在一個(gè)

      元素里面,事實(shí)上,確切地說是第二個(gè)
        元素。

        所以我們選擇每一個(gè)

      • 元素使用如下的代碼:
         

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

        網(wǎng)站的描述信息可以使用如下代碼:
         

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

        網(wǎng)站的標(biāo)題:
         

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

        網(wǎng)站的鏈接:
         

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

        如前所述,每個(gè)select()調(diào)用返回一個(gè)selectors列表,所以我們可以結(jié)合select()去挖掘更深的節(jié)點(diǎn)。我們將會(huì)用到這些特性,所以:
         

        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, descNote


        如果想了解更多的嵌套選擇器,可以參考Nesting selectorsWorking with relative XPaths相關(guān)的Selectors文檔
        將代碼添加到我們spider中:

         

        from scrapy.spider import BaseSpiderfrom scrapy.selector import HtmlXPathSelector class DmozSpider(BaseSpider): name = 'dmoz' allowed_domains = [''] start_urls = [ 'http://www./Computers/Programming/Languages/Python/Books/', 'http://www./Computers/Programming/Languages/Python/Resources/' ] def parse(self, response): hxs = HtmlXPathSelector(response) 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

        現(xiàn)在我們?cè)俅巫ト。銓⒖吹秸军c(diǎn)在輸出中被打印 ,運(yùn)行命令:
         

        scrapy crawl dmoz

        使用我們的 item

        Item對(duì)象是自定義python字典;使用標(biāo)準(zhǔn)字典類似的語(yǔ)法,你能夠訪問它們的字段(就是以前我們定義的屬性) 
         

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

        Spiders希望將抓取的數(shù)據(jù)放在 Item對(duì)象里。所以,為了返回我們抓取的數(shù)據(jù),最終的代碼要如下這么寫 :

         

        from scrapy.spider import BaseSpiderfrom scrapy.selector import HtmlXPathSelector from tutorial.items import DmozItem class DmozSpider(BaseSpider): name = 'dmoz' allowed_domains = [''] start_urls = [ 'http://www./Computers/Programming/Languages/Python/Books/', 'http://www./Computers/Programming/Languages/Python/Resources/' ] 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
        Note

        你能夠找到完整功能的spider在dirbot項(xiàng)目里,同樣你可以訪問https://github.com/scrapy/dirbot

        現(xiàn)在重新抓取網(wǎng)站:

        [dmoz] DEBUG: Scraped from <200 http://www./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:///TPiP/'], 'title': [u'Text Processing in Python']}[dmoz] DEBUG: Scraped from <200 http://www./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./store/product.aspx?isbn=0130211192'], 'title': [u'XML Processing with Python']}


        存儲(chǔ)抓取的數(shù)據(jù)

        最簡(jiǎn)單的方式去存儲(chǔ)抓取的數(shù)據(jù)是使用Feed exports,使用如下的命令:

         

        scrapy crawl dmoz -o items.json -t json

        它將會(huì)產(chǎn)生一個(gè)items.json文件,它包含所有抓取的items(序列化的JSON)。

        在一些小的項(xiàng)目里(例如我們的教程中),那就足夠啦。然而,假如你想要執(zhí)行更多復(fù)雜的抓取items,你能夠?qū)懸粋€(gè) Item Pipeline。 因?yàn)樵陧?xiàng)目創(chuàng)建的時(shí)候,一個(gè)專門用于Item Pipelines的占位符文件已經(jīng)隨著項(xiàng)目一起被建立,目錄在tutorial/pipelines.py。如果你只需要存取這些抓取后的items的話,就不需要去實(shí)現(xiàn)任何的條目管道。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    91亚洲精品综合久久| 精品人妻一区二区三区在线看| 欧美日韩国产精品黄片| 国产精品日韩精品最新| 国产中文字幕一区二区| 黄色片国产一区二区三区| 熟女乱一区二区三区四区| 国产成人精品资源在线观看| 在线观看免费午夜福利| 国内尹人香蕉综合在线| 日本女优一色一伦一区二区三区| 91人妻久久精品一区二区三区| 99秋霞在线观看视频| 日本一区不卡在线观看| 久久热九九这里只有精品| 插进她的身体里在线观看骚| 午夜国产精品福利在线观看| 六月丁香六月综合缴情| 欧美又黑又粗大又硬又爽| 欧美亚洲三级视频在线观看| 亚洲中文字幕视频一区二区| 久热99中文字幕视频在线| 亚洲高清欧美中文字幕| 狠狠做五月深爱婷婷综合| 日韩精品免费一区二区三区| 亚洲国产丝袜一区二区三区四 | 91精品国自产拍老熟女露脸| 国产极品粉嫩尤物一区二区 | 久草国产精品一区二区| 99视频精品免费视频| 亚洲精品偷拍视频免费观看| 亚洲专区一区中文字幕| 亚洲精品偷拍视频免费观看| 黄色片一区二区三区高清| 亚洲一区精品二人人爽久久| 亚洲香艳网久久五月婷婷| 午夜激情视频一区二区| 色哟哟国产精品免费视频| 麻豆最新出品国产精品| 国产精品国三级国产专不卡| 亚洲日本加勒比在线播放|