每一个人工智能和机器学习系统,归根结底都是对数据的推断。模型不从第一性原理出发进行推理,而是从它已经见过的样本中归纳规律。改变样本,就改变了行为。这正是为什么在任何 AI 项目中,最关键的决定很少是架构或优化器,而是训练集里放了什么,以及这些数据从哪里来。

很长一段时间内,答案是"几个干净的学术数据集"。那个时代已经过去。如今人们每天使用的大型语言模型和现代 ML 系统,是在从开放网络汇集而来的海量语料上训练的:文章、产品目录、论坛、文档、评论、代码。如果你想构建有竞争力的产品,最终不得不自己大规模采集网络数据,并将其转化为训练样本。本文解释 AI 和 ML 数据的真实来源,为什么网络是主导性的数据源,以及如何通过 Crawling APISmart AI Proxy 可靠地采集数据,而不是手动应对各种封锁。

AI、ML 与它们共同的依赖

对这两个术语保持精确是有帮助的,因为它们经常被混用,但并非同一回事。人工智能是宏观目标:构建能执行我们认为属于人类智能的任务的系统,从回答问题到驾驶汽车。机器学习是实现这一目标的主流方法。它不是为每种情况手工编写规则,而是给算法提供大量样本,让它学习将输入映射到输出的规律。

机器学习根据样本的标注方式进行细分。监督学习在已标注的样本对(一封邮件和"垃圾邮件"标签,一个产品页面和它的类别)上训练,学习对新输入重现这些标签。无监督学习没有标签,而是自行寻找结构,对相似项进行聚类或将数据压缩成有用的表示。当今 AI 热潮背后的大型语言模型主要依赖自监督的变体:模型通过预测原始文本中被遮蔽或下一个词元来学习,这意味着文本本身提供了训练信号,而你需要大量文本。

唯一的常量

无论监督、无监督还是自监督,每种方法都有同样的依赖:一个大规模、有代表性、与时俱进的数据集。算法基本上是一个固定的配方,数据是决定结果是精准还是无用的变量,这正是"从哪里获取数据"成为大多数 AI 和 ML 工作背后真正工程问题的原因。

为什么模型的成败取决于数据

很容易将模型视为聪明的部分,而将数据视为配管工作。实际上,比例恰好相反。数据集的三个属性几乎决定了下游的一切。

规模。 现代模型有数百万到数十亿个参数,每个参数都是一个需要证据来正确设置的自由度。数据太少,模型就会记忆样本而非归纳规律,这种失败模式称为过拟合。网络规模语料之所以重要,仅仅是因为网络是少数几个能找到足够多样化文本和结构化记录来满足这种需求的地方之一。

新鲜度。 在三年前的快照上训练的模型,认为世界仍是三年前的样子。价格、产品线、俚语、新闻和代码惯例都在不断变化。如果你的应用需要推断当前世界,你的训练和评估数据就必须从当前网络中采集,而不是从陈旧的存档中提取。

代表性。 模型只学习它所见到的分布。只抓取一家零售商,你的价格模型就只了解那家零售商;抓取二十家,它才能学到市场规律。输入有偏差,输出就有偏差,因此你采集的广度直接决定了模型超越你碰巧收集到的那个切片的泛化能力。

注意,这三个属性都是采集问题,而不是建模问题。你无法通过优化来弥补一个规模太小、过于陈旧或范围太窄的数据集。这正是为什么构建严肃 AI 和 ML 系统的团队会在数据获取上花费大量时间,也是为什么底层的网络爬取层值得认真对待。

AI 和 ML 数据从哪里来

机器学习的训练数据通过几个渠道到来,大多数真实项目会混合使用其中几种。

精心整理的公共数据集(ImageNet、Common Crawl、开放政府数据)是很好的起点且零成本,但其他所有人也在用,因此它们很少能给你带来竞争优势,而且往往已经过时。人工标注和内部采集能产生高质量、针对任务的数据,但速度慢、成本高,无法扩展到网络规模的语料。在预算允许的情况下,从供应商购买授权数据可以填补特定空白。

对大多数团队来说,决定性的数据来源是开放网络本身,通过网络爬取获取。网络是现存最大、最新鲜、最多样化的文本和结构化记录集合,它几乎覆盖了你可能想要建模的每个领域:电商商品详情用于价格智能,评论用于情感分析,招聘信息用于劳动力市场模型,文档和论坛帖子用于代码和问答系统。难点在于可靠地大规模采集比看起来要难,这正是下一节要解决的问题所在。

难点:大规模采集网络数据

编写一个获取单个页面的脚本很简单。编写一个能跨数十个站点、周复一周地获取数百万个页面且不陷入停滞的脚本,是另一个完全不同的问题。三个障碍几乎立刻出现。

首先是反爬虫防御。 商业网站会监控自动化流量,并以 CAPTCHA、速率限制和 IP 封锁来回应。来自单一数据中心 IP 的简单爬虫在几分钟内就会被标记,而一个中途停止填充的数据集根本不是数据集。

其次是客户端渲染。 现代网络有相当大比例的页面使用 JavaScript 在浏览器中构建内容。简单的 requests.get 返回的是 HTML 外壳,而非你需要的数据,因此你需要能在读取页面之前真正运行它的工具,就像真实浏览器那样。

第三是规模与可靠性。 代理需要轮换,失败需要重试,整个流水线需要无人值守地持续运行。构建和维护这套基础设施是大部分的工作,而它与你真正想要训练的模型毫无关系。

这正是 Crawlbase 的用武之地。Crawling API 接受一个 URL,通过轮换住宅 IP 获取它,在真实浏览器中渲染 JavaScript,并在一次调用中返回完整的 HTML 或适合 LLM 使用的 Markdown。Smart AI Proxy(也称 AI Proxy)以直接代理端点的形式提供相同的住宅 IP 轮换,供你选择路由自己客户端的流量。无论哪种方式,封锁、渲染和 IP 管理都不再是你的问题,你可以将精力集中在数据集本身上。

Crawlbase Crawling API

训练数据只有在你能实际采集到的情况下才有用。Crawling API 通过轮换住宅 IP 获取页面,在真实浏览器中渲染 JavaScript,从一次调用返回干净的 HTML 或 Markdown,使百万页面的采集任务能持续填充而不因 CAPTCHA 而停滞。在免费套餐上将它指向一个公开页面,看一条记录落入你的数据集。

构建训练数据集:一个可运行的示例

概念在可以运行的时候更容易信任。下面的脚本从一个公开的书店测试网站采集一个小型结构化数据集,这类目录数据正是你可能用来训练价格或类别模型的原材料。它通过 Crawling API 获取每个页面,提取几个字段,并将每条记录写入 CSV 和 JSON,使结果可以直接输入训练流水线。

你需要 Python 3.8 或更高版本以及官方 Crawlbase 客户端。安装它,并在注册后从你的 Crawlbase 控制台获取 token。

bash
python -m venv ml_data_env
source ml_data_env/bin/activate

pip install crawlbase beautifulsoup4

在 Windows 上,请使用 ml_data_env\Scripts\activate 代替 source 命令来激活环境。下面是采集器,它抓取几个目录页面,用 BeautifulSoup 提取字段,并保存干净的记录。

python
import csv
import json
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_TOKEN"})

pages = [
    "https://books.toscrape.com/catalogue/page-1.html",
    "https://books.toscrape.com/catalogue/page-2.html",
    "https://books.toscrape.com/catalogue/page-3.html",
]

def fetch_html(url):
    options = {"ajax_wait": "true", "page_wait": 2000}
    response = api.get(url, options)
    if response["status_code"] != 200:
        raise RuntimeError(f"Fetch failed for {url}: {response['status_code']}")
    return response["body"].decode("utf-8")

def parse_rows(html):
    soup = BeautifulSoup(html, "html.parser")
    rows = []
    for card in soup.select("article.product_pod"):
        title = card.select_one("h3 a")["title"].strip()
        price = card.select_one(".price_color").text.strip()
        rating = card.select_one(".star-rating")["class"][1]
        in_stock = "In stock" in card.select_one(".availability").text
        rows.append({
            "title": title,
            "price": price,
            "rating": rating,
            "in_stock": in_stock,
        })
    return rows

def build_dataset():
    dataset = []
    for url in pages:
        try:
            dataset.extend(parse_rows(fetch_html(url)))
        except RuntimeError as err:
            print(f"Skipping page: {err}")
    return dataset

data = build_dataset()
print(f"Collected {len(data)} rows")

两个等待选项在你将代码指向客户端渲染目标时仍然有效:ajax_wait 等待异步内容,page_wait 暂停固定毫秒数使延迟出现的元素能在捕获前显示出来。状态码检查将失败的获取转变为明确的错误,而不是悄无声息的空记录,这在一次运行跨越数千个页面且你需要信任数据集内容时至关重要。

保存训练用的记录

数据集只有在你的训练代码能读取的格式下才有用。CSV 适合表格模型和在电子表格中快速检查;JSON 适合嵌套记录和大多数 Python 流水线。两种格式都写出来,这样同一份采集结果可以喂给任一路径。

python
def save_csv(rows, path="training_data.csv"):
    if not rows:
        return
    with open(path, "w", newline="") as f:
        writer = csv.DictWriter(f, fieldnames=rows[0].keys())
        writer.writeheader()
        writer.writerows(rows)

def save_json(rows, path="training_data.json"):
    with open(path, "w") as f:
        json.dump(rows, f, indent=2)

save_csv(data)
save_json(data)
print("Saved training_data.csv and training_data.json")

将两段代码放在一起运行,你将得到干净的已标注记录,随时可以输入模型。这个结构是刻意保持简单的:每条记录一个条目,键名一致,没有意外。这正是训练代码所需要的。

json
[
  {
    "title": "A Light in the Attic",
    "price": "£51.77",
    "rating": "Three",
    "in_stock": true
  }
]
先采集,再清洗

原始抓取的记录本身并不能直接用于训练。在模型接触它们之前,你需要对类型进行规范化(将价格字符串转为数字)、去除重复项、处理缺失字段,并对类别进行平衡以确保数据集具有代表性。这里的采集步骤为你提供可靠的原始数据;下一步是整形,我们在 为 AI 和 ML 整理和清洗网络爬取数据 中有详细介绍。

从一个脚本到真正的流水线

上面的示例是一个演示。用于人工智能和机器学习的生产数据集需要运行数千或数百万个 URL,按计划刷新,并且不能停滞。三个步骤可以帮你实现这一目标。

大规模异步处理。 逐一获取页面会将吞吐量限制在单次往返的速度。对于大型任务,将 URL 推送到 异步 Crawler,它会将工作排入队列,并在完成后通过 webhook 推送完整页面,让你无需自己管理获取循环即可大规模采集。

在有预解析输出的地方使用它。 当你反复从知名站点采集(一家主要零售商、一个招聘平台)时,Crawling API 可以直接为支持的目标返回结构化 JSON,让你跳过编写和维护选择器。对于特殊或一次性的页面布局,上面的 BeautifulSoup 方式仍然是灵活的备选方案。参阅 用于机器学习的网络爬取 了解更多关于如何将采集方法与模型相匹配的内容。

将新鲜度视为一项持续工作,而非一次性任务。 由于模型会随着世界的变化而漂移,需要安排定期爬取并追加新记录,而不是只抓取一次就遗忘。每周更新的数据集可以让你的模型与当前价格、当前语言和当前行为保持同步。

如果你要将 AI 代理接入实时网络上下文(用于推理时而非仅训练时),Web MCP 通过 Model Context Protocol 暴露相同的获取和解析能力,使模型可以直接请求页面。对于非常高的并发量或自定义路由和 SLA 要求,企业套餐提供专用吞吐量。

回顾

核心要点

  • 数据才是产品。 在人工智能和机器学习中,算法基本上是固定的;数据集是决定模型是精准还是无用的变量。
  • 规模、新鲜度和广度都是采集问题。 你无法通过优化来弥补规模太小、过于陈旧或范围太窄的数据集,因此爬取层值得认真对待。
  • 网络是主导性的数据来源。 精心整理的数据集和人工标注各有其位置,但开放网络是最大、最新鲜、最多样化的训练数据来源,通过网络爬取获取。
  • 可靠的采集是难点所在。 反爬虫防御、客户端渲染和规模问题会让简单的爬虫失败;Crawling API 和 Smart AI Proxy 为你处理封锁、渲染和 IP 轮换。
  • 先采集,再整形。 将干净的记录保存为 CSV 或 JSON,然后在训练前规范化类型、去除重复项并平衡类别。
  • 用异步和定时任务实现规模扩展。 将大型任务迁移到异步 Crawler,在有预解析输出时复用它,并按计划重新爬取以保持数据集的时效性。

常见问题

人工智能和机器学习有什么区别?

人工智能是构建能执行我们认为属于人类智能的任务的系统这一宏观目标。机器学习是实现这一目标的主流方法:你不是手工编写规则,而是在大量样本上训练算法,让它学习规律。因此,机器学习是人工智能的一个子集,而当今几乎所有值得关注的 AI 系统都是用它构建的。

网络爬取对 AI 和 ML 为什么重要?

模型从样本中学习,它们需要大量、新鲜且具有代表性的样本。开放网络是这类数据最大、最新的来源,几乎覆盖了你可能想建模的每个领域。网络爬取是将这些页面转化为训练记录的方式,这正是为什么数据采集是任何严肃 AI 或 ML 项目中最重要的步骤之一。

训练一个模型需要多少数据?

这取决于模型和任务:简单的分类器可能从数千条记录中学习,而大型语言模型则在数十亿个词元上训练。一般规则是参数越多,需要越多样本以避免过拟合,更广泛的覆盖范围能产生更好的泛化效果。这种需求正是团队转向网络规模采集而非小型精心整理数据集的原因。

我可以只使用公共数据集而不进行爬取吗?

公共数据集是很好的免费起点,但它们有两个局限:其他所有人也在用,因此它们很少能给你带来竞争优势;而且它们通常已经过时。如果你的应用需要推断当前世界或特定细分领域,你需要自己从网络上采集当前的、针对任务的数据,通常需要与公共数据集配合使用。

如何在不被封锁的情况下采集网络数据?

来自单一数据中心 IP 的简单爬虫很快会被反爬虫防御标记。Crawling API 通过轮换住宅 IP 获取页面,在真实浏览器中渲染 JavaScript,因此采集任务不会因触发 CAPTCHA 和速率限制而停滞。如果你希望路由自己客户端的流量,Smart AI Proxy 以直接代理端点的形式提供相同的轮换能力。完整的方案请参阅 如何在不被封锁的情况下抓取网站

抓取数据后我该怎么做?

原始抓取的记录还不能直接用于训练。你需要规范化数据类型、去除重复项、处理缺失字段,并对类别进行平衡以确保数据集具有代表性,然后将其划分为训练集和评估集。像上面的示例那样先将干净的记录保存为 CSV 或 JSON,能给你一个稳定的基础,再对其进行清洗和整形以适应模型。

开始构建

大规模爬取任何站点,无需与基础设施对抗。

Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。

自助开通 · 无需销售通话 · 提供企业级爬取量