scrapy框架Selector提取数据
从页面中提取数据的核心技术是HTTP文本解析,在python中常用的模块处理:
BeautifulSoup 非常流行的解析库,API简单,但解析的速度慢。
lxml 是一套使用c语言编写的xml解析库,解析速度快,API相对比较复杂。
Scrapy中的Selector类是基于lxml库建立的,并且简化了API接口。在使用的过程中先使用xpath或者css选择器选中页面中要提取的数据,然后进行提取。
提取数据
调用Selector或者SelectList对象的以下几种方法可将选中的内容进行提取
extract() 返回选中内容的Unicode字符串。
extract_first() SelectorList专有,返回其中第一个Selector对象调用extract方法。通常SelectorList中只含有一个Selector对象的时候选择调用该方法。
re() 使用正则表达式来提取选中内容中的某部分。
举个例子
selector.xpath('.//b/text()') .extract #[‘价格:99.00元’,‘价格:88.00元’,‘价格:88.00元’]
selector.xpath('.//b/text()').re('\d+\.\d+') #[ '99.00','88.00','88.00']
re_first() 返回SelectorList对象中的第一个Selector对象调用re方法。
selector.xpath('.//b/text()').re_first('\d+\.\d+') # '99.00'
实际的开发过程中,几乎不需要手动创建Selector对象,,Response对象以自身参数自动创建Selector对象
response.xpath('.//h1/text').extract() # [ 'song','shi','chao']
response.css('li::text').extract() # [ 'song','shi','chao']
xpath选择器
xpath即xml路径语言,用来确定xml文档中某个部分的语言,xml文档(html属于xml)是一系列节点构成的树。
基础语法
/ 选中文档的根 描述一个从根开始的绝对路径 ./表示从当前节点选取 (比如提取了一部分,还需要从提取出来里面进行提取就会使用,如果不加 . 会从整个文档中开始提取)
. 选中当前节点 用来描述相对路径
.. 选中当前节点的父节点 用来描述相对路径
ELEMENT 选中子节点中所有的ELEMENT元素节点
//ELEMENT 选中子孙节点中所有的ELEMENT元素节点
* 选中所有元素子节点
text() 选中所有文本子节点
@ATTR 选中名为ATTR的属性节点
@* 选中所有的属性节点
[谓语] 谓语用来查找某个特定的节点或者包含某个特定值的节点
举例
response.xpath('/html/body/div') #选取body下的所有div
response.xpath('//a') #选中文档所有a
response.xpath('/html/body//div') #选中body下的所有节点中的div,无论在什么位置
response.xpath('//a/text()') #选取所有a的文本
response.xpath('/html/div/*') #选取div的所有元素子节点
response.xpath('//div/*/img') #选取div孙节点的所有img
response.xpath('//img/@src') #选取所有img的src属性
response.xpath('//a[1]/img/@*') #选取第一个a下img的所有属性
response.xpath('//a[2]') #所有a中的第2个
response.xpath('//a[last()]') #所有a中的最后一个 ('/a[last()-1]')#倒第二个 ('//a[position()<=3]')#使用position函数选中前三个 ('//div[@id]')#选中所有含有id属性的div ('//div[@id="song"]')#选中所有id属性为song的div
response.xpath('//p[contains(@class,'song')]') #选择class属性中含有‘song’的p元素
response.xpath('//div/a | //div/p') 或者,页面中可能是a可能是p
css选择器
css即层叠样式表,选择器不如xpath强大,原理就是选择的时候翻译成xpath表达式在调用xpath方法。
* 选择所有节点
#container 选择id为container的节点
.container 选择class包含container的节点
li a 选择 所有 li 下的所有 a 节点
ul + p 选择所有ul后面的第一个p元素
#container > ul 选择id为container的第一个ul节点
a[class] 选取所有有class属性的a元素
a[href="http://b.com"] 含有href="http://b.com"的a元素
a[href*='job'] 包含job的a元素
a[href^='https'] 开头是https的a元素
a[href$='cn'] 结尾是cn的a元素
response.css('div a::text').extract() 所有div下所有a的文本
response.css('div a::attr(href)').extract() href的值
response.css('div>a:nth-child(1)') 选中每个div的第一个a > 会设定只在子节点中找,不会到孙节点中
response.css('div:not(#container)') 选取所有id不是container的div
response.css('div:first-child>a:last-child') 第一个div中最后一个a
scrapy框架Selector提取数据的更多相关文章
- Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)
1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...
- Scrapy 框架 CrawlSpider 全站数据爬取
CrawlSpider 全站数据爬取 创建 crawlSpider 爬虫文件 scrapy genspider -t crawl chouti www.xxx.com import scrapy fr ...
- 提升Scrapy框架爬取数据效率的五种方式
1.增加并发线程开启数量 settings配置文件中,修改CONCURRENT_REQUESTS = 100,默认为32,可适当增加: 2.降低日志级别 运行scrapy时会产生大量日志占用CPU,为 ...
- 爬虫必知必会(6)_提升scrapy框架爬取数据的效率之配置篇
如何提升scrapy爬取数据的效率:只需要将如下五个步骤配置在配置文件中即可 增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_ ...
- Scrapy框架之基于RedisSpider实现的分布式爬虫
需求:爬取的是基于文字的网易新闻数据(国内.国际.军事.航空). 基于Scrapy框架代码实现数据爬取后,再将当前项目修改为基于RedisSpider的分布式爬虫形式. 一.基于Scrapy框架数据爬 ...
- scrapy 中用selector来提取数据的用法
一. 基本概念 1. Selector是一个可独立使用的模块,我们可以用Selector类来构建一个选择器对象,然后调用它的相关方法如xpaht(), css()等来提取数据,如下 from sc ...
- 爬虫(十五):Scrapy框架(二) Selector、Spider、Downloader Middleware
1. Scrapy框架 1.1 Selector的用法 我们之前介绍了利用Beautiful Soup.正则表达式来提取网页数据,这确实非常方便.而Scrapy还提供了自己的数据提取方法,即Selec ...
- 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据
为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...
- scrapy框架基于CrawlSpider的全站数据爬取
引入 提问:如果想要通过爬虫程序去爬取”糗百“全站数据新闻数据的话,有几种实现方法? 方法一:基于Scrapy框架中的Spider的递归爬取进行实现(Request模块递归回调parse方法). 方法 ...
随机推荐
- os模块、os.path模块、shutil模块、configparser模块、subprocess模块
一.os模块 os指的是操作系统 该模块主要用于处理与操作系统相关的操作,常用的是文件操作(读.写.删.复制.重命名). os.getcwd() 获取当前文件所在的文件夹路径 os.chdir() ...
- 编辑datagridview单元格
以这3种为例,最简单的是第三种,直接让单元格处于可编辑状态,当完成编辑后触发CellEndEdit事件,最后对输入的数据进行处理. private DateTimePicker dtp = new D ...
- BZOJ.1492.[NOI2007]货币兑换(DP 斜率优化 CDQ分治/Splay)
BZOJ 洛谷 如果某天能够赚钱,那么一定会在这天把手上的金券全卖掉.同样如果某天要买,一定会把所有钱花光. 那么令\(f_i\)表示到第\(i\)天所拥有的最多钱数(此时手上没有任何金券),可以选择 ...
- Java实现FTP与SFTP文件上传下载
添加依赖Jsch-0.1.54.jar <!-- https://mvnrepository.com/artifact/com.jcraft/jsch --> <dependency ...
- (转)JavaWeb学习之Servlet(一)----MyEclipse及Tomcat的配置
[声明] 欢迎转载,但请保留文章原始出处→_→ 文章来源:http://www.cnblogs.com/smyhvae/p/4134921.html [开发环境] 物理机版本:Win 7旗舰版(64位 ...
- Yii2 组件
组件的命名空间: 响应组件: yii\web\Response Yii预定义的HTTP异常组件: yii\web\BadRequestHttpException: //状态码 400. yii\web ...
- Codeforces Round #539 (Div. 2)
Codeforces Round #539 (Div. 2) A - Sasha and His Trip #include<bits/stdc++.h> #include<iost ...
- 小甲鱼Python第四讲课后习题
1while语句中,当条件为真时,它会一直循环下去,比如下面的例子,不过可以用Ctral + C来强制结束 while 'C': print("i love you") 2.观察打 ...
- 使用js冒泡实现点击空白处关闭弹窗
什么是事件冒泡? 如图:在一个对象上触发某类事件(比如单击onclick事件),这个事件会向这个对象的父级对象传播,从里到外,直至它被处理(父级对象所有同类事件都将被激活),或者它到达了对象层次的最顶 ...
- 100本Python精品书籍(附pdf电子书下载)
51本Python精品书籍(附下载)链接: https://pan.baidu.com/s/19ydAKCFxM0plkepXMlqQLg 提取码: nnpe 400集python视频教程下载:链接: ...