返回博客

用于AI训练的代理:如何在不被封锁的情况下收集数百万数据用于模型

我们讨论如何通过代理正确组织数据收集,以训练AI模型:从选择IP类型到设置轮换和绕过反机器人系统。

📅2026年3月5日
```html

AI模型的训练需要大量的数据——文本、图像、视频以及来自网站的结构化信息。问题在于,在进行大规模抓取时,网站会迅速封锁IP地址,认为这种活动是机器人行为。本文将讨论如何通过代理正确组织数据收集,选择不同任务所需的IP类型,以及如何设置基础设施以确保稳定运行。

为什么AI培训需要代理

现代语言模型如GPT、LLaMA或Claude是在数十亿个文本标记上进行训练的。计算机视觉模型需要数千万张图像。推荐系统分析用户在数千个网站上的行为。所有这些数据都需要从某个地方获取。

主要问题是,网站积极防范大规模抓取。如果您从一个IP每分钟发送超过100个请求,您将在5-10分钟内被封锁。封锁的原因包括:

  • 速率限制:限制来自一个IP的请求数量(通常为每分钟10-60个请求)
  • 反机器人系统:Cloudflare、Akamai、PerimeterX分析行为并阻止可疑活动
  • 地理限制:某些内容仅在特定国家可用
  • 竞争对手保护:市场和聚合器阻止大规模收集价格和商品

代理解决了这个问题,通过数千个不同的IP地址分散请求。您可以从500-1000个不同地址中每个发送1-2个请求,而不是从一个IP发送1000个请求——这看起来就像普通用户的活动。

选择哪种类型的代理进行数据收集

AI培训使用三种类型的代理,每种都有其优缺点。选择取决于数据源、数据量和项目预算。

代理类型 速度 网站信任度 成本 何时使用
数据中心 100-1000 Mbps $0.5-2/IP 开放API,简单的网站没有保护
住宅代理 10-50 Mbps $5-15/GB 社交媒体,使用Cloudflare的网站,电子商务
移动代理 5-30 Mbps 非常高 $10-30/GB 移动应用程序,严格的保护

数据中心代理:适合大规模使用的速度

数据中心代理是云服务提供商(如AWS、Google Cloud、Hetzner)服务器的IP地址。主要优点是速度快且成本低。一个数据中心IP可以处理每秒数百个请求。

适合从不使用激进保护的来源收集数据:开放API(如GitHub、Wikipedia、Stack Overflow)、政府数据库、没有Cloudflare的新闻网站、科学出版物。如果网站在没有JavaScript渲染的情况下提供数据,并且不检查浏览器指纹——数据中心代理可以胜任。

缺点是许多网站会将数据中心IP列入黑名单。Instagram、Facebook、Google搜索、大型市场几乎会立即封锁数据中心IP。对于这些来源,需要使用住宅代理。

住宅代理:绕过任何保护

住宅代理使用真实家庭用户的IP地址。对于网站来说,这样的请求看起来就像是来自家里的普通访客。这使得绕过Cloudflare、Akamai,收集社交媒体和受保护平台的数据成为可能。

住宅代理对于以下情况是必需的:Instagram、Facebook、Twitter/X(收集帖子、评论、个人资料)、Google搜索(为NLP模型抓取搜索结果)、市场(Amazon、eBay、Wildberries——商品、评论、价格)、具有地理限制的网站(内容仅在特定国家可用)。

成本较高——按流量计费($5-15每GB)。为了节省开支,建议仅在关键来源使用住宅代理,而简单的网站则通过数据中心代理抓取。

移动代理:适用于移动应用程序

移动代理使用移动运营商的IP(4G/5G)。使用频率较低——主要用于从移动应用程序(如TikTok、Instagram应用、移动游戏)收集数据,或者当网站区分移动和桌面流量时。

移动IP的优点是运营商使用CGNAT(一个IP共享给数百个用户),因此封锁这些地址并不划算。但对于大多数AI培训任务,住宅代理已经足够。

数据源类型及对代理的要求

不同类型的数据需要不同的代理处理方式。我们来看看用于训练AI模型的流行数据源。

NLP模型的文本数据

为了训练语言模型,需要从新闻网站、论坛、博客、社交媒体、Wikipedia和专业资源收集文本。数据量达到数十TB的文本。

代理建议:新闻网站和博客——使用数据中心代理(速度更重要)。像Reddit、Quora这样的论坛——使用住宅代理(有速率限制)。Twitter、Facebook、Instagram——仅使用每5-10分钟轮换的住宅代理。

文本抓取的特点是需要保持结构(标题、段落、元数据)。对于JavaScript网站,使用无头浏览器(Puppeteer、Playwright),对于静态页面,使用简单的HTTP客户端(requests、axios)。

计算机视觉的图像数据

训练识别模型需要数百万张带标注的图像。数据来源包括:Google Images、Pinterest、Instagram、专业摄影库、电子商务网站(商品照片)。

问题在于,图像文件较大(平均大小为200-500KB),因此流量消耗迅速。使用住宅代理时(按GB计费),这变得至关重要。优化策略:首先通过住宅代理收集图像的URL,然后通过数据中心或直接下载文件(如果CDN不检查引用)。

来自电子商务的结构化数据

有关商品、价格、评论的数据用于训练推荐系统和定价模型。数据来源包括:Amazon、eBay、Wildberries、Ozon、AliExpress。

所有大型市场都使用Cloudflare或自己的反机器人系统。必须使用带轮换的住宅代理。此外,正确的浏览器指纹也很重要——使用像puppeteer-extra-plugin-stealth这样的工具来掩盖自动化。

视频和音频数据

YouTube、TikTok、播客平台——用于训练语音和视频识别模型的来源。问题是流量巨大(一个视频=数百MB)。对于这些任务,住宅代理在经济上并不划算。

解决方案:仅使用住宅代理获取元数据和视频链接,而下载则通过数据中心或使用专门工具如yt-dlp(它们能够在不使用代理的情况下绕过YouTube的限制)。

不同规模的IP轮换策略

IP轮换是稳定抓取的关键。错误的设置将导致封锁或流量费用过高。

按请求轮换(旋转代理)

每个请求都通过新的IP进行。适合于大规模抓取不同网站时,不需要保持会话。例如,从10000个不同的新闻网站收集文本——每个网站仅看到1-2个来自同一IP的请求。

import requests

# 旋转代理 - 每个请求使用新的IP
proxies = {
    'http': 'http://username:password@rotating.proxycove.com:12345',
    'https': 'http://username:password@rotating.proxycove.com:12345'
}

urls = ['https://site1.com', 'https://site2.com', ...]
for url in urls:
    response = requests.get(url, proxies=proxies)
    # 每个请求都使用新的IP
    parse_data(response.text)

优点是最大限度地保护免受封锁。缺点是无法与需要身份验证或保存cookies的网站进行交互。

按时间轮换(粘性会话)

IP保持5-30分钟,然后更换。适合抓取一个具有分页的网站时,需要在1、2、3...页面之间保持会话。

import requests
import time

# 粘性会话 - IP保持10分钟
session_id = generate_random_string()  # 唯一的会话ID
proxies = {
    'http': f'http://username-session-{session_id}:password@sticky.proxycove.com:12345'
}

# 所有请求在10分钟内都来自同一IP
for page in range(1, 100):
    url = f'https://site.com/catalog?page={page}'
    response = requests.get(url, proxies=proxies)
    parse_page(response.text)
    time.sleep(2)  # 请求之间的延迟

根据网站的速率限制调整会话时间。如果限制为每分钟60个请求,则将会话设置为1-2分钟,并确保不超过50个请求。

静态IP池

您将获得100-1000个IP的列表,并自行管理请求的分配。适合于复杂场景,需要完全控制:并行抓取网站的不同部分、负载均衡、自定义轮换逻辑。

import requests
from itertools import cycle

# 500个静态IP的池
ip_pool = [
    'http://user:pass@ip1.proxycove.com:12345',
    'http://user:pass@ip2.proxycove.com:12345',
    # ... 500个地址
]

proxy_cycle = cycle(ip_pool)

for url in urls:
    proxy = next(proxy_cycle)  # 从池中获取下一个IP
    response = requests.get(url, proxies={'http': proxy, 'https': proxy})
    parse_data(response.text)

这种方法提供了最大的灵活性,但需要更多代码来处理错误(如果IP被封锁,需要将其从池中排除)。

抓取时绕过反机器人系统

代理解决了IP封锁的问题,但现代网站分析数十个参数来识别机器人。即使使用住宅IP,如果浏览器指纹显示自动化,您也可能会被封锁。

反机器人系统检查的内容

  • User-Agent:必须与真实浏览器(Chrome、Firefox)相符,不得包含“headless”或“bot”等字眼
  • Headers:头部集合必须是浏览器的典型集合(Accept、Accept-Language、Accept-Encoding、Referer)
  • TLS指纹:SSL连接的参数在浏览器和脚本之间有所不同
  • JavaScript指纹:WebGL、Canvas、AudioContext、字体、插件、屏幕分辨率
  • 行为:鼠标移动、滚动速度、点击(对于使用JavaScript渲染的网站)

掩盖自动化的工具

为了绕过高级保护,使用带有掩盖插件的无头浏览器:

// Puppeteer与stealth插件
const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch({
    headless: true,
    args: [
        '--proxy-server=http://username:password@residential.proxycove.com:12345',
        '--disable-blink-features=AutomationControlled'
    ]
});

const page = await browser.newPage();
// 设置真实的视口
await page.setViewport({ width: 1920, height: 1080 });

// 添加随机延迟
await page.goto('https://protected-site.com');
await page.waitForTimeout(2000 + Math.random() * 3000);

const data = await page.evaluate(() => {
    return document.querySelector('.data').innerText;
});

await browser.close();

对于Python,使用Playwright进行类似设置,或者使用undetected-chromedriver的Selenium——这是一个自动修补ChromeDriver以绕过检测的库。

绕过Cloudflare和其他WAF

Cloudflare使用JavaScript挑战来检查浏览器。简单的HTTP客户端(requests、axios)无法通过。解决方案包括:

  • 无头浏览器:Puppeteer/Playwright与stealth插件可以通过大多数挑战
  • 现成解决方案:像cloudscraper(Python)或puppeteer-extra-plugin-recaptcha这样的库
  • 绕过服务:专门的API(FlareSolverr、Anti-Captcha)为您解决挑战

重要提示:即使有正确的指纹,也要在请求之间进行暂停。以完美的浏览器指纹每秒发送100个请求仍然看起来可疑。最佳速度是每个IP每分钟10-30个请求。

数据收集的基础设施架构

在工业规模上收集AI培训数据需要精心设计的架构。单个服务器上的简单脚本无法处理TB级的数据抓取。

数据收集系统的组件

1. 任务队列(Task Queue)

存储待抓取的URL列表。使用Redis、RabbitMQ或AWS SQS。允许在工作者之间分配任务并重新提交失败的任务。

2. 工作者(Workers)

从队列中获取任务并执行抓取的进程。并行启动10-100个工作者在不同的服务器上。每个工作者使用自己的代理或代理池。

3. 数据存储(Storage)

存放收集到的数据。对于文本——使用S3/MinIO(对象存储)。对于结构化数据——使用PostgreSQL或MongoDB。对于大规模数据——使用数据湖(AWS S3 + Athena,Google Cloud Storage)。

4. 监控(Monitoring)

监测抓取速度、错误百分比、流量消耗。使用Grafana + Prometheus或现成解决方案如Datadog。为关键指标设置警报(错误百分比 >10%,速度下降2倍)。

Python架构示例

# worker.py - 抓取进程
import redis
import requests
import json
from datetime import datetime

# 连接到Redis(任务队列)
queue = redis.Redis(host='redis-server', port=6379)
# 代理池
proxies_pool = load_proxies_from_config()

while True:
    # 从队列中获取任务
    task = queue.blpop('parsing_queue', timeout=5)
    if not task:
        continue
    
    url = task[1].decode('utf-8')
    proxy = get_next_proxy(proxies_pool)
    
    try:
        response = requests.get(
            url, 
            proxies={'http': proxy, 'https': proxy},
            timeout=30,
            headers={'User-Agent': get_random_user_agent()}
        )
        
        # 解析数据
        data = parse_html(response.text)
        
        # 保存到S3
        save_to_s3(data, f'data/{datetime.now().isoformat()}/{hash(url)}.json')
        
        # 记录成功
        log_success(url, proxy)
        
    except Exception as e:
        # 出现错误时将任务返回到队列
        queue.rpush('parsing_queue', url)
        log_error(url, proxy, str(e))
        mark_proxy_as_failed(proxy)

这样的架构允许水平扩展——只需添加新的工作者服务器。如果一个工作者崩溃,其他工作者仍然可以继续工作。

数据收集自动化工具

工业级抓取使用专门的框架,能够开箱即用地解决常见问题。

Scrapy——Python的框架

Scrapy是Python中最流行的网页抓取工具。开箱即用支持:并行抓取(同时数百个请求)、错误时自动重试、用于代理和User-Agent轮换的中间件、导出为JSON、CSV、XML、数据库。

# settings.py - Scrapy的代理设置
ROTATING_PROXY_LIST = [
    'http://user:pass@proxy1.proxycove.com:12345',
    'http://user:pass@proxy2.proxycove.com:12345',
    # ... 代理列表
]

DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# 并发设置
CONCURRENT_REQUESTS = 100
DOWNLOAD_DELAY = 0.5  # 请求之间的延迟

Scrapy适合静态网站(没有JavaScript的HTML)。对于动态网站,使用Scrapy + Splash(无头浏览器)或切换到Playwright。

Crawlee——Node.js的框架

Crawlee(以前的Apify SDK)是JavaScript的Scrapy替代品。优点是与Puppeteer和Playwright的原生集成,内置代理轮换,自动管理队列,适应性抓取速度(在出现错误时减慢)。

import { PlaywrightCrawler, ProxyConfiguration } from 'crawlee';

const proxyConfiguration = new ProxyConfiguration({
    proxyUrls: [
        'http://user:pass@proxy1.proxycove.com:12345',
        'http://user:pass@proxy2.proxycove.com:12345',
    ],
});

const crawler = new PlaywrightCrawler({
    proxyConfiguration,
    maxConcurrency: 50,
    requestHandler: async ({ page, request }) => {
        await page.waitForSelector('.data');
        const data = await page.$$eval('.item', items => 
            items.map(item => ({
                title: item.querySelector('h2').innerText,
                price: item.querySelector('.price').innerText
            }))
        );
        await saveData(data);
    },
});

await crawler.run(['https://site.com/catalog']);

Apache Nutch——用于大规模抓取

如果需要从整个互联网收集数据(如搜索引擎),请使用Apache Nutch。这是一个分布式爬虫,运行在Hadoop之上。可以处理PB级的数据,自动根据链接发现新页面,支持抓取策略(robots.txt、sitemap.xml)。

Nutch的设置较复杂,但对于收集类似Common Crawl的数据集是不可或缺的。使用代理时,请使用proxy-rotator插件。

速度和成本优化

为AI培训收集数据是一项昂贵的工作。在TB级流量下,代理费用可能达到每月数万美元。让我们看看如何在不降低质量的情况下优化成本。

组合使用代理类型

不要对所有任务使用住宅代理。将数据源分为三类:

  • 无保护:数据中心代理($0.5-2/IP)——开放API,简单网站,政府数据库
  • 中等保护:住宅轮换代理($5-10/GB)——使用Cloudflare的新闻网站,论坛
  • 高保护:住宅粘性会话($10-15/GB)——社交媒体,市场

例如:您正在抓取100个新闻网站。其中70个没有使用Cloudflare——使用数据中心代理。30个有保护——使用住宅代理。节省将达到60-70%的代理预算。

缓存请求

如果多次抓取同一个网站(例如,每日新闻收集),请缓存不变的页面。使用Redis或本地存储来缓存HTML。

import hashlib
import redis

cache = redis.Redis(host='localhost', port=6379)

def fetch_with_cache(url, proxies):
    # 检查缓存
    cache_key = hashlib.md5(url.encode()).hexdigest()
    cached = cache.get(cache_key)
    
    if cached:
        return cached.decode('utf-8')
    
    # 如果不在缓存中 - 发起请求
    response = requests.get(url, proxies=proxies)
    html = response.text
    
    # 缓存24小时
    cache.setex(cache_key, 86400, html)
    return html

优化流量

使用住宅代理时(按GB计费),降低流量至关重要:

  • 如果不需要,关闭图像、CSS、字体的加载(在Puppeteer中:page.setRequestInterception)
  • 使用压缩(gzip、brotli)——大多数代理都支持
  • 仅抓取所需元素——如果只需要一个块,不要下载整个页面
  • 对于API,使用JSON而不是HTML(流量减少5-10倍)

按时间分配负载

许多网站在一天内的负载不同。选择在夜间(根据网站服务器的时间)抓取——减少被速率限制的可能性。同时考虑周末——周六和周日的保护可能会更弱。

监控指标

监测关键指标以进行优化:

指标 标准 偏差时的处理方式
成功率 >90% 增加延迟,切换代理类型
平均速度 每个工作者50-200 req/min 增加工作者或代理
每1000条记录的成本 $0.5-5 优化流量,使用数据中心
重复率 <5% 改善去重,检查抓取逻辑

结论

收集数据以训练AI模型是一项复杂的任务,需要正确选择代理、设置轮换、绕过保护和优化成本。关键点包括:

  • 对于简单来源(API、无保护网站),使用数据中心代理——它们快速且便宜
  • 对于受保护的平台(社交媒体、市场、使用Cloudflare的网站),必须使用住宅代理
  • 根据任务设置轮换:按请求进行大规模抓取,使用粘性会话处理单一网站
  • 使用带掩盖插件的无头浏览器绕过反机器人系统
  • 构建可扩展的架构,使用任务队列和并行工作者
  • 优化开支:组合使用代理类型,缓存请求,减少流量

通过正确的设置,您将能够稳定且经济地收集TB级的数据。首先从10-20个来源的小型试点项目开始,调试流程,然后扩展到工业规模。

如果您计划从受保护的平台(社交媒体、电子商务、带反机器人系统的网站)收集数据,建议使用 住宅代理——它们提供高信任度和最低的封锁率。对于简单来源和API,使用 数据中心代理 足以提供最大速度和最低成本。

```