码迷,mamicode.com
首页 > 编程语言 > 详细

python基础 爬虫框架scrapy

时间:2018-01-29 16:00:13      阅读:226      评论:0      收藏:0      [点我收藏+]

标签: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

标签:string   https   author   unicode   停止   blank   结果   项目   style   

原文地址:https://www.cnblogs.com/qiuruihuan/p/8376511.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!