跳转至

SAGE 工具文档: Nature_News_Fetcher_Tool

!!! success "工具状态: 可用" 版本: 1.0.0 描述: 一个从《自然》(Nature)官网抓取最新新闻文章的工具。


1. 功能概述

Nature_News_Fetcher_Tool 是一个网页抓取工具,专门用于从 nature.com 的新闻板块获取最新的文章列表。它通过模拟浏览器请求、解析 HTML 页面来提取每篇文章的详细信息,包括标题、链接、描述、作者、发布日期和封面图片。

!!! note "礼貌抓取" 该工具在每次页面请求后会暂停1秒,以避免对《自然》官网服务器造成过大负担。


2. 参数详解

该工具通过 execute 方法接收参数来执行新闻抓取任务。

输入参数

参数名 (Parameter) 类型 (Type) 描述 默认值
num_articles int 希望获取的文章总数。 100
max_pages int 为了获取指定数量的文章,最多抓取的页面数。 5

输出格式

execute 方法返回一个 list,其中每个元素都是一个 dict,代表一篇文章。如果发生错误,则返回一个包含错误信息的列表。每个成功的文章字典包含以下键:

键 (Key) 类型 (Type) 描述
title str 文章的完整标题。
url str 指向该文章的完整 URL。
description str 文章的简短描述或摘要。
authors list[str] 作者姓名列表。
date str 文章的发布日期 (YYYY-MM-DD 格式)。
image_url str 文章关联的封面图片 URL。

3. 使用示例

以下是如何调用 Nature_News_Fetcher_Tool 的示例。

=== "基础用法" 抓取最新的 10 篇新闻文章,最多搜索 1 个页面。

```python title="基础用法示例"
from your_module import Nature_News_Fetcher_Tool # 请替换为实际的模块路径

# 1. 初始化工具
tool = Nature_News_Fetcher_Tool()

# 2. 执行抓取
articles = tool.execute(num_articles=10, max_pages=1)

# 3. 打印结果
if articles and "error" not in articles[0]:
    print(f"成功获取 {len(articles)} 篇文章。")
    for article in articles:
        print(f"- {article['title']}")
else:
    print(f"抓取失败: {articles}")
```

4. 内部实现逻辑

???+ info "执行流程详解 (点击展开)" Nature_News_Fetcher_Toolexecute 方法遵循以下步骤来完成任务:

1.  **初始化**:
    * 创建一个空列表 `all_articles` 用于存储所有抓取到的文章。
    * 设置起始页码 `page_number = 1`。

2.  **循环抓取**:
    * 进入一个 `while` 循环,条件是已抓取的文章数小于 `num_articles` 且当前页码不超过 `max_pages`。
    * **页面获取 (`fetch_page`)**:
        * 随机选择一个浏览器 `User-Agent` 来模拟真实用户。
        * 构造请求参数,包括排序方式 (`PubDate`) 和文章类型 (`news`)。
        * 使用 `requests` 库向 `https://www.nature.com/nature/articles` 发送 GET 请求。
    * **内容解析 (`parse_articles`)**:
        * 使用 `BeautifulSoup` 解析返回的 HTML 内容。
        * 定位到 ID 为 `new-article-list` 的 `<section>` 标签。
        * 遍历该区域内所有的 `<article>` 标签,并为每一篇文章提取标题、URL、描述、作者、日期和图片链接。
    * **结果处理**:
        * 如果当前页面没有抓取到任何文章,则认为已到达末页,中断循环。
        * 将当前页面抓取的文章列表 `page_articles` 添加到 `all_articles` 中。
        * 页码 `page_number` 加 1。
        * 调用 `time.sleep(1)` 等待 1 秒。

3.  **异常处理**:
    * 整个过程被包裹在 `try...except` 块中。
    * 如果发生 `requests.exceptions.RequestException` (如网络问题、DNS错误),则记录错误并返回包含网络错误信息的列表。
    * 如果发生任何其他未预料到的异常,则记录错误并返回包含通用错误信息的列表。

4.  **返回结果**:
    * 循环结束后,根据用户请求的 `num_articles` 对 `all_articles` 列表进行切片,确保返回的文章数量不超过要求。

5. 依赖项与要求

  • Python 库:
  • [x] requests: 用于发送 HTTP 请求。
  • [x] beautifulsoup4: 用于解析 HTML 内容。
  • [x] os: 用于文件路径操作(在 if __name__ == "__main__" 中使用)。
  • [x] time: 用于在请求之间实现延迟。
  • [x] logging: 用于记录程序运行信息和错误。
  • [x] random: 用于随机选择 User-Agent。
  • 内部模块:
  • [x] sage.lib.tools.base.base_tool.BaseTool: 工具的基类。

6. 限制与注意事项

!!! danger "重要限制" 该工具的稳定运行依赖于《自然》官网的 HTML 结构。 * 网站结构变更: 如果 nature.com 的前端代码(如标签、类名、ID)发生变化,该工具的解析逻辑可能会失效,需要更新代码以适应新结构。 * 网络依赖: 工具的成功执行依赖于稳定的网络连接。 * 反爬虫策略: 尽管使用了随机 User-Agent,但如果目标网站部署了更复杂的反爬虫机制,抓取请求仍有可能被阻止。