单独使用 Scrapy 框架的 Selector 选择器

mywang88

2018-12-16

背景

Scrapy 框架是一个经典的 Python 爬虫框架。

Scrapy 框架中的 Selector 类提供了多种 html/xml 节点选择器的方法,例如:css 选择器、xpath 选择器、re 选择器等。

使用 scrapy.Selector 类的好处之一,就是不需要再导入(import)其它工具包,例如 lxml 等,直接调用选择器,并输入对应语法即可。

在开发和测试中,有时我们需要单独使用 Scrapy 框架的 Selector 类的方法,而不是创建一个完整的 Scrapy 项目,因为创建一个项目需要好多步骤。例如,当我们只需要发送一个 get 请求,然后解析响应体(html 代码),那么我们明显更倾向于使用 requests 库的 get 方法,而不是使用 Scrapy 框架(创建一个项目,创建一个爬虫,创建 start_request 方法,创建 parse 方法,在命令行模式下启动爬虫,初始化各种设置,加载各种中间件,等等等等)。

笔者就遇到了这样的需求:

不启动 Scrapy 框架,在程序中单独使用 scrapy.Selector 类

这样做还有一个好处,那就是这样开发出的解析函数可以直接用在已有的 Scrapy 框架项目中,而不需要额外导入其它依赖。

方法

实现方法可以概括成一句话:

用要解析的 html 代码,创建一个 scrapy.Selector 类的实例。

代码如下:

import scrapy

# 这是一段 html 代码
html = '''
<html>
    <body>
        <h1>这是标题</h1>
        <p>这是第一段</p>
        <p>这是第二段</p>
    </body>
</html>
'''
# 创建一个 Selector 类的实例,将 html 赋值给类属性 text
sel = scrapy.Selector(text=html)
# 调用 Selector 类的 css 方法,即 css 选择器
words = sel.css('p::text').extract()

print(words)

运行结果:

[‘这是第一段’, ‘这是第二段’]

这样,就在不创建也不启动 Scrapy 项目的情形下调用了 Selector 类的选择器方法。

实际应用场景是这样的:

import requests
import scrapy

# 这是百度新闻主页
url = 'https://news.baidu.com/'
res = requests.get(url=url)
html = res.text

sel = scrapy.Selector(text=html)
# 解析抓取“热点要闻”
words = sel.css('div[id="pane-news"] a::text').extract()

for word in words:
    print(word)

运行结果篇幅较大,涉及词汇较多,有时效性,因此就不展示了。

需要补充的是,用来解析的 css 选择器也有时效性,网站随时会重构。

总之,没有启动 Scrapy 项目,用了 Selector 选择器。

小结

没什么好总结的,既然折腾测试了俩小时,就写个帖子水一发…

实际情况是最近要给一个新闻采集的 Scrapy 爬虫项目写一个通用型的新闻内容解析函数,需要频繁地实时分析调试,懒得每次都启动 Scrapy 项目…

猜你喜欢

转载自blog.csdn.net/mywang88/article/details/85030072