Trafilatura 网络爬虫:为 LLM 提取干净文本
Web Data Collection Specialist
TL;DR:
- Trafilatura将一个原始HTML页面转化为干净的主内容文本,去除导航、侧边栏和页脚,让语言模型看到内容而不是界面。
- 在示例页面中,9,275个字符的HTML变成了1,324个字符的干净文本,减少了86%,直接进入LLM的上下文窗口。
- Trafilatura没有清除阻止的抓取层,所以本指南将Scrapeless与Trafilatura配对,以进行检索和提取。
trafilatura.extract生成纯文本,而使用output_format="markdown"或"json"的相同调用则生成Markdown或包含标题、作者和日期的元数据记录。- 分割是干净的:Scrapeless获取页面,Trafilatura提取文章内容。
- 从 Scrapeless免费计划 开始,并将提取器指向您的页面。
被抓取的HTML页面通常不是您想要的东西。导航、cookie横幅、相关文章轨道和页脚可能占据大部分字节,给语言模型提供所有这些内容会浪费令牌并削弱信号。Trafilatura解决了该问题的后半部分:给定HTML,它找到主要内容并将其作为干净文本返回。它并不解决前半部分,因为它无法抓取反抗的页面。
本指南将这两个部分配对。 Scrapeless通用抓取API检索页面,Trafilatura提取文章。以下每个数字都来自对公共页面的真实运行。
Trafilatura的作用
Trafilatura是一个主内容提取库:它读取HTML并返回文章文本而不带周围的样板。它遍历页面结构以区分内容和导航,其提取质量在引入它的同行评审论文中进行了基准测试。对于任何构建检索或LLM管道的人来说,这是从“我有HTML”到“我有值得嵌入的文本”的步骤。
Trafilatura并不是一个抓取工具。它没有浏览器,没有代理,也没有突破访问挑战的方法。其内置的fetch_url是一个普通的HTTP客户端,所以在受保护的页面上,它得到一个阻止页面并忠实地提取内容。这就是为什么检索属于为此构建的工具。
安装
Trafilatura只需一个pip安装。
bash
pip install trafilatura
在shell中设置您的Scrapeless密钥。在运行时使用真实密钥,并将占位符保持在源代码之外。
bash
export SCRAPELESS_API_KEY="sk_your_key_here"
基本提取
使用Scrapeless获取页面,然后将HTML传递给trafilatura.extract。它将主内容作为干净文本返回。
python
import json
import os
import urllib.request
import trafilatura
API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
def fetch_html(url: str) -> str:
payload = json.dumps(
{"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
).encode()
request = urllib.request.Request(
API_URL,
data=payload,
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=90) as response:
return json.loads(response.read())["data"]
html = fetch_html(TARGET)
text = trafilatura.extract(html)
print(f"原始html字符数: {len(html)}")
print(f"干净文本字符数: {len(text)}")
print(f"去除样板: {100 * (1 - len(text) / len(html)):.0f}%")
输出显示一旦去掉界面,页面缩小了多少。
text
原始html字符数: 9275
干净文本字符数: 1324
去除样板: 86%
剩下的1,324个字符是标题、价格、可用性和产品描述;导航、面包屑和页脚已被去除。这个86%的减少是您不再支付模型读取的令牌。
Markdown和元数据
纯文本是默认格式,但检索管道通常需要结构。同样的extract调用接受一个output_format,因此Markdown保留模型容易读取的标题和列表。
python
markdown = trafilatura.extract(html, output_format="markdown")
print(f"markdown字符数: {len(markdown)}")
为了追溯来源,要求以JSON格式获取元数据。记录携带标题、作者、主机名、日期和语言,以及文本,这是您在嵌入旁边存储的内容,以便检索的块可以引用其来源。
python
record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"标题: {record['title']}")
完整提取器
将提取、文本、Markdown和元数据结合在一起,一个脚本接收一个URL,满足下游管道所需的所有内容。
python
import json
import os
import urllib.request
import trafilatura
API_URL = "https://api.scrapeless.com/api/v2/unlocker/request"
TARGET = "https://books.toscrape.com/catalogue/a-light-in-the-attic_1000/index.html"
def fetch_html(url: str) -> str:
payload = json.dumps(
{"actor": "unlocker.webunlocker", "input": {"url": url, "js_render": False, "headless": False}}
).encode()
request = urllib.request.Request(
API_URL,
data=payload,
headers={"x-api-token": os.environ["SCRAPELESS_API_KEY"], "Content-Type": "application/json"},
method="POST",
)
with urllib.request.urlopen(request, timeout=90) as response:
return json.loads(response.read())["data"]
html = fetch_html(TARGET)
print(f"原始HTML字符数: {len(html)}")
text = trafilatura.extract(html)
print(f"干净文本字符数: {len(text)}")
print(f"已移除模板: {100 * (1 - len(text) / len(html)):.0f}%")
markdown = trafilatura.extract(html, output_format="markdown")
print(f"Markdown字符数: {len(markdown)}")
record = json.loads(trafilatura.extract(html, output_format="json", with_metadata=True))
print(f"标题: {record['title']}")
运行结果报告了管道消耗的每个输出。
text
原始HTML字符数: 9275
干净文本字符数: 1324
已移除模板: 86%
Markdown字符数: 1474
标题: A Light in the Attic
Trafilatura的局限
Trafilatura进行提取;它不会在一个块之外进行检索,这个边界就是本指南使用两个工具的原因。指向受保护页面的traifilatura自己的提取会收到一个挑战或者一个空壳,然后什么有用的内容也提取不到。Scrapeless处理检索,返回渲染后的HTML,而traifilatura则从这里接手。当目标使用JavaScript渲染其文章时,在请求中将js_render设置为True,这样traifilatura收到的HTML已经包含内容;当标记是服务器渲染时,就像这里一样,保持为False。
在您在某个网站上运行此内容之前,请阅读其robots.txt和条款。机器人排除协议规定了网站要求自动客户端避免的路径,遵守它可以确保提取管道的可持续性。关于更广泛的摄取画面,关于构建用於RAG的干净网络文本管线的指南展示了此提取步骤的位置。
准备在自己的页面上尝试吗?创建一个免费Scrapeless账户并更改目标URL。
结论
干净的文本正是语言模型真正需要的,达到这一点有两个步骤:检索,然后提取。Scrapeless返回页面,traifilatura将9,275个字符的HTML转化为1,324个字符的内容,可以是文本、Markdown或元数据记录。traifilatura文档全面介绍了输出格式和调优选项。从完整的脚本开始,替换成您自己的URL,并将结果传递给您的嵌入或LLM步骤。
从Scrapeless的免费计划开始,以检索自己的页面,并在您安排定期任务时检查Scrapeless定价。
常见问题
问:traifilatura自己抓取网页吗?
它有一个内置的fetch_url,但那是一个普通的HTTP客户端,没有解锁,无法在访问挑战后抓取页面。将它与一个返回渲染HTML的检索工具,如Scrapeless配对,让traifilatura做它擅长的事情,即从该HTML中提取主要内容。
问:traifilatura与BeautifulSoup有何不同?
BeautifulSoup是一个解析器:您告诉它选择哪些元素。Trafilatura是一个提取器:它决定页面的哪个部分是主要内容并返回,不需要编写选择器。当您需要特定字段时使用BeautifulSoup,当您想要干净的文本作为文章来源时使用traifilatura。
问:traifilatura支持哪些输出格式?
extract函数接受output_format参数,格式可以为txt(默认)、markdown、json或xml。Markdown为LLM输入保留标题和列表,而带有with_metadata=True的JSON则在文本旁添加标题、作者、日期和语言。
问:traifilatura可以保留标题和作者吗?
是的。调用 extract,设置 output_format="json" 和 with_metadata=True,返回的记录将包括 title、author、hostname、date 和 language。将这些元数据与嵌入一起存储可以帮助检索到的片段报告其来源。
问:为什么要提取主要内容,而不是将整个页面发送给 LLM?
页面大部分都是导航、广告和页脚,示例页面中这些内容占字符的 86%。发送所有内容会消耗代币并埋没有用的信息,因此首先提取主要内容可以降低成本,提高模型对重要文本的关注。
在Scrapeless,我们仅访问公开可用的数据,并严格遵循适用的法律、法规和网站隐私政策。本博客中的内容仅供演示之用,不涉及任何非法或侵权活动。我们对使用本博客或第三方链接中的信息不做任何保证,并免除所有责任。在进行任何抓取活动之前,请咨询您的法律顾问,并审查目标网站的服务条款或获取必要的许可。



