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,使用 数据中心代理 足以提供最大速度和最低成本。