標籤: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