python基礎 爬蟲架構scrapy

來源:互聯網
上載者:User

標籤:string   https   author   unicode   停止   blank   結果   項目   style   

該執行個體爬取:http://quotes.toscrape.com/page/1/一、建立項目

二、明確目標

三、製作爬蟲

def parse(self, response):                l = ItemLoader(item=QuotesItem(), response=response)                l.add_xpath(‘text‘, ‘//div/span/text()‘)                l.add_xpath(‘author‘, ‘//div/small/text()‘)                l.add_xpath(‘tags‘, ‘//div[@class=‘tags‘]/a/text()‘)            return l.load_item()  

 

先來弄明白倆個概念:

 

內建的處理器

儘管你可以使用可調用的函數作為輸入輸出處理器,Scrapy提供了一些常用的處理器。有些處理器,如MapCompose(通常用於輸入處理器),能把多個函數執行的結果按順序組合起來產生最終的輸出。

下面是一些內建的處理器:

1 Identity

class scrapy.loader.processors.Identity

最簡單的處理器,不進行任何處理,直接返回原來的資料。無參數。

.2 TakeFirst

class scrapy.loader.processors.TakeFirst

返回第一個非空(non-null/non-empty)值,常用於單值欄位的輸出處理器。無參數。

樣本如下:

>>> from scrapy.loader.processors import TakeFirst>>> proc = TakeFirst()>>> proc([‘‘, ‘one‘, ‘two‘, ‘three‘])‘one‘
.3 Join

class scrapy.loader.processors.Join(separator=u’ ‘)

返回用分隔字元串連後的值。分隔字元預設為空白格。不接受Loader contexts。

當使用預設分隔符號的時候,這個處理器等同於這個函數:

u‘ ‘.join

使用樣本:

>>> from scrapy.loader.processors import Join>>> proc = Join()>>> proc([‘one‘, ‘two‘, ‘three‘])u‘one two three‘>>> proc = Join(‘<br>‘)>>> proc([‘one‘, ‘two‘, ‘three‘])u‘one<br>two<br>three‘
4 Compose

class scrapy.loader.processors.Compose(*functions, **default_loader_context)

用給定的多個函數的組合而構造的處理器。每個輸入值被傳遞到第一個函數,然後其輸出再傳遞到第二個函數,諸如此類,直到最後一個函數返回整個處理器的輸出。

預設情況下,當遇到None值的時候停止處理。可以通過傳遞參數stop_on_none=False改變這種行為。

使用樣本:

>>> from scrapy.loader.processors import Compose>>> proc = Compose(lambda v: v[0], str.upper)>>> proc([‘hello‘, ‘world‘])‘HELLO‘

 

每個函數可以選擇接收一個loader_context參數。

.5 MapCompose

class scrapy.loader.processors.MapCompose(*functions, **default_loader_context)

與Compose處理器類似,區別在於各個函數結果在內部傳遞的方式:

  • 輸入值是被迭代的處理的,每一個元素被單獨傳入第一個函數進行處理。處理的結果被l串連起來(concatenate)形成一個新的迭代器,並被傳入第二個函數,以此類推,直到最後一個函數。最後一個函數的輸出被串連起來形成處理器的輸出。

  • 每個函數能返回一個值或者一個值列表,也能返回None(會被下一個函數所忽略)

  • 這個處理器提供了方便的方式來組合多個處理單值的函數。因此它常用與輸入處理器,因為用extract()函數提取出來的值是一個unicode strings列表。

下面的例子能說明這個處理器的工作方式:

>>> def filter_world(x):...     return None if x == ‘world‘ else x...>>> from scrapy.loader.processors import MapCompose>>> proc = MapCompose(filter_world, unicode.upper)>>> proc([u‘hello‘, u‘world‘, u‘this‘, u‘is‘, u‘scrapy‘])[u‘HELLO, u‘THIS‘, u‘IS‘, u‘SCRAPY‘]

 

與Compose處理器類似,它也能接受Loader context。

6 SelectJmes

class scrapy.loader.processors.SelectJmes(json_path)

查詢指定的JSON path並返回輸出。需要jmespath(https://github.com/jmespath/jmespath.py)支援。每次接受一個輸入。

樣本:

>>> from scrapy.loader.processors import SelectJmes, Compose, MapCompose>>> proc = SelectJmes("foo") #for direct use on lists and dictionaries>>> proc({‘foo‘: ‘bar‘})‘bar‘>>> proc({‘foo‘: {‘bar‘: ‘baz‘}}){‘bar‘: ‘baz‘}

 

與Json一起使用:

>>> import json>>> proc_single_json_str = Compose(json.loads, SelectJmes("foo"))>>> proc_single_json_str(‘{"foo": "bar"}‘)u‘bar‘>>> proc_json_list = Compose(json.loads, MapCompose(SelectJmes(‘foo‘)))>>> proc_json_list(‘[{"foo":"bar"}, {"baz":"tar"}]‘)[u‘bar‘]

python基礎 爬蟲架構scrapy

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.