最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Python的Scrapy框架編寫web爬蟲的簡單示例

 更新時(shí)間:2015年04月17日 10:18:59   投稿:goldensun  
這篇文章主要介紹了使用Python的Scrapy框架編寫web爬蟲的簡單示例,使用Python編寫爬蟲是Python應(yīng)用方面最得意的利器,Scrapy框架正是為爬蟲而生,需要的朋友可以參考下

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

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

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

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

Scrapy由Python寫成。假如你剛剛接觸Python這門語言,你可能想要了解這門語言起,怎么最好的利用這門語言。假如你已經(jīng)熟悉其它類似的語言,想要快速地學(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

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

復(fù)制代碼 代碼如下:
tutorial/
    scrapy.cfg
    tutorial/
        __init__.py
        items.py
        pipelines.py
        settings.py
        spiders/
            __init__.py
            ...

這是一些基本信息:

  •     scrapy.cfg: 項(xiàng)目的配置文件。
  •     tutorial/: 項(xiàng)目的python模塊, 在這里稍后你將會導(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ù)的容器。它們工作像簡單的Python字典,它提供更多的保護(hù),比如對未定義的字段提供填充功能防止出錯。

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

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

 

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

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

我們第一個(gè)Spider

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

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

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

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

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

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

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

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)

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

scrapy crawl dmoz

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

2008-08-20 03:51:13-0300 [scrapy] INFO: Started project: dmoz
2008-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 opened
2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled <http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/> (referer: <None>)
2008-08-20 03:51:14-0300 [dmoz] DEBUG: Crawled <http://www.dmoz.org/Computers/Programming/Languages/Python/Books/> (referer: <None>)
2008-08-20 03:51:14-0300 [dmoz] INFO: Spider closed (finished)

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

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

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

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

提取Items
選擇器介紹

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

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

  •     /html/head/title: 選擇<title>元素,在HTML文檔的<head>元素里
  •     /html/head/title/text(): 選擇<title>元素里面的文本
  •     //td: 選擇所有的<td>元素
  •     //div[@class="mine"]: 選擇所有的div元素里面class屬性為mine的

這里有許多的例子關(guān)于怎么使用XPath,可以說XPath表達(dá)式是非常強(qiáng)大的。如果你想要學(xué)習(xí)更多關(guān)于XPath,我們推薦如下教程this XPath tutorial.

為了更好使用XPaths, Scrapy提供了一個(gè)XPathSelector類,它有兩種方式, HtmlXPathSelector(HTML相關(guān)數(shù)據(jù))和XmlXPathSelector(XML相關(guān)數(shù)據(jù))。如果你想使用它們,你必須實(shí)例化一個(gè)Response對象.

你能夠把selectors作為對象,它代表文件結(jié)構(gòu)中的節(jié)點(diǎn)。所以,第1個(gè)實(shí)例的節(jié)點(diǎn)相當(dāng)于root節(jié)點(diǎn),或者稱為整個(gè)文檔的節(jié)點(diǎn)。

選擇器有三種方法(點(diǎn)擊方法你能夠看見完整的API文檔)。

  •     select(): 返回選擇器的列表,每一個(gè)select表示一個(gè)xpath表達(dá)式選擇的節(jié)點(diǎn)。
  •     extract(): 返回一個(gè)unicode字符串 ,該字符串XPath選擇器返回的數(shù)據(jù)。
  •     re() : 返回unicode字符串列表,字符串作為參數(shù)由正則表達(dá)式提取出來。


在Shell里面使用選擇器

為了更加形象的使用選擇器,我們將會使用Scrapy shell,它同時(shí)需要你的系統(tǒng)安裝IPython (一個(gè)擴(kuò)展的Python控制臺)。

如果使用shell,你必須到項(xiàng)目的頂級目錄上,讓后運(yùn)行如下命令:

scrapy shell http://www.dmoz.org/Computers/Programming/Languages/Python/Books/

shell將會顯示如下的信息

[ ... 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.dmoz.org/Computers/Programming/Languages/Python/Books/) xpath=None>
[s] item  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] spider  <BaseSpider 'default' at 0x1b6c2d0>
[s] xxs  <XmlXPathSelector (http://www.dmoz.org/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 browser

In [1]:

當(dāng)shell裝載之后,你將會得到一個(gè)response的本地變量。所以你輸入reponse.body,你能夠看見response的body部分或者你能夠輸入response.headers,你能夠看見reponse.headers部分。

shell同樣實(shí)例化了兩個(gè)選擇器,一個(gè)是HTML(在hvx變量里),一個(gè)是XML(在xxs變量里)。所以我們嘗試怎么使用它們:

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</title>']

In [3]: hxs.select('//title/text()')
Out[3]: [<HtmlXPathSelector (text) xpath=//title/text()>]

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è)頁面里提取真正的信息。

你能夠在控制臺里面輸入response.body,檢查源代碼里面的XPaths是否與預(yù)期相同。然而,檢查原始的HTML代碼是一件非??菰锓ξ兜氖虑?。假如你想讓你的工作變的簡單,你使用Firefox擴(kuò)展的插件例如Firebug來做這項(xiàng)任務(wù)。更多關(guān)于介紹信息請看Using Firebug for scrapingUsing Firefox for scraping。

當(dāng)你檢查了頁面源代碼之后,你將會發(fā)現(xiàn)頁面的信息放在一個(gè)<ul>元素里面,事實(shí)上,確切地說是第二個(gè)<ul>元素。

所以我們選擇每一個(gè)<li>元素使用如下的代碼:
 

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)。我們將會用到這些特性,所以:
 

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 selectorsWorking with relative XPaths相關(guān)的Selectors文檔
將代碼添加到我們spider中:

 

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('//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)在我們再次抓取dmoz.org,你將看到站點(diǎn)在輸出中被打印 ,運(yùn)行命令:
 

scrapy crawl dmoz

使用我們的 item

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

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

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

 

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('//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)在重新抓取dmoz.org網(wǎng)站:

[dmoz] 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']}
[dmoz] 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']}


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

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

 

scrapy crawl dmoz -o items.json -t json

它將會產(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)任何的條目管道。

相關(guān)文章

  • PyTorch中torch.utils.data.Dataset的介紹與實(shí)戰(zhàn)

    PyTorch中torch.utils.data.Dataset的介紹與實(shí)戰(zhàn)

    PyTorch是一個(gè)開源的Python機(jī)器學(xué)習(xí)庫,基于Torch,用于自然語言處理等應(yīng)用程序,下面這篇文章主要給大家介紹了關(guān)于PyTorch中torch.utils.data.Dataset的介紹與實(shí)戰(zhàn),需要的朋友可以參考下
    2022-06-06
  • python繪制二維直方圖的代碼實(shí)現(xiàn)

    python繪制二維直方圖的代碼實(shí)現(xiàn)

    本文主要介紹了python繪制二維直方圖的代碼實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • Django python雪花算法實(shí)現(xiàn)方式

    Django python雪花算法實(shí)現(xiàn)方式

    在Django項(xiàng)目中添加自定義模塊或應(yīng)用來封裝雪花算法,步驟包括創(chuàng)建應(yīng)用,編寫算法實(shí)現(xiàn)代碼至utils.py文件,及配置settings.py,此方法可方便在項(xiàng)目中隨處調(diào)用雪花算法,適用于需要唯一ID生成的場景
    2024-09-09
  • python配置grpc環(huán)境

    python配置grpc環(huán)境

    gRPC 是一款高性能、開源的 RPC 框架,產(chǎn)自 Google,基于 ProtoBuf 序列化協(xié)議進(jìn)行開發(fā),支持多種語言(Golang、Python、Java等),本篇只介紹 Python 的 gRPC 安裝使用
    2019-01-01
  • 對Tensorflow中的矩陣運(yùn)算函數(shù)詳解

    對Tensorflow中的矩陣運(yùn)算函數(shù)詳解

    今天小編就為大家分享一篇對Tensorflow中的矩陣運(yùn)算函數(shù)詳解,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • django最快程序開發(fā)流程詳解

    django最快程序開發(fā)流程詳解

    這篇文章主要介紹了django最快程序開發(fā)流程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Python實(shí)現(xiàn)用戶登錄注冊

    Python實(shí)現(xiàn)用戶登錄注冊

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)用戶登錄注冊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 使用Python+OpenCV進(jìn)行卡類型及16位卡號數(shù)字的OCR功能

    使用Python+OpenCV進(jìn)行卡類型及16位卡號數(shù)字的OCR功能

    本文將使用Python+OpenCV實(shí)現(xiàn)模板匹配算法,以自動識別卡的類型和以及16位卡號數(shù)字,通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-08-08
  • 如何基于python3和Vue實(shí)現(xiàn)AES數(shù)據(jù)加密

    如何基于python3和Vue實(shí)現(xiàn)AES數(shù)據(jù)加密

    這篇文章主要介紹了如何基于python3和Vue實(shí)現(xiàn)AES數(shù)據(jù)加密,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • python爬蟲爬取股票的北上資金持倉數(shù)據(jù)

    python爬蟲爬取股票的北上資金持倉數(shù)據(jù)

    這篇文章主要介紹了python爬蟲爬取股票的北上資金持倉數(shù)據(jù),文章基于python的相關(guān)資料展開爬取數(shù)據(jù)的詳細(xì)內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05

最新評論

华阴市| 昌乐县| 深圳市| SHOW| 桐梓县| 茂名市| 垦利县| 乡城县| 上高县| 仙桃市| 平邑县| 岚皋县| 将乐县| 昆山市| 江阴市| 四子王旗| 柳河县| 巫山县| 灵寿县| 乌鲁木齐市| 定襄县| 昆山市| 绵竹市| 紫阳县| 安龙县| 镇原县| 和顺县| 禄丰县| 黎川县| 太康县| 年辖:市辖区| 南江县| 屏东市| 库车县| 黔南| 定结县| 林芝县| 郓城县| 木兰县| 沐川县| 乌苏市|