1. 程式人生 > >python基礎 爬蟲框架scrapy

python基礎 爬蟲框架scrapy

list sep 叠代 ber block extra 順序組 num 分享

技術分享圖片

技術分享圖片

該實例爬取: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