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

本文介绍了如何在不启动完整Scrapy项目的情况下,单独使用Scrapy的Selector类进行HTML解析。通过创建Selector实例并传入HTML内容,可以方便地利用其提供的css、xpath等选择器方法,适用于开发和测试中快速解析响应体。这种方法使得解析函数可以直接应用于Scrapy项目,而无需额外导入依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 项目…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值