精通scrapy爬虫03使用Selector提取数据
Selector对象
- Scrapy综合bs(beautifulSoup)和lxml两者优点实现了Selector类,它是基于lxml库构建的,并简化了API接口。在Scrapy中使用Selector对象提取页面中的数据,使用时先通过XPath或CSS选择器选中页面中要提取的数据,然后进行提取。
- Selectors选择器
Scrapy Selectors 内置 XPath 和 CSS Selector 表达式机制
Selector有四个基本的方法,最常用的还是xpath:
xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表
extract(): 序列化该节点为Unicode字符串并返回list
css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表,语法同 BeautifulSoup4
re(): 根据传入的正则表达式对数据进行提取,返回Unicode字符串list列表
进入交互模式了解下基本方法,这里以漫画db为例
Scrapy Shell根据下载的页面会自动创建一些方便使用的对象,例如 Response 对象,以及 Selector 对象 (对HTML及XML内容)。
当shell载入后,将得到一个包含response数据的本地 response 变量,输入 response.body将输出response的包体,输出 response.headers 可以看到response的包头。
输入 response.selector 时, 将获取到一个response 初始化的类 Selector 的对象,此时可以通过使用 response.selector.xpath()或response.selector.css() 来对 response 进行查询。
Scrapy也提供了一些快捷方式, 例如 response.xpath()或response.css()同样可以生效(如之前的案例)。
─$ scrapy shell "https://www.manhuadb.com/"
#返回xpath对象列表
In [4]: response.xpath('//h2').xpath('./text()')
Out[4]:
[<Selector xpath='./text()' data='辉夜姬想让人告白~天才们的恋爱头脑战~'>,
<Selector xpath='./text()' data='魔王奶爸(恶魔奶爸)'>,
<Selector xpath='./text()' data='ZETMAN 超魔人'>,
<Selector xpath='./text()' data='盾之勇者成名录'>,
<Selector xpath='./text()' data='东京食尸鬼re(东京喰种re)'>,
<Selector xpath='./text()' data='关于我转生变成史莱姆这档事'>,
<Selector xpath='./text()' data='辉夜姬想让人告白~天才们的恋爱头脑战~'>,
<Selector xpath='./text()' data='魔王奶爸(恶魔奶爸)'>,
<Selector xpath='./text()' data='ZETMAN 超魔人'>,
<Selector xpath='./text()' data='盾之勇者成名录'>,
<Selector xpath='./text()' data='东京食尸鬼re(东京喰种re)'>,
...
- 首先来看extract方法,调用Selector对象的extract方法将返回选中内容的Unicode字符串
与SelectorList对象的xpath和css方法类似,SelectorList对象的extract方法内部会调用其中每个Selector对象的extract方法,并把所有结果收集到一个列表返回给用户:
#返回的selector列表
In [5]: s1 = response.xpath('//h2').xpath('./text()')
In [6]: s1[1].extract()
Out[6]: '魔王奶爸(恶魔奶爸)'
In [7]: type(s1)
Out[7]: scrapy.selector.unified.SelectorList
In [8]: s1
Out[8]:
[<Selector xpath='./text()' data='辉夜姬想让人告白~天才们的恋爱头脑战~'>,
<Selector xpath='./text()' data='魔王奶爸(恶魔奶爸)'>,
<Selector xpath='./text()' data='ZETMAN 超魔人'>,
<Selector xpath='./text()' data='盾之勇者成名录'>,
<Selector xpath='./text()' data='东京食尸鬼re(东京喰种re)'>,
<Selector xpath='./text()' data='关于我转生变成史莱姆这档事'>,
<Selector xpath='./text()' data='辉夜姬想让人告白~天才们的恋爱头脑战~'>,
<Selector xpath='./text()' data='魔王奶爸(恶魔奶爸)'>,
<Selector xpath='./text()' data='ZETMAN 超魔人'>,
<Selector xpath='./text()' data='盾之勇者成名录'>,
<Selector xpath='./text()' data='东京食尸鬼re(东京喰种re)'>,
<Selector xpath='./text()' data='关于我转生变成史莱姆这档事'>,
<Selector xpath='./text()' data='漫画'>,
<Selector xpath='./text()' data='漫画'>,
<Selector xpath='./text()' data='漫画'>,
...]
css选择器
# 选中所有的img
>>> response.css('img')
# 选中所有base和title
>>> response.css('base,title')
# div 后代中的img
>>> response.css('div img')
# body 子元素中的div
>>> response.css('body>div')
# 选中包含style属性的元素
>>> response.css('[style]')
# 选中属性id值为images-1的元素
>>> response.css('[id=images-1]')
# 选中每个div的第一个a
>>> response.css('div>a:nth-child(1)')
# 选中第二个div的第一个a
>>> response.css('div:nth-child(2)>a:nth-child(1)')
response.css('a::text')
小结
本章学习了从页面中提取数据的相关内容,首先带大家了解了
Scrapy中的Selector对象,然后学习如何使用Selector对象在页面
中选中并提取数据,最后通过一系列例子讲解了XPath和CSS选择器
的用法。
博观而约取,厚积而薄发。