python基础 爬虫框架scrapy

Posted qiuruihuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章

Python编程基础之(五)Scrapy爬虫框架

python的scrapy框架爬虫基础

分享《精通Python爬虫框架Scrapy》中文PDF+英文PDF+源代码+Python网络数据采集

Python爬虫基础--Scrapy框架的安装及介绍

小白学 Python 爬虫(40):爬虫框架 Scrapy 入门基础对接 Selenium 实战

小白学 Python 爬虫(37):爬虫框架 Scrapy 入门基础 Spider Middleware