返回博客

商品特征抓取代理:如何在不被封锁的情况下从市场平台收集数据

详细指南,选择和设置代理以抓取市场商品特征:代理类型、IP轮换、绕过Wildberries和Ozon的反机器人系统。

📅2026年1月26日
```html

从市场平台解析商品特征是卖家、分析师和价格聚合器的关键任务。Wildberries、Ozon、Yandex.Market等平台积极阻止自动数据收集,使用先进的反机器人系统。没有正确配置的代理,您的解析器在50-100个请求后就会被封禁。本文将讨论哪些类型的代理适合解析,如何设置IP轮换以及如何绕过最大的市场平台的保护。

为什么市场平台阻止解析以及如何运作

现代市场平台因解析损失数百万卢布:竞争对手复制商品描述,聚合器截获流量,服务器负载增加。因此,Wildberries、Ozon、Yandex.Market等平台实施了多层次的自动数据收集保护。

市场平台如何识别解析:

  • 来自单个IP的请求频率 — 如果来自同一地址每分钟有100个以上的请求,这明显是机器人的迹象。普通用户在这段时间内浏览5-10个商品卡片。
  • 缺少JavaScript — 简单的解析器如requests或curl不会执行加载价格和特征的JS代码。网站看到内容在没有渲染的情况下被请求。
  • User-Agent和头部 — 库的默认头部(例如,“python-requests/2.28.0”)会立即暴露机器人。缺少Accept-Language、Referer头部也很可疑。
  • 浏览器指纹 — 高级系统(Cloudflare、Kasada、DataDome)分析Canvas、WebGL、字体、浏览器扩展。无头浏览器如Puppeteer很容易因缺少某些参数而被识别。
  • 行为模式 — 机器人以相同的间隔打开商品卡片(例如,每2秒一次),不滚动页面,不移动鼠标。这使其与真实用户不同。

封禁的后果:临时封禁IP 1-24小时,每个请求都需要CAPTCHA,整个数据中心IP范围被完全封禁。这对业务意味着停止数据收集和失去竞争优势。

真实案例:价格聚合器使用10个数据中心IP解析Wildberries,每个IP每小时发出500个请求。三天后整个/24范围被永久封禁—不得不更换代理提供商并转向带有轮换的住宅IP。

解析商品的代理类型比较

解析商品特征使用三种主要类型的代理。每种代理根据数据量、预算和速度要求都有其优缺点。

代理类型 速度 封禁风险 成本 何时使用
数据中心代理 高(50-200毫秒) 解析小量(每天最多10,000个商品),测试解析器
住宅代理 中等(200-800毫秒) 高(按流量计费) 解析Wildberries、Ozon,带有反机器人保护的大量数据
移动代理 中等(300-1000毫秒) 非常低 非常高 最大保护的解析,绕过严格的封禁,关键项目

数据中心代理 — 是数据中心(AWS、Hetzner、OVH)中的服务器IP地址。它们快速且便宜,但市场平台容易通过ASN数据库识别它们。适合解析小型目录(每天最多10,000个商品)或没有严重保护的平台。成本:每月每个IP从1-3美元起。

住宅代理 — 是通过应用程序中的SDK合法获取的家庭用户IP。市场平台将其视为普通买家。非常适合大规模解析Wildberries、Ozon、Yandex.Market。成本:每GB流量从5-15美元起(大约10,000-30,000个请求)。

移动代理 — 是移动运营商(MTS、Beeline、MegaFon)的IP。最可靠的绕过保护类型,但价格昂贵且速度较慢。仅在关键任务中使用,封禁不可接受。成本:每月每个IP从50-150美元起,带轮换。

选择住宅代理还是数据中心:根据您的任务选择

选择代理类型取决于三个因素:解析量、平台的保护级别和预算。让我们讨论具体的使用场景。

何时适合数据中心代理

场景1:测试解析器
您正在开发新的解析器并检查数据提取逻辑。需要解析100-500个商品以进行调试。在这种情况下,住宅代理是浪费金钱。获取5-10个数据中心IP,每个IP每小时发出50-100个请求。这足以进行无封禁的测试。

场景2:解析没有保护的平台
小型区域市场平台、分类广告网站(如Avito某些类别)、基于OpenCart的在线商店通常没有严密的反机器人系统。在这种情况下,数据中心在适度负载下(每个IP每小时最多200个请求)稳定运行。

场景3:预算有限且数据量小
如果您需要每天解析5,000-10,000个商品,而预算有限,请尝试使用具有激进轮换的数据中心(每50-100个请求更换IP)。是的,封禁会更多,但如果正确设置重试逻辑(用新IP重复请求),这也是可行的。

何时需要住宅代理

场景1:解析Wildberries和Ozon
这些平台使用Cloudflare、DataDome和自己的反机器人系统。使用数据中心IP,您将在20-50个请求后收到CAPTCHA或封禁。每5-10分钟轮换的住宅代理允许您顺利解析数十万商品。一位客户在一周内解析了Wildberries的整个目录(超过2000万个商品),使用了1000个住宅IP的池。

场景2:带授权的解析
一些商品特征(批发价格、库存)仅对授权用户可用。如果您通过账户进行解析,使用数据中心将导致账户被封禁。住宅代理模拟真实用户的行为,降低封禁风险。

场景3:地理定位
Wildberries、Ozon、Yandex.Market上的商品价格和可用性取决于用户的地区。要同时收集莫斯科、圣彼得堡、叶卡捷琳堡的数据,需要选择城市的住宅代理。数据中心无法准确控制地理位置。

选择代理类型的公式:

  • 解析量 < 10,000 商品/天 + 没有严格保护 = 数据中心
  • 解析量 > 10,000 商品/天 + Wildberries/Ozon = 住宅代理
  • 带授权的解析 + 账户封禁风险 = 住宅代理
  • 需要按城市进行地理定位 = 住宅代理
  • 关键项目 + 对封禁的零容忍 = 移动代理

IP轮换设置:间隔和策略

IP轮换是指在达到一定请求数量或时间后自动更换代理服务器。正确设置轮换是稳定解析而不被封禁的关键。

代理轮换类型

1. 基于时间的轮换(Time-based rotation)
IP在固定间隔内更换:5分钟、10分钟、30分钟。这是最简单的方法,但不是最有效的。如果您在5分钟内发出200个请求,而平台的限制是每个IP 100个请求,您仍然会被封禁。

何时使用:对于低负载的住宅代理(每个IP最多50个请求)。例如,解析Wildberries时请求间隔为3-5秒,每10分钟轮换一次将是最佳选择。

2. 基于请求数量的轮换(Request-based rotation)
IP在N个请求后更换:50、100、200。这比时间轮换更精确,但需要在解析器代码中跟踪请求计数器。

何时使用:对于数据中心和激进解析。例如,您知道Ozon在每个IP发出80个请求后会封禁—设置每70个请求轮换一次以留有余地。

3. 每个请求轮换(Per-request rotation)
每个请求都通过新的IP。最大程度地保护免受封禁,但对于住宅代理来说是最昂贵的策略(由于建立新连接,流量消耗增加)。

何时使用:用于绕过最严格的保护(Cloudflare在“攻击模式”下)、高风险封禁账户的解析、收集竞争对手数据(他们监控解析)。

流行平台的推荐轮换间隔

平台 代理类型 轮换间隔 请求间隔
Wildberries 住宅代理 每5-10分钟或50个请求 2-4秒
Ozon 住宅代理 每7-12分钟或60个请求 3-5秒
Yandex.Market 住宅代理 每10-15分钟或80个请求 2-3秒
Avito(商品类别) 数据中心 每15-20分钟或100个请求 1-2秒
AliExpress 住宅代理 每3-5分钟或30个请求 4-6秒

重要提示:这些数字是2024年测试的结果。市场平台不断更新保护,因此建议从保守的设置开始(请求较少,延迟较长),并逐步增加负载,监控封禁比例。

“智能”轮换策略

使用基于服务器响应的自适应轮换,而不是固定间隔:

  • HTTP 429(请求过多) — 立即更换IP,并将该IP列入黑名单30-60分钟。
  • HTTP 403(禁止)或CAPTCHA — 更换IP,并将请求间隔增加50%。
  • HTTP 503(服务不可用) — 可能问题不在于代理,而在于网站过载。暂停30-60秒而不更换IP。
  • 连续成功请求 > 100 — 可以稍微减少延迟或增加请求数量直到轮换。

该逻辑在解析器代码中实现,可以节省30-40%的代理流量,避免不必要的轮换。

绕过Wildberries、Ozon和Yandex.Market的反机器人系统

现代市场平台使用多层保护:从简单的User-Agent检查到高级的浏览器指纹识别。仅仅使用代理是不够的—需要综合的绕过策略。

级别1:正确的HTTP头部

解析器必须发送的最小头部集:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Cache-Control: max-age=0

关键点:

  • User-Agent必须与真实浏览器相符。使用最新版本的Chrome 120+、Firefox 121+。不要使用旧版本(Chrome 90)—这是一个红旗。
  • Accept-Language应为“ru-RU”用于俄罗斯平台。如果使用“en-US”作为头部,网站会理解不一致(IP来自俄罗斯,但语言为英语)。
  • Sec-Fetch-*头部在Chrome 76+中出现,并且是现代网站的必需品。缺少它们会暴露旧的解析器。

级别2:执行JavaScript

Wildberries和Ozon通过JavaScript在页面加载后加载价格、特征和库存。如果您的解析器使用requests/curl仅下载HTML,它将获得空白页面或占位符。

解决方案:使用无头浏览器—Puppeteer(Node.js)、Playwright(Python/Node.js)、Selenium。它们完全渲染页面,执行JS并获取最终的HTML。

无头浏览器的问题:网站很容易通过navigator.webdriver === true、缺少插件、Canvas的特定尺寸来识别它们。无头Chrome的识别率约为80-90%。

解决问题:使用隐身模式的库:

  • puppeteer-extra-plugin-stealth(Node.js)—将Puppeteer伪装成普通Chrome,修补30多个指纹参数。
  • undetected-chromedriver(Python)—修补版本的Selenium ChromeDriver,大多数反机器人系统无法识别。
  • playwright-stealth(Python)—Playwright的类似版本,支持Firefox和WebKit。

级别3:绕过Cloudflare和DataDome

Wildberries使用Cloudflare Bot Management,Ozon使用DataDome。这些系统不仅分析IP和头部,还分析行为:滚动速度、鼠标移动、页面加载时间。

Cloudflare挑战的迹象:您看到的不是内容,而是“检查您的浏览器...”页面,延迟5秒。在代码中,这是一个JavaScript挑战,用于检查浏览器。

如何绕过:

  • FlareSolverr — 代理服务,自动解决Cloudflare挑战。您向它发送URL,它返回绕过的cookies。成功率在70-80%之间。
  • Playwright与等待 — 在无头浏览器中加载页面,等待10-15秒(直到JS执行完毕),提取cookies并在普通HTTP请求中使用它们。节省资源:浏览器仅用于获取cookies,之后通过requests解析。
  • 住宅代理 + 隐身浏览器 — 组合提供95%以上的成功绕过率。Cloudflare看到真实用户的IP和正确的浏览器指纹。

重要:Cloudflare不断更新保护。2024年12月有效的策略可能在2025年3月失效。始终保持备用计划:通过2Captcha/AntiCaptcha服务手动解决CAPTCHA或切换到市场平台的API(如果可用)。

级别4:模拟用户行为

高级反机器人系统跟踪行为模式。真实用户滚动页面、移动鼠标,有时会返回。机器人以完美的2.000秒间隔打开商品卡片。

如何模拟:

  • 延迟随机化 — 使用random.uniform(2.5, 5.0)代替固定的3秒。添加罕见的长暂停(15-30秒),模拟用户的分心。
  • 滚动页面 — 在Puppeteer/Playwright中,在提取数据之前添加滚动:await page.evaluate(() => window.scrollBy(0, 500))
  • 鼠标移动 — Puppeteer的ghost-cursor库生成逼真的光标移动轨迹。
  • 通过搜索进行导航 — 不要直接通过URL打开商品卡片。首先访问主页,执行搜索,然后在结果中点击商品。这看起来更自然。

支持代理的流行解析工具

解析商品特征不必从头编写代码。存在具有可视化界面、支持代理和自动绕过保护的现成工具。

Octoparse — 无代码解析器

描述:适用于Windows/Mac的桌面应用程序,具有可视化解析器构建器。您点击页面元素(商品名称、价格、特征),程序自动创建提取规则。

代理支持:内置。在设置中指定代理列表,程序自动轮换。支持HTTP、HTTPS、SOCKS5。与Bright Data、Smartproxy提供商集成。

优点:不需要代码,支持JavaScript网站,内置任务调度器,导出到Excel/CSV/JSON。
缺点:付费订阅从75美元/月起,比Python代码慢,免费版限制页面数量。

何时使用:适合小型项目(最多50,000个商品),如果您不是程序员或需要快速原型。

ParseHub — 云解析器

描述:Octoparse的类似产品,但在云中运行。您在桌面应用程序中设置解析器,而它在ParseHub的服务器上运行。适合长时间任务(解析100,000+商品)。

代理支持:仅在付费计划中(从149美元/月起)。可以上传自己的代理列表或使用ParseHub内置的住宅IP。

优点:不占用您的计算机,自动处理分页,提供API进行集成。
缺点:价格昂贵,支持缓慢,复杂网站的设置困难。

Scrapy(Python)— 为程序员准备

描述:用于创建Python解析器的框架。最灵活和快速的选项—可以每天解析数百万商品。需要中级Python知识。

代理支持:通过中间件。流行的解决方案:scrapy-rotating-proxies(从列表中轮换)、scrapy-proxy-pool(与提供商API集成)。设置需要10-15分钟。

优点:免费,非常快速(异步请求),完全控制逻辑,庞大的社区。
缺点:需要编写代码,处理JavaScript网站时困难(需要与Splash或Playwright集成)。

何时使用:适合大规模项目,每天解析100,000+商品,如果您的团队中有程序员。

Apify — 成品解析器市场

描述:平台上有数千个现成的解析器(称为“演员”)用于流行网站。为Amazon、eBay、AliExpress提供现成解决方案。对于俄罗斯市场平台,选择较少,但可以定制开发。

代理支持:所有演员内置。Apify提供自己的住宅代理(按流量计费),也可以连接自己的代理。

优点:现成解决方案,云执行,API用于自动化,内置代理。
缺点:价格昂贵(从49美元/月起 + 代理费用),依赖于平台,定制限制。

工具比较

工具 需要代码吗? 价格 速度 适合谁
Octoparse 不需要 从75美元/月起 中等 市场营销人员、没有编程经验的分析师
ParseHub 不需要 从149美元/月起 中等 同样希望进行云执行的人
Scrapy 需要(Python) 免费 非常快 程序员、大数据量
Apify 不需要(现成演员) 从49美元/月起 + 流量 企业,需要现成解决方案
Puppeteer/Playwright 需要(JS/Python) 免费 中等(重型浏览器) 程序员、复杂的JS网站

解析器中代理的逐步设置

让我们以流行工具为例,考虑代理的实际设置。这些说明适用于解析任何市场平台,不仅限于俄罗斯。

在Octoparse中设置

步骤1:打开Octoparse并创建新的解析任务。输入起始页面的URL(例如,Wildberries上的商品类别)。

步骤2:转到“设置”→“高级设置”→“代理”。选择“使用自定义代理”。

步骤3:以以下格式添加代理:

http://username:password@proxy-server.com:8080
socks5://username:password@proxy-server.com:1080

步骤4:启用“轮换代理”选项并设置轮换间隔。对于Wildberries,建议“每50个请求轮换”或“每10分钟轮换”。

步骤5:点击“测试代理” — Octoparse将检查每个代理的可用性。删除列表中不可用的代理。

步骤6:在“速度”部分设置请求之间的延迟:对于住宅代理,设置为2-4秒,对于数据中心,设置为3-5秒。

在Scrapy(Python)中设置

步骤1:安装代理轮换库:

pip install scrapy-rotating-proxies

步骤2:创建一个名为proxies.txt的文件,列出代理(每行一个):

http://user:pass@1.2.3.4:8080
http://user:pass@5.6.7.8:8080
socks5://user:pass@9.10.11.12:1080

步骤3:在您的Scrapy项目的settings.py文件中添加:

ROTATING_PROXY_LIST_PATH = 'proxies.txt'

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

# 请求之间的延迟(以秒为单位)
DOWNLOAD_DELAY = 3

# 延迟随机化(±50%)
RANDOMIZE_DOWNLOAD_DELAY = True

# 并发请求(住宅代理不超过16个)
CONCURRENT_REQUESTS = 8

步骤4:Scrapy将在每个请求时自动轮换代理。如果代理返回错误(HTTP 403、429、超时),则标记为“坏代理”,并暂时从轮换中排除。

在Puppeteer(Node.js)中设置

步骤1:安装Puppeteer和隐身模式插件:

npm install puppeteer puppeteer-extra puppeteer-extra-plugin-stealth

步骤2:创建一个支持代理的脚本:

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');
puppeteer.use(StealthPlugin());

const proxyList = [
  'http://user:pass@proxy1.com:8080',
  'http://user:pass@proxy2.com:8080'
];

let currentProxyIndex = 0;

async function scrapeWithProxy(url) {
  const proxy = proxyList[currentProxyIndex];
  currentProxyIndex = (currentProxyIndex + 1) % proxyList.length;

  const browser = await puppeteer.launch({
    headless: true,
    args: [`--proxy-server=${proxy}`]
  });

  const page = await browser.newPage();
  
  // 代理授权(如果需要)
  await page.authenticate({
    username: 'user',
    password: 'pass'
  });

  await page.goto(url, { waitUntil: 'networkidle2' });
  
  // 提取数据
  const data = await page.evaluate(() => {
    return {
      title: document.querySelector('.product-title')?.innerText,
      price: document.querySelector('.product-price')?.innerText,
      // 其他数据提取...
    };
  });

  await browser.close();
  return data;
}
```