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

mywang88css

2018-12-16html

背景

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

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

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

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

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

不启动 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 项目…