入门级爬虫总体分为两步:下载网页、提取数据
提取数据是我们的终极目的,提取数据的方法很多。最原始的是正则表达式,即使正则表达式是那么的不人性化,但是不可否认他的强大之处。当然在Python的世界里,它允许你不会使用正则表达式,他给你提供了另一种十分简洁的方法:lxml,它通过层层节点来提取数据。但是这仿佛没有让程序员们停下脚步来,不久更加便捷的BeautifulSoup诞生了,BeautifulSoup会把html拆解成对象处理,全篇转成字典和数组进行处理,操作更加傻瓜。
带来了更大的好处,必然会牺牲一些东西,BeautifulSoup在大大降低提取难度的时候也降低了提取的速度,而这个时候lxml(通过特定的XPath或CSS表达式来选择HTML文件中的某个部分)开始逐渐被大部分希望速度和便捷度并存的程序员所接受。Scrapy就选择了lxml作为它的选择器的基础,Scrapy选择器构建于lxml上,这意味着它在速度和解析准确性上非常相似。
Scrapy的构造器是以文字或TextResponse构造的Selector实例,它会根据输入的类型自动选择最优化的分析方法,而你不需要去考虑里面具体的实现方法。
Scrapy的选择器功能强于lxml与BeautifulSoup,在自由度方面,也高于两者,我们以http://blog.csdn.net为例,使用Scrapy选择器提取内容。
1、使用.xpath()提取内容
![v2-cfae7ac474b2c0e9f0f047e80b2cf36b_b.png](https://i-blog.csdnimg.cn/blog_migrate/4cbe59710b2a244fecad36239ffd3459.png)
2、使用.css()提取内容
![v2-56b9bc6d7d66793b4956de73fd21dea7_b.png](https://i-blog.csdnimg.cn/blog_migrate/6515749ae13e08ada38405cc9300cf66.png)
主要内容都写在代码注释中,请配合注释、代码以及输出仔细阅读,如果还对Scrapy的选择器不太了解,可以仔细阅读Scrapy的官方文档。
下面使一些官方文档给出的当你使用Scrapy中的选择器XPath时候可能会有用的一些意见,这些建议是建立在ScrapingHub’s blog ,如果你对XPath还不熟悉,请仔细阅读这篇文章:XPath tutorial.
3、有关于XPath的一些建议
1)使用.代替.//text()
因为.//text()返回的是一个节点集合(set),当一个节点集合(node-set)转强制换成string的时候,它仅仅会返回集合中的第一个元素。
>>> from scrapy import Selector
>>> sel = Selector(text='<a href="#">Click here to go to the <strong>Next Page</strong></a>')
>>> sel.xpath('//a//text()').extract() # take a peek at the node-set
[u'Click here to go to the ', u'Next Page']
>>> sel.xpath("//a[contains(., 'Next Page')]").extract()
[u'<a href="#">Click here to go to the <strong>Next Page</strong></a>']
2)注意//node[1]和(//node)[1]的区别
这种问题,熟悉Python的人都应该知道。
- //node[1]选择所有位于第一个子节点位置的node节点
- (//node)[1]选择整个文档中的node节点,并且返回每个node节点的第一个节点
3)使用class查找时优先考虑CSS
因为一个元素可能包含很多的CSS样式,使用XPath中的class选择法很复杂,而使用CSS看起来更加易读。
>>> from scrapy import Selector
>>> sel = Selector(text='<div class="hero shout"><time datetime="2014-07-23 19:00">Special date</time></div>')
>>> sel.css('.shout').xpath('./time/@datetime').extract()
[u'2014-07-23 19:00']
更多文章,关注:知乎专栏