python基礎 爬蟲框架scrapy
該實例爬取: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