Bluemoss 是一个用于基于模板的网页抓取的 Python 框架,旨在简化从网页中提取数据的过程。它通过创建 Node
对象来定义抓取规则,允许用户指定从哪些 HTML 标签中提取数据、如何转换和结构化这些数据。以下是 bluemoss 的主要特点和使用方式的介绍:
主要特点
- 基于模板的抓取:
- Bluemoss 使用
Node
对象作为抓取的“配方”,描述要从哪些 HTML 标签中提取数据,以及如何处理和格式化这些数据。 - 支持灵活的数据提取和转换,适合各种网页结构。
- XPath 支持:
- Bluemoss 使用 XPath 1.0 来定位 HTML 标签,即使不熟悉 XPath,用户也可以借助工具(如 ChatGPT)快速学习和生成所需的 XPath 表达式。
- 灵活的过滤和转换:
- 提供
filter
参数,允许用户指定抓取特定标签(如第一个、第二个或全部匹配的标签)。 - 支持
transform
函数,用于在抓取后对数据进行自定义处理(如提取 URL 中的特定部分)。 - 支持
Range
类,用于选择特定索引范围的标签,甚至可以反向排序。
- 结构化输出:
- 可以将抓取结果存储为字典、列表或其他结构化格式,方便后续处理。
- 例如,可以将抓取的公司名称存储在字典的特定键下。
- 简单易用:
- 提供直观的 API,适合初学者和有经验的开发者。
- 通过简单的代码即可实现复杂的抓取任务。
安装
Bluemoss 可以通过 pip 安装:
pip install bluemoss
使用示例
以下是一些基于 bluemoss 官方文档的示例,展示如何使用该库抓取数据。假设有以下 HTML 文档:
<html>
<body>
<li><a href="/portfolio?company=apple">Apple</a><div class="location_us"><p>Cupertino</p></div></li>
<li><a href="/portfolio?company=google">Google</a><div class="location_us"><p>Mountain View</p></div></li>
<li><a href="/portfolio?company=deepmind">DeepMind</a><div class="location_uk"><p>London</p></div></li>
</body>
</html>
示例 1:抓取第一个 <a>
标签的文本
from bluemoss import Node, scrape
node = Node('a') # 定位 <a> 标签
result = scrape(node, HTML) # HTML 是上述 HTML 字符串
print(result) # 输出: 'Apple'
示例 2:抓取第二个美国公司总部
node = Node('div[contains(@class, "location_us")]', filter=1) # 定位第二个 class 包含 "location_us" 的 div
result = scrape(node, HTML)
print(result) # 输出: 'Mountain View'
示例 3:抓取所有美国公司总部
node = Node('div[contains(@class, "location_us")]', filter=None) # 抓取所有匹配的标签
result = scrape(node, HTML)
print(result) # 输出: ['Cupertino', 'Mountain View']
示例 4:抓取公司 ID(从 href 属性中提取)
def get_company_id(href: str) -> str:
return href.split('=')[-1] # 从 href 中提取 company ID
node = Node('a', extract='href', transform=get_company_id) # 提取 href 属性并应用转换
result = scrape(node, HTML)
print(result) # 输出: 'apple'
示例 5:将抓取结果存入字典
node = Node('a', key='companies') # 将结果存入字典的 'companies' 键
result = scrape(node, HTML)
print(result) # 输出: {'companies': 'Apple'}
高级功能
- 过滤范围:使用
Range
类选择特定索引范围的标签。例如,Node('a', filter=Range(1, 3))
抓取索引 1 到 2 的<a>
标签。 - 反向排序:通过
Range
对象的reverse=True
参数,可以反向抓取数据。 - 属性提取:支持提取 HTML 标签的属性(如
href
),并可通过Ex
枚举(如Ex.HREF
)简化操作。
适用场景
- 数据采集:从网页中提取结构化数据,如公司名称、价格、评论等。
- 自动化任务:结合其他工具,定期抓取网页数据用于分析或监控。
- 学习和研究:适合初学者学习网页抓取,也适合开发者构建复杂的抓取逻辑。
文档和资源
- GitHub 仓库:https://github.com/LucaTabone/bluemoss
- 官方文档:https://bluemoss.readthedocs.io
- PyPI:https://pypi.org/project/bluemoss/
注意事项
- XPath 学习:如果不熟悉 XPath,可以使用 ChatGPT 或其他工具生成合适的表达式。
- 合法性:抓取网页时需遵守目标网站的服务条款,避免违反法律或道德规范。
- 依赖:确保安装了必要的依赖(如
lxml
),以支持 XPath 和 HTML 解析。
Bluemoss 是一个轻量且强大的工具,适合需要快速、灵活抓取网页数据的开发者。通过简单的配置和强大的功能,它可以大大简化网页抓取任务。