上一篇Scrapy爬虫框架笔记(一)记录了配置环境和Scrapy框架最简单的一个小应用,抓取了网页源码。但是在实际的应用中我们需要的是网页上的部分信息,这时我们需要从源码中提取所需要的数据,就需要使用选择器(Selectors)。通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。 CSS 是一门将HTML文档样式化的语言。选择器由它定义,并与特定的HTML元素的样式相关连。
构造选择器
为了方便起见,response
对象以 .selector
属性提供了一个selector, 您可以随时使用该快捷方法。
使用选择器
Scrapy提供了两个实用的快捷方式: response.xpath()
及 response.css()
。
>>> response.xpath('//title/text()')
[<Selector (text) xpath=//title/text()>]
>>> response.css('title::text')
[<Selector (text) xpath=//title/text()>]
为了提取真实的原文数据,你需要调用 .extract()
>>> response.xpath('//title/text()').extract()
[u'Example website']
>>> response.xpath('//base/@href').extract()
[u'http://example.com/']
>>> response.css('base::attr(href)').extract()
[u'http://example.com/']
注:Selector 也有一个 .re() 方法,用来通过正则表达式来提取数据。response.css('a::text').re('写正则')
。如果前面匹配的是多个对象,那么加上正则也是匹配符合要求的多个对象。这里如果想要匹配第一个对象,可以把re()修改成re_first()即可。
使用相对XPaths
如果你使用嵌套的选择器,并使用起始为 / 的XPath,那么该XPath将对文档使用绝对路径,而且对于你调用的 Selector 不是相对路径。
eg:从div标签中找p标签的内容
>>> divs = response.xpath('//div')#所有的div标签
>>> for p in divs.xpath('//p'): # 这样会找到从整篇中找p标签
... print p.extract()
#以下两种方法可以只找div标签下的p标签
>>> for p in divs.xpath('.//p'):
... print p.extract()
>>> for p in divs.xpath('p'):
... print p.extract()
注:有时存在多个相同的标签但我们只想要其中某一个标签的信息,可以使用如下方法。
response.css('div[class="cla"]::text').extract()#获取指定属性的文本
网站爬取不了时候提示403,robots,.txt时,需要忽略robots协议,settings 里有一个robots协议,把那个True改成False就行了。