返回博客

如何避免在频繁请求Wildberries、Ozon和Avito API时被封锁

分析市场API在价格和库存解析时被封锁的原因,展示如何正确设置代理、延迟和请求头,以确保稳定运行而不被封禁。

📅2026年1月30日
```html

如果您从事竞争对手价格监控、商品库存解析或在市场平台上自动发布广告,您肯定遇到过封禁问题。Wildberries、Ozon、Yandex.Market 和 Avito 的 API 积极防止自动化:限制请求数量、封禁 IP 地址并要求输入验证码。在本指南中,我们将分析为什么会发生封禁,以及如何设置解析器以便在没有封禁的情况下稳定工作数月。

为什么市场平台会阻止频繁的 API 请求

市场平台在基础设施上投入了巨额资金——服务器、数据库、CDN。当您每分钟发出数千个请求以解析价格时,您会给他们的系统带来额外的负担。但封禁的主要原因并非技术问题,而是以商业为导向。

封禁的主要原因:

  • 保护竞争数据。 Wildberries 和 Ozon 不希望竞争对手轻易获取价格、库存和热门商品的信息。这些数据是商业机密。
  • 减少服务器负载。 一个解析器可以生成与 10,000 个普通买家相同数量的请求。这增加了托管成本。
  • 打击虚假点击和垃圾信息。 自动化系统用于虚假增加浏览量、评论和在 Avito 上批量发布广告。
  • API 的货币化。 一些市场平台提供官方的付费 API 及其限制。通过封禁免费解析,他们鼓励购买访问权限。

例如,如果您每小时监控 5,000 种商品的价格——这就是每天 120,000 个请求。从一个 IP 地址看,这看起来很可疑,市场平台的保护系统会迅速封禁您的访问权限。

Wildberries、Ozon 和 Avito 使用哪些保护方法

现代市场平台使用多层次的解析保护。理解这些机制将有助于正确设置绕过封禁。

保护方法 工作原理 如何绕过
速率限制 从一个 IP 地址限制请求:每小时 100-500 个请求 请求之间的延迟 + IP 轮换
IP 黑名单 阻止已知数据中心的代理 使用住宅代理
User-Agent 检查 阻止没有浏览器 User-Agent 的请求 设置真实的请求头
JavaScript 检查 要求执行 JS 代码以获取数据 使用无头浏览器
验证码 在可疑活动时强制验证 减少请求频率,使用验证码解决服务
TLS 指纹识别 通过 TLS 参数识别自动化 使用具有正确指纹的库
行为分析 分析模式:点击速度、鼠标移动 随机化延迟,模拟人类行为

Wildberries 使用激进的保护措施:每个 IP 的请求限制约为每小时 200-300 个,User-Agent 检查和 JavaScript 挑战。如果超过限制,您将收到 HTTP 429(请求过多)或 403(禁止)错误。

Ozon 对通过 API 进行解析更加宽容,但会积极封禁数据中心的 IP。他们使用 IP 类型识别服务(数据中心 vs 住宅),因此普通代理通常无法使用。

Avito 保护 API 免受批量广告发布和联系人解析的影响。这里地理位置非常重要:如果您在喀山发布广告,IP 必须来自喀山,否则审核将阻止发布。

速率限制:如何正确设置请求之间的延迟

速率限制是对请求速度的人工限制,以便您的活动看起来像普通用户的行为。主要规则是:宁可慢而稳,也不要快而被封禁。

流行市场平台的推荐设置:

Wildberries:

  • 请求之间的延迟:2-5 秒(随机)
  • 每个 IP 最大 150-200 个请求每小时
  • 每 100 个请求后暂停 10-15 分钟
  • 每 200 个请求后轮换 IP

Ozon:

  • 请求之间的延迟:1-3 秒
  • 每个 IP 最大 300-400 个请求每小时
  • 必须使用住宅代理
  • 每 300 个请求后轮换 IP

Avito:

  • 请求之间的延迟:3-7 秒
  • 每小时最大 50-100 个请求(严格限制)
  • IP 必须与广告城市相符
  • 一个 IP = 一个账户(不要混合)

如何实现随机延迟: 不要使用固定的间隔,比如“正好 3 秒”——这看起来像机器人。添加随机性:从 2 到 5 秒。大多数解析器通过设置支持这一点。

例如,在 Python 中使用 requests 库的代码如下:

import time
import random
import requests

def make_request(url, proxies):
    response = requests.get(url, proxies=proxies)
    # 随机延迟 2 到 5 秒
    delay = random.uniform(2.0, 5.0)
    time.sleep(delay)
    return response

# 示例用法
proxy = {
    'http': 'http://username:password@proxy.example.com:8000',
    'https': 'http://username:password@proxy.example.com:8000'
}

for product_id in product_list:
    url = f'https://card.wb.ru/cards/detail?nm={product_id}'
    response = make_request(url, proxy)
    # 数据处理...

重要提示: 每 100-200 个请求后,进行长时间暂停(10-20 分钟)或更换 IP。这模拟了一个人查看商品后又转移注意力去做其他事情的行为。

代理轮换以分散负载

即使设置了正确的延迟,一个 IP 也无法承受长时间的负载。解决方案是代理轮换:在多个 IP 地址之间分散请求。这是市场平台稳定解析的基础。

用于市场平台解析的代理类型:

代理类型 优点 缺点 适合的任务
数据中心 快速、便宜、稳定 容易被识别,常在封禁列表中 Yandex.Market、小型市场平台
住宅代理 真实家庭用户的 IP,封禁风险低 比数据中心贵,速度较慢 Wildberries、Ozon、Avito
移动代理 移动运营商的 IP,最大匿名性 最贵,速度不稳定 绕过 Avito 的严格封禁

对于解析 Wildberries 和 Ozon,我们建议使用 住宅代理——它们具有真实家庭用户的 IP,因此市场平台无法将其与普通买家区分开。数据中心的代理在这里效果不佳:Ozon 和 Wildberries 会将这些 IP 列入黑名单。

代理轮换策略:

  • 在 N 个请求后轮换。 每 100-300 个请求后更换 IP。这是在效率和安全性之间的最佳平衡。
  • 按时间轮换。 每 30-60 分钟更换 IP。适合长时间的解析会话。
  • 粘性会话。 对于同一商品/类别的所有请求使用一个 IP,然后更换。这降低了可疑性。
  • 地理位置绑定。 对于 Avito 是必须的:通过莫斯科的 IP 解析莫斯科的广告,通过喀山的 IP 解析喀山的广告。

大多数住宅代理提供自动轮换:您获得一个端点,IP 会根据设定的频率或每个请求后自动更换。这简化了解析器的设置。

在 Python 中设置代理池的示例:

import requests
import random

# 代理列表(可以从文件加载)
proxy_list = [
    'http://user:pass@proxy1.example.com:8000',
    'http://user:pass@proxy2.example.com:8000',
    'http://user:pass@proxy3.example.com:8000',
    # ... 其他 50-100 个代理
]

def get_random_proxy():
    proxy = random.choice(proxy_list)
    return {
        'http': proxy,
        'https': proxy
    }

# 使用
for product_id in product_list:
    proxy = get_random_proxy()  # 每个请求使用随机代理
    response = requests.get(url, proxies=proxy)
    # 数据处理...

设置请求头和指纹以模拟浏览器

市场平台不仅分析 IP 和请求频率,还分析 HTTP 请求头。如果您的解析器使用库的默认请求头(例如 python-requests/2.28.0)发送请求,它会立即被识别为机器人。

模拟浏览器的必要请求头:

headers = {
    '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-US;q=0.8,en;q=0.7',
    'Accept-Encoding': 'gzip, deflate, br',
    'DNT': '1',
    'Connection': 'keep-alive',
    'Upgrade-Insecure-Requests': '1',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'none',
    'Cache-Control': 'max-age=0',
    'Referer': 'https://www.google.com/'
}

重要事项:

  • User-Agent 应与真实浏览器相符。 使用最新版本的 Chrome、Firefox、Safari。每 100-200 个请求更换一次 User-Agent。
  • Accept-Language 应与代理的地理位置相符。 如果使用俄罗斯 IP——设置为 ru-RU,使用乌克兰 IP——设置为 uk-UA。
  • Referer 显示用户的来源。 对于第一个请求,使用 Google/Yandex,对于后续请求,使用市场平台的内部页面。
  • Sec-Fetch-* 请求头增加了真实感。 现代浏览器会自动发送这些请求头。

TLS 指纹识别: 先进的保护系统(Ozon、Wildberries)分析 TLS 连接的参数:密码套件的顺序、扩展、协议版本。标准的 Python/Node.js 库与浏览器的指纹不同。

解决方案是使用专门的库:

  • curl-impersonate(Python)——模拟 Chrome/Firefox 的 TLS 指纹
  • tls-client(Go,Python 绑定)——可配置的 TLS 指纹
  • Playwright / Puppeteer——具有真实 TLS 的无头浏览器

对于大多数市场平台解析任务,正确的 HTTP 请求头和住宅代理就足够了。TLS 指纹识别仅在处理最受保护的 API 时至关重要。

API 与网页抓取:哪种方式更安全

市场平台有两种获取数据的方式:官方 API 和解析 HTML 页面(网页抓取)。选择哪种方式以确保稳定工作?

参数 官方 API 网页抓取
合法性 ✅ 允许,有文档 ⚠️ 灰色地带,可能违反服务条款
稳定性 ✅ 数据结构稳定 ❌ 网站重新设计时会崩溃
限制 ⚠️ 严格的官方限制 ⚠️ 非官方,但有保护
数据访问 ⚠️ 并非所有数据均可用 ✅ 所有公开数据
速度 ✅ 快速的 JSON 响应 ❌ 由于 HTML 而较慢
成本 ⚠️ 通常是付费的 ✅ 免费(仅需代理费用)

选择建议:

  • 如果您需要: 小规模数据(每天不超过 10,000 个商品),愿意为访问支付,重视合法性和稳定性,请使用官方 API。
  • 如果您需要: 大规模数据,官方 API 不提供所需信息(例如竞争对手价格),预算有限,请使用网页抓取。

混合方法: 许多专业解析器结合了这两种方法。例如,通过 API 获取商品列表(快速且合法),然后从 HTML 页面解析详细的价格和库存信息(获取更多数据)。

市场平台的内部 API: 除了官方 API,市场平台还使用内部 API 来操作网站。例如,Wildberries 通过 https://card.wb.ru/cards/detail 加载商品数据。这些端点没有文档,但比 HTML 解析更快。缺点是可能会在没有警告的情况下更改。

流行解析器和工具的设置

大多数卖家和市场营销人员使用现成的工具来解析市场平台。我们将讨论如何在流行解决方案中正确设置代理和限制。

Scrapy(Python 框架)的设置

Scrapy 是一个流行的网页抓取框架。要与市场平台一起使用,请在 settings.py 中添加:

# 请求之间的延迟
DOWNLOAD_DELAY = 3  # 3 秒
RANDOMIZE_DOWNLOAD_DELAY = True  # 从 0.5*DELAY 到 1.5*DELAY 随机化

# 同时请求的限制
CONCURRENT_REQUESTS = 8
CONCURRENT_REQUESTS_PER_DOMAIN = 2

# 代理设置(通过 rotating-proxies 中间件)
ROTATING_PROXY_LIST = [
    'http://user:pass@proxy1.example.com:8000',
    'http://user:pass@proxy2.example.com:8000',
    # ... 代理列表
]

# User-Agent 轮换
USER_AGENT_LIST = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/537.36',
    # ... User-Agent 列表
]

# 错误重试
RETRY_TIMES = 3
RETRY_HTTP_CODES = [429, 500, 502, 503, 504]

Octoparse(无代码可视化解析器)的设置

Octoparse 是一个流行的无编程解析工具。代理和限制的设置:

  1. 打开任务设置 → 高级选项
  2. 在“网络”部分启用“使用代理服务器”
  3. IP:PORT:USER:PASS 格式添加代理列表
  4. 启用“每个请求轮换 IP”以实现自动轮换
  5. 在“速度”部分设置为“慢”或“自定义”,延迟 3-5 秒
  6. 启用“随机延迟”以模拟人类行为

Selenium(浏览器自动化)的设置

Selenium 控制真实浏览器,因此可以绕过许多保护。以下是使用代理的设置示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import random

# 使用代理设置 Chrome
chrome_options = Options()
chrome_options.add_argument('--proxy-server=http://user:pass@proxy.example.com:8000')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)

driver = webdriver.Chrome(options=chrome_options)

# 隐藏 WebDriver
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

# 带延迟的解析
urls = ['https://www.wildberries.ru/catalog/...', ...]

for url in urls:
    driver.get(url)
    # 随机延迟 3-7 秒
    time.sleep(random.uniform(3, 7))
    
    # 滚动以模拟阅读
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight/2);")
    time.sleep(random.uniform(1, 3))
    
    # 数据解析
    # ...

市场平台解析的现成服务

如果您不想自己设置解析器,可以使用专业服务:

  • Mpstats.io——Wildberries 和 Ozon 的分析,自动监控价格和销售
  • SellerFox——市场平台上的竞争对手监控,库存跟踪
  • Moneyplace——Avito 的解析,自动发布广告
  • Parsehub——适用于任何网站的可视化解析器,包括市场平台

这些服务已经设置了代理、限制和绕过保护——您只需指定要解析的内容。缺点是每月订阅费用从 2000₽ 起。

监控封禁和自动反应

即使设置正确,封禁仍然可能发生:市场平台更新保护,代理被列入封禁名单,限制发生变化。重要的是监控问题并自动响应。

需要监控的封禁迹象:

  • HTTP 429(请求过多)——请求限制已超出,需要暂停或更换 IP
  • HTTP 403(禁止)——IP 被封禁,需要立即轮换代理
  • HTTP 503(服务不可用)——临时过载或 DDoS 防护
  • 响应中出现验证码——检测到自动化,需要降低活动
  • 空响应或重定向到主页——软封禁
  • 响应时间急剧增加——可能是服务器端的速率限制

对封禁的自动反应(Python 示例):

import requests
import time
from datetime import datetime

class SmartParser:
    def __init__(self, proxy_list):
        self.proxy_list = proxy_list
        self.current_proxy_index = 0
        self.request_count = 0
        self.blocked_proxies = set()
        
    def get_next_proxy(self):
        # 跳过被封禁的代理
        while self.current_proxy_index in self.blocked_proxies:
            self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
        
        proxy = self.proxy_list[self.current_proxy_index]
        return {'http': proxy, 'https': proxy}
    
    def rotate_proxy(self):
        self.current_proxy_index = (self.current_proxy_index + 1) % len(self.proxy_list)
        self.request_count = 0
        
    def make_request(self, url):
        max_retries = 3
        
        for attempt in range(max_retries):
            try:
                proxy = self.get_next_proxy()
                response = requests.get(url, proxies=proxy, timeout=10)
                
                # 检查封禁
                if response.status_code == 429:
                    print(f"[{datetime.now()}] 超过请求限制!暂停 60 秒...")
                    time.sleep(60)
                    self.rotate_proxy()
                    continue
                    
                elif response.status_code == 403:
                    print(f"[{datetime.now()}] IP 被封禁!轮换代理...")
                    self.blocked_proxies.add(self.current_proxy_index)
                    self.rotate_proxy()
                    continue
                    
                elif response.status_code == 503:
                    print(f"[{datetime.now()}] 服务器过载。暂停 120 秒...")
                    time.sleep(120)
                    continue
                
                # 成功请求
                self.request_count += 1
                
                # 每 200 个请求后轮换
                if self.request_count >= 200:
                    self.rotate_proxy()
                    time.sleep(10)  # 轮换后的暂停
                
                return response
                
            except requests.exceptions.Timeout:
                print(f"[{datetime.now()}] 超时。尝试 {attempt + 1}/{max_retries}")
                time.sleep(5)
                
        return None  # 所有尝试已用尽

日志记录和警报: 在关键事件时设置通知。例如,当:

  • 超过 30% 的代理被封禁
  • 成功请求的比例低于 80%
  • 解析器超过 30 分钟未获取数据
  • 响应中检测到验证码

监控指标:

  • 成功率——成功请求的比例(应 >90%)
  • 平均响应时间——平均响应时间(增长可能表明存在问题)
  • 每小时请求数——每个代理每小时的请求数量
  • 代理健康——池中工作代理的比例
  • 封禁率——封禁的频率(应 <5%)

使用仪表板可视化指标:Grafana、Datadog 或简单的 Google 表格,通过 API 自动更新。

结论

在解析市场平台时,封禁并不是障碍,而是可以通过正确设置工具来解决的问题。确保稳定工作而不被封禁的关键点:

  • 对于 Wildberries、Ozon 和 Avito 使用住宅代理——数据中心的代理在这里无效
  • 在请求之间设置 2-5 秒的随机延迟
  • 在每 150-300 个请求后或每 30-60 分钟轮换 IP
  • 使用真实的 HTTP 请求头和最新的 User-Agent
  • 监控封禁并自动响应
  • 对于 Avito,IP 必须与广告城市相匹配

正确设置的解析器与高质量的代理可以在没有任何封禁的情况下工作数月,每天收集数万件商品。关键是不要追求速度,而是模拟普通用户的行为。

如果您计划定期解析 Wildberries、Ozon 或 Avito,建议使用 住宅代理 进行自动轮换——它们提供最大稳定性和最低封禁风险。对于需要移动 IP 的任务(例如,绕过 Avito 的严格封禁),可以使用 移动代理,这些代理来自俄罗斯运营商的 IP。

```