Scrapy-3.Selector和Request

2018-10-29  本文已影响0人  王南北丶

本文地址:https://www.jianshu.com/p/df7e56f2024c

数据提取(Selector)

Scrapy中,封装了我们常用的提取数据的方式,有正则、Xpath、CSS选择器等。而且Selector是基于lxml构建的,这就意味着性能上不会有太大问题。

Xpath和CSS选择器

由于使用Xpath和CSS选择器来提取数据非常普遍,所以Scrapy在response中设置了两个快捷接口,可以很方便的在response中使用Xpath和CSS选择器。

>>> response.xpath('//title/text()')
[<Selector (text) xpath=//title/text()>]
>>> response.css('title::text')
[<Selector (text) xpath=//title/text()>]

可以看到,使用Selector获取的是一个Selector对象的列表,所以可以嵌套和混合Xpath和CSS选择器使用:

>>> response.css('img').xpath('@src').extract()
[u'image1_thumb.jpg',
 u'image2_thumb.jpg',
 u'image3_thumb.jpg',
 u'image4_thumb.jpg',
 u'image5_thumb.jpg']

同时,由于获得的是一个Selector对象,所以,如果需要实际的提取出文本数据,那么就要使用一个特殊的方法.extract(),这个方法提取出的会是一个列表,包含的是所有符合条件的内容。

>>> response.xpath('//title/text()').extract()
[u'Example website']

如果只需要提取一个数据,那么可以使用.extract_first(),这个方法会默认的提取出第一个结果。

>>> response.xpath('//div[@id="images"]/a/text()').extract_first()
u'Name: My image 1 '

这个方法如果没有提取到任何数据,那么将会返回一个None,当然,你也可以自行设定没有找到结果返回的内容。

>>> response.xpath('//div[@id="not-exists"]/text()').extract_first() is None
True
>>> response.xpath('//div[@id="not-exists"]/text()').extract_first(default='not-found')
'not-found'

正则表达式

Selector同样也提供了一个.re()方法,可以快捷的使用正则提供数据,但是由于正则提取出的结果都是字符串,所以正则提取的结果不再能够像.xpath()一样嵌套使用了。

>>> response.xpath('//a[contains(@href, "image")]/text()').re(r'Name:\s*(.*)')
[u'My image 1',
 u'My image 2',
 u'My image 3',
 u'My image 4',
 u'My image 5']

同时,对正则也提供了一个与.extract_first()相对应地.re_first()方法,可以只提取出第一个匹配的字符串。

>>> response.xpath('//a[contains(@href, "image")]/text()').re_first(r'Name:\s*(.*)')
u'My image 1'

Request

Scrapy中,请求和响应都被封装成了一个个RequestResponse对象,方便传递和进行处理。

Spider的解析方法中,如果我们获得了接下来要访问的url,那么我们就需要使用yield Request()的方式生成一个Request对象,并返回出去。

这是目前大规模爬取基本都会使用的一个模式。

class scrapy.http.Request(url[, callback, method='GET', headers, body, cookies, meta, encoding='utf-8', priority=0, dont_filter=False, errback, flags])

参数

Request属性与方法

Request这个对象里也有一些属性和方法,可以在后续的处理中进行使用。

Request.meta中的特殊key

在构造Request对象的时候,可以使用Request.meta属性来传递一些数据到回调函数中。但是meta这个属性不止有这个作用,其中还有一些特殊的key有特殊的作用。

它们分别是:


FormRequest

FormRequestRequest的子类,主要是扩展了处理HTML表单的功能。

class scrapy.http.FormRequest(url[, formdata, ...])

FormRequest添加了一个formdata参数,其余的参数都与Request相同。

这个子类最大的作用是在发送POST请求时,能够使用字典发送POST提交的表单数据。

例子:

yield scrapy.FormRequest(url="http://www.example.com/post/action",
                    formdata={'name': 'John Doe', 'age': '27'},
                    callback=self.after_post)

系列文章:

上一篇下一篇

猜你喜欢

热点阅读