如何从网络收集机器学习训练数据

模型是简单的部分。从开放网络中获取一个干净的、去重的、合法的、可刷新训练集才是项目真正停滞的地方。以下是从头到尾的收集流程。

训练模型通常是简单的部分。阻碍机器学习项目的步骤在上游:从开放网络中组装一个干净的、去重的、合法的、可刷新训练集。获取原始页面很便宜——爬虫可以做到——但将它们转化为可用的行才是真正的工作,这正是本指南所涵盖的:数据来源、清理为结构化文本、去重、采样、授权,以及保持模型不陈旧的刷新管道。

从信号开始,而不是从抓取器开始

在编写任何收集代码之前,明确模型需要学习什么以及哪些来源携带该信号。数据有三种形态,每种形态的收集成本不同:结构化(表格、产品提要——易于解析)、半结构化(JSON、CSV、XML端点——通常是网站暴露的最干净的东西)和非结构化(文章文本、评论、论坛帖子)。非结构化内容占所有数据的80-90%,据报道其中只有约0.5%被使用,这正是一个构建良好的网络数据集所能弥补的差距。在扩大规模之前,决定你需要哪种形态。

抓取到清理的文本,而不是原始HTML

将原始HTML输入训练管道意味着输入导航、广告、cookie横幅和脚本标签——这些噪音会降低数据集的质量。持久的做法是直接抓取到干净的、结构化的文本。一个返回markdown的Scraper API会为你去除样板代码,因此数千页的抓取结果是可读的内容,而不是标签混乱:

import requests

def fetch_clean(url):
    r = requests.get(
        "https://api.quantumproxies.io/scrape",
        params={"url": url, "format": "markdown"},
        headers={"Authorization": "Bearer YOUR_API_KEY"},
        timeout=60,
    )
    return r.json()["content"]  # boilerplate-stripped markdown

corpus = [fetch_clean(u) for u in seed_urls]

Markdown是一个很好的目标,因为它保留了结构(标题、列表、表格),同时去掉了展示层——这也是它成为RAG管道和LLM训练的首选输入的原因。通过旋转的住宅IP路由抓取,以免在大规模收集运行中途被整个任务阻止。

从开放网络到机器学习训练集的端到端管道:来源、抓取到markdown、去重和采样、授权和刷新
ML管道的收集部分:建模在此之后,完全依赖于正确的收集。

在污染模型之前去重

近似重复的文档是网络数据集的无声杀手——同一篇文章在十个网站上发布,样板页脚,转发的内容。在这些上训练会过度加权重复的内容。对每个文档的标准化内容进行哈希处理并删除碰撞;对于近似重复,shingle或MinHash方法可以捕捉到精确哈希遗漏的内容:

import hashlib

def content_hash(text):
    norm = " ".join(text.lower().split())  # normalise whitespace/case
    return hashlib.sha256(norm.encode()).hexdigest()

seen, unique = set(), []
for doc in corpus:
    h = content_hash(doc)
    if h not in seen:
        seen.add(h)
        unique.append(doc)
print(f"kept {len(unique)} of {len(corpus)} after dedup")

你在这里计算的内容哈希有双重作用——它也是你在下次抓取时检测变化的方式,所以要保留它。

有意识地采样,诚实地授权

更多的数据并不自动意味着更好的数据。一个具有代表性的样本胜过一个不平衡的堆——如果你的抓取90%来自一个网站或一种语言,模型就会学到这种偏差。跨你的来源和类别进行分层采样,以便数据集反映你实际想要建模的分布。关于授权:网络数据并不是自动可以用于训练的。根据来源条款进行过滤,在适用的地方遵守robots指令,并在每行旁边保留出处(来源URL和获取日期),以便你可以证明每个示例的来源。我们关于2026年抓取合法性的说明涵盖了个人数据和授权界限(信息性,不是法律建议)。

基本事实:网络不会给你的部分

对于监督学习,你需要标签,而开放网络很少会提供它们。有些数据集本身就带有标签(评论旁边的评分,句子中的下一个词),这就是为什么这些数据集可以大规模便宜地收集。其他所有的都需要一个基本事实步骤:由领域专家标注,或通过市场进行众包。如果你进行众包,通过植入已知答案的任务并拒绝未通过的工人来保证质量——这是一个研究得很透彻的失败模式。在可能的情况下,优先选择自然标注的网络数据;这就是一个数据集你可以在一周内构建完成与需要标注预算的区别。

刷新,因为数据会变陈旧

收集从来不是一次性的。价格会变化,页面会被重写,新内容会出现——一个在冻结快照上训练的模型会偏离它所要预测的世界。从第一天起就构建刷新:按计划重新抓取,将每页的内容哈希与上次运行进行比较,并且只重新处理实际变化的内容。这样可以使刷新成本与实际变化成比例,而不是每次都重新下载所有内容:

def refresh(url, last_hash):
    text = fetch_clean(url)
    h = content_hash(text)
    if h == last_hash:
        return None          # unchanged, skip re-processing
    return {"url": url, "text": text, "hash": h, "fetched": now()}

对于快速变化的领域,或者当你宁愿消费托管的提要而不是自己运行抓取时,为LLMs构建的网络数据为你提供干净、更新的内容,而无需维护管道。

数据收集的统计:80-90%的数据是非结构化的,只有0.5%被使用,以及70/30的训练-测试拆分
语料库几乎是无限的;一个好的管道增加的价值在于清理、去重和刷新它。

大规模抓取网络以清理markdown

常见问题解答

你从哪里获取机器学习的训练数据?

三个主要来源:现有的公共数据集(Kaggle、Google Dataset Search、学术语料库)、内部第一方数据,以及通过抓取的开放网络。网络是最大和最新鲜的来源,但需要最多的工作——清理、去重、采样和授权。对于许多现代模型,抓取相关网站以清理markdown是获得一个不存在的领域特定数据集的最快方式。

我需要多少训练数据?

这取决于任务和模型,诚实的答案是:从小规模开始,直到性能达到平台期。训练一个具有代表性的样本,在保留的测试集上测量准确性(70/30拆分是一个常见的起点),然后添加更多数据,观察指标是否继续改善。质量和代表性通常比原始体量更重要。

抓取网络数据用于ML训练合法吗?

收集公共数据在大范围内是可辩护的,但训练用途引发了授权问题,以及涉及个人数据时的隐私问题。根据来源条款进行过滤,避免不需要的个人数据,为每个示例保留出处,并在适用的地方尊重robots指令。这是一般信息,不是法律建议——对于大规模的商业数据集,请咨询法律顾问。

如何保持训练数据集的新鲜?

安排重新抓取并使用内容哈希检测变化,只重新处理实际移动的页面。对数据集进行版本控制,以便你可以重现哪个快照训练了哪个模型,并在每行上保留获取日期。增量的、基于变化检测的刷新使成本与实际变化成比例,而不是每个周期都重新下载整个语料库。

模型获得了头条,但数据集决定了结果。获取正确的信号,抓取到清理的markdown,严格去重,诚实采样,保留出处,并从一开始就构建刷新。做好收集管道,后续的一切都会变得更容易。如果你特别想要进行微调,我们关于从网络构建微调数据集的指南在这里接着讲。

为你的模型获取更新的网络数据