崔庆才python3爬虫-13章 Scrapy框架的使用-Selector的使用
1 | 我们之前介绍了利用Beautiful Soup, pyquery以及正则表达式来提取网页数据,这确实非常方便,而 Scrapy还提供了自己的数据提取方法,即 Selector ( 选择器)。 Selector是基于lxml来构建的,支持XPath选择器、CSS选择器以及正则表达式,功能全面,解析速度和准确度非常高 |
直接使用
1 | Selector个可以独立使用的模块。我们可以直接利用S elector这个类来构建一个选择器对象,然后调用它的相关方法如xpath()、css()等来提取数据。 |
1 | 运行结果如下所示: |
scrapy shell
1 | 由于Selector主要是与Scrapy结合使用,如 Scrapy的回调函数中的参数response直接调用xpath()或者css()方法来提取数据,所以在这里我们借助Scrapy shell来模拟Scrapy请求的过程,来讲解相关的提取方法 |
1 | 我们用官方文档的一个样例页面来做演不:http://doc.scrapy.org/en/latest/_static/selectors-sample1.html0 |
1 | 我们可以在命令行模式下输入命令调用对象的一些操作方法,回车之后实时显示结果。这与 |
总结
1 | (因为很多网站都有反爬机制,其实使用 scrapy shell 的时候就是以 scrapy 爬虫的标志进行访问的,所以网站回拒绝爬虫的服务,返回 403) |
1 | 1.(只治标,不治本)在使用scrapy 的时候在最后加上 -s USER-AGENT="Mozills/5.0" |
1 | 2.(半治标半治本) |
1 | 3.(治愈) |
XPath选择器
1 | 进入Scrapy shell之后,我们将主要操作response这个变量来进行解析。因为我们解析的是HTML代码,Selector将自动使用HTML语法来分析。 |
1 | 我们用一个实例感受一下,如下所示: |
1 | 打印结果的形式是Selector组成的列表,其实它是Selector List类型, SelectorList和Selector都可以继续调用xpath()和css()等方法来进一步提取数据。 |
1 | 我们获得了a节点里面的所有img节点,结果为5 |
1 | 我们刚才使用了response.selector.xpath()方法对数据进行了提取。 Scrapy提供了两个实用的快捷方法,response.xpath()和 response.css(), 它们二者的功能完全等同于 response. selector.xpath()和 response.selector.css()o 方便起见,后面我们统一直接调用response的 xpath()和 css()方法进行选择。 |
1 | 但是现在获取的内容是Selector或者SelectorList类型,并不是真正的文本内容。那么具体的内容怎么提取呢? |
1 | 我们还可以改写XPath表达式,来选取节点的内部文本和属性,如下所示: |
1 | 但是这里有一个问题:如果符合要求的节点只有一个,那么返回的结果会是什么呢?我们再用一个实例来感受一下,如下所示: |
1 | 但是,这个写法很明显是有风险的。一旦XPath有问题,那么extract()后的结果可能是一个空列表。如果我们再用索引来获取,那不就会可能导致数组越界吗? |
XPath用法总结
1 | 1.找标签 |
1 | 2.获取内容 |
1 | 3.获取真实标签 |
1 | 4.获取属性 |
1 | 5.属性限制 |
CSS选择器
1 | 接下来,我们看看CSS选择器的用法 |
1 | 另外,我们也可以进行属性选择和嵌套选择,如下所示: |
1 | 我们也可以使用extract_first()方法提取列表的第一个元素,如下所示: |
1 | 接下来的两个用法不太一样。节点的内部文本和属性的获取是这样实现的,如下所示: |
1 | 获取文本和属性需要用::te x t和 ::a ttr ()的写法。而其他库如Beautiful Soup或 pyquery都有单独 |
css用法总结
1 | 1.获取文本 |
正则匹配
1 | Scrapy的选择器还支持正则匹配。比如,在示例的a 节点中的文本类似于Name: My image1 , 现在我们只想把Name:后面的内容提取出来,这时就可以借助re()方法,实现如下: |
1 | 不论正则匹配了几个分组,结果都会等于列表的第一个元素。 |
没有伞的孩子,必须努力奔跑!
Typewriter Mode** 已开启。
可以在视图菜单中关闭
不再显示关闭