欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

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

系統 1614 0

?在這個教材中,我們假定你已經安裝了Scrapy。假如你沒有安裝,你可以參考這個安裝指南。

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

這個教材將會帶你走過下面這幾個方面:

  • ??? 創造一個新的Scrapy項目
  • ??? 定義您將提取的Item
  • ??? 編寫一個蜘蛛去抓取網站并提取Items。
  • ??? 編寫一個Item Pipeline用來存儲提出出來的Items

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

創造一個項目

在你要抓取之前,首先要建立一個新的Scrapy項目。然后進去你的存放代碼目錄,執行如下命令。

            
scrapy startproject tutorial


          

它將會創建如下的向導目錄:

復制代碼 代碼如下:
tutorial/
??? scrapy.cfg
??? tutorial/
??????? __init__.py
??????? items.py
??????? pipelines.py
??????? settings.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類來聲明并定義它們的屬性作為scrapy.item.Field 對象,就像是一個對象關系映射(假如你不熟悉ORMs,你將會看見它是一個簡單的任務).

我們將需要的item模塊化,來控制從demoz.org網站獲取的數據,比如我們將要去抓取網站的名字,url和描述信息。我們定義這三種屬性的域。我們編輯items.py文件,它在向導目錄中。我們Item類看起來像這樣。

?

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

          

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

我們第一個Spider

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

??? 名字: Spider的標識. 它必須是唯一的, 那就是說,你不能在不同的Spiders中設置相同的名字。

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

??? parse() 是spider的一個方法, 調用時候傳入從每一個URL傳回的Response對象作為參數。response是方法的唯一參數。

??? 這個方法負責解析response數據和提出抓取的數據(作為抓取的items),跟蹤URLs

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

這是我們的第一個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工作, 到項目的頂級目錄讓后運行:

            
scrapy crawl dmoz


          

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

            
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 
            
             (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相關。你能夠看見每行初始化的URL日志信息。因為這些URLs是起始頁面,所以他們沒有引用referrers。 所以在每行的末尾部門,你能看見(referer: ).

但是有趣的是,在我們的parse方法作用下,兩個文件被創建: Books and Resources, 它保航兩個URLs的內容
剛剛發生了什么事情?

Scrapy為每一個start_urls創建一個scrapy.http.Request對象,并將爬蟲的parse 方法指定為回調函數。

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

提取Items
選擇器介紹

我們有多種方式去提取網頁中數據。Scrapy 使用的是XPath表達式,通常叫做XPath selectors。如果想了解更多關于選擇器和提取數據的機制,可以看看如下教程XPath selectors documentation.

這里有一些表達式的例子和它們相關的含義:

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

這里有許多的例子關于怎么使用XPath,可以說XPath表達式是非常強大的。如果你想要學習更多關于XPath,我們推薦如下教程this XPath tutorial.

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

你能夠把selectors作為對象,它代表文件結構中的節點。所以,第1個實例的節點相當于root節點,或者稱為整個文檔的節點。

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

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


在Shell里面使用選擇器

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

如果使用shell,你必須到項目的頂級目錄上,讓后運行如下命令:

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  
            
              
[s] item  Item()
[s] request 
              
              
[s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] spider  
              
                
[s] xxs  
                
                  
[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]:


                
              
            
          

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

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

            
In [1]: hxs.select('//title')
Out[1]: [
            
              ]

In [2]: hxs.select('//title').extract()
Out[2]: [u'
              
                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']




              
            
          

提取數據Extracting the data

現在我們開始嘗試在這幾個頁面里提取真正的信息。

你能夠在控制臺里面輸入response.body,檢查源代碼里面的XPaths是否與預期相同。然而,檢查原始的HTML代碼是一件非常枯燥乏味的事情。假如你想讓你的工作變的簡單,你使用Firefox擴展的插件例如Firebug來做這項任務。更多關于介紹信息請看Using Firebug for scraping和Using Firefox for scraping。

當你檢查了頁面源代碼之后,你將會發現頁面的信息放在一個

    元素里面,事實上,確切地說是第二個
      元素。

      所以我們選擇每一個

    • 元素使用如下的代碼:
      ?

                        
      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相關的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
      
                      

      現在我們再次抓取dmoz.org,你將看到站點在輸出中被打印 ,運行命令:
      ?

                        
      scrapy crawl dmoz
      
                      

      使用我們的 item

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

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

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

      ?

                        
      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項目里,同樣你可以訪問https://github.com/scrapy/dirbot

      現在重新抓取dmoz.org網站:

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


      存儲抓取的數據

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

      ?

                        
      scrapy crawl dmoz -o items.json -t json
      
                      

      它將會產生一個items.json文件,它包含所有抓取的items(序列化的JSON)。

      在一些小的項目里(例如我們的教程中),那就足夠啦。然而,假如你想要執行更多復雜的抓取items,你能夠寫一個 Item Pipeline。 因為在項目創建的時候,一個專門用于Item Pipelines的占位符文件已經隨著項目一起被建立,目錄在tutorial/pipelines.py。如果你只需要存取這些抓取后的items的話,就不需要去實現任何的條目管道。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 亚州一区二区三区 | 亚洲精品一区二区三区婷婷月色 | 波多野结衣中文一区 | 大蕉香蕉久久爱 | 最新亚洲视频 | 亚洲欧美日韩高清 | 天天干天天色综合 | 亚洲成a人片77777在线播放 | 一区二区在线 | 国产亚洲精彩视频 | 成人午夜免费福利视频 | 天堂热 | 日韩在线播放第一页 | 久久国产美女 | 波多野结衣三级在线观看 | 99久久久久久久 | 亚洲一区二区三区免费看 | 神秘电影91 | 成人午夜视频免费 | 九九九九精品视频在线播放 | 亚洲国产精品综合久久 | 奇米影视在线视频 | 日本高清免费网站 | 国产精品女A片爽爽波多洁衣 | 全黄裸片武则天一级第4季 亚洲一区国产 | 在线一级片| 在线观看av片 | 国产精品美女www爽爽爽视频 | 香蕉成人国产精品免费看网站 | 一级毛片特级毛片免费的 | 久久伊99综合婷婷久久伊 | 香蕉一区二区 | 在线成人av | 九九激情网 | 男女交配视频网站 | 国产不卡视频在线播放 | 久久久一区二区精品 | 四库影院永久在线精品 | 成人一级视频 | 中文字幕乱码一区二区三区 | 久久久久国产成人精品亚洲午夜 |