ブログに戻る

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商品の価格を監視している場合 — これは1日あたり120,000リクエストになります。1つのIPアドレスからは不審に見え、マーケットプレイスの保護システムはすぐにアクセスをブロックします。

Wildberries、Ozon、Avitoが使用する保護手段

現代のマーケットプレイスは、パーシングからの多層的な保護を使用しています。これらのメカニズムを理解することで、ブロックを回避するための適切な設定が可能になります。

保護手段 動作の仕組み 回避方法
レート制限 1つのIPからのリクエスト制限:1時間あたり100-500 リクエスト間の遅延 + IPのローテーション
IPブラックリスト データセンターの既知のプロキシをブロック レジデンシャルプロキシの使用
ユーザーエージェントチェック ブラウザのユーザーエージェントなしのリクエストをブロック リアルなヘッダーの設定
JavaScriptチェック データ取得のためにJSコードの実行を要求 ヘッドレスブラウザの使用
キャプチャ 疑わしい活動時に強制的なチェック リクエストの頻度を下げる、キャプチャ解決サービスの利用
TLSフィンガープリンティング TLSパラメータによる自動化の特定 正しいフィンガープリンティングを持つライブラリの使用
行動分析 クリック速度、マウスの動きのパターンを分析 遅延のランダム化、人間の行動の模倣

Wildberriesは攻撃的な保護を使用しています:1つのIPからのリクエスト制限は1時間あたり約200-300、ユーザーエージェントの確認、JavaScriptチャレンジがあります。制限を超えると、HTTP 429(Too Many Requests)または403(Forbidden)が返されます。

OzonはAPIを通じたパーシングに対してより寛容ですが、データセンターのIPを積極的にブロックします。彼らはIPの種類(データセンター対レジデンシャル)を特定するサービスを使用しているため、通常のプロキシはしばしば機能しません。

Avitoは大量の広告掲載と連絡先のパーシングからAPIを保護しています。ここでは地理的な関連性が重要です:カザンに広告を掲載する場合、IPはカザンからでなければならず、そうでないとモデレーションが公開をブロックします。

レート制限:リクエスト間の遅延を正しく設定する方法

レート制限とは、リクエストの速度を人工的に制限し、あなたの活動が通常のユーザーの行動のように見えるようにすることです。主なルールは:遅くても安定している方が、早くてブロックされるよりも良いということです。

人気のマーケットプレイス向けの推奨設定:

Wildberries:

  • リクエスト間の遅延:2-5秒(ランダム化)
  • 1つのIPからの最大150-200リクエスト/時間
  • 100リクエストごとに10-15分の休止
  • 200リクエスト後にIPのローテーション

Ozon:

  • リクエスト間の遅延:1-3秒
  • 1つのIPからの最大300-400リクエスト/時間
  • レジデンシャルプロキシの使用が必須
  • 300リクエスト後にIPのローテーション

Avito:

  • リクエスト間の遅延:3-7秒
  • 1時間あたり最大50-100リクエスト(厳しい制限)
  • IPは広告の都市に一致する必要があります
  • 1つのIP = 1つのアカウント(混在させない)

ランダム化された遅延を実現する方法: "ちょうど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を変更してください。これは、商品を閲覧している人間の行動を模倣します。

負荷分散のためのプロキシのローテーション

適切な遅延があっても、1つのIPは長時間の負荷に耐えられません。解決策はプロキシのローテーションです:複数のIPアドレス間でリクエストを分散させることです。これはマーケットプレイスの安定したパーシングの基礎です。

マーケットプレイスのパーシングに適したプロキシの種類:

プロキシの種類 利点 欠点 どのタスクに適しているか
データセンター 速く、安価で、安定している 簡単に特定され、しばしば禁止リストに載る Yandex.Market、小規模マーケットプレイス
レジデンシャル 実際の家庭ユーザーのIP、低いブロックリスク データセンターより高価で遅い Wildberries、Ozon、Avito
モバイル モバイルオペレーターのIP、最大の匿名性 最も高価で、速度が変動する Avitoの厳しいブロックを回避するため

WildberriesとOzonのパーシングには、レジデンシャルプロキシの使用をお勧めします — これは実際の家庭ユーザーのIPを持っているため、マーケットプレイスは通常の購入者と区別できません。データセンターのプロキシはここでは効果が薄いです:OzonとWildberriesはそのようなIPのブラックリストを持っています。

プロキシのローテーション戦略:

  • Nリクエスト後のローテーション。 100-300リクエストごとにIPを変更します。これは効率と安全性の最適なバランスです。
  • 時間によるローテーション。 30-60分ごとにIPを変更します。長時間のパーシングセッションに適しています。
  • スティッキーセッション。 1つの商品のすべてのリクエストに1つのIPを使用し、その後変更します。これにより疑わしさが減ります。
  • 地理的関連性。 Avitoには必須です:モスクワの広告はモスクワのIPを通じて、カザンの広告はカザンのIPを通じてパーシングします。

ほとんどのレジデンシャルプロキシプロバイダーは自動ローテーションを提供しています:1つのエンドポイントを取得し、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/'
}

重要な点:

  • ユーザーエージェントは実際のブラウザに一致する必要があります。 最新のChrome、Firefox、Safariのバージョンを使用してください。100-200リクエストごとにユーザーエージェントを変更します。
  • Accept-Languageはプロキシの地理に一致する必要があります。 ロシアのIPを使用する場合はru-RU、ウクライナのIPの場合はuk-UAを設定します。
  • Refererはユーザーがどこから来たかを示します。 最初のリクエストにはGoogle/Yandexを使用し、その後はマーケットプレイスの内部ページを使用します。
  • Sec-Fetch-*ヘッダーはリアリズムを追加します。 現代のブラウザは自動的にそれらを送信します。

TLSフィンガープリンティング: 高度な保護システム(Ozon、Wildberries)は、TLS接続のパラメータを分析します:cipher suitesの順序、拡張、プロトコルのバージョン。標準のPython/Node.jsライブラリはブラウザとは異なるフィンガープリンティングを持っています。

解決策は、専門のライブラリを使用することです:

  • curl-impersonate(Python) — Chrome/FirefoxのTLSフィンガープリンティングを模倣します
  • tls-client(Go、Pythonバインディング) — カスタマイズ可能なTLSフィンガープリンティング
  • Playwright / Puppeteer — 本物のTLSを持つヘッドレスブラウザ

ほとんどのマーケットプレイスのパーシングタスクには、正しいHTTPヘッダーとレジデンシャルプロキシがあれば十分です。TLSフィンガープリンティングは、最も保護されたAPIで作業する場合にのみ重要です。

API vs ウェブスクレイピング:パーシングに安全なのはどちらか

マーケットプレイスにはデータを取得する2つの方法があります:公式APIとHTMLページのパーシング(ウェブスクレイピング)。安定して動作するためにはどちらを選ぶべきでしょうか?

パラメータ 公式API ウェブスクレイピング
合法性 ✅ 許可されており、ドキュメントがあります ⚠️ グレーゾーン、ToSに違反する可能性があります
安定性 ✅ 安定したデータ構造 ❌ サイトのリデザインで壊れる
制限 ⚠️ 厳しい公式制限 ⚠️ 非公式だが、保護があります
データへのアクセス ⚠️ すべてのデータが利用可能ではない ✅ すべての公開データ
速度 ✅ 高速なJSONレスポンス ❌ HTMLのため遅い
コスト ⚠️ しばしば有料 ✅ 無料(プロキシのみ)

選択に関する推奨事項:

  • 公式APIを使用する場合: 小規模なデータ量が必要(1日あたり10,000商品まで)、アクセスのために支払う準備があり、合法性と安定性が重要です。
  • ウェブスクレイピングを使用する場合: 大量のデータが必要、公式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

# プロキシの設定(middleware rotating-proxiesを通じて)
ROTATING_PROXY_LIST = [
    'http://user:pass@proxy1.example.com:8000',
    'http://user:pass@proxy2.example.com:8000',
    # ... プロキシのリスト
]

# ユーザーエージェントのローテーション
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',
    # ... ユーザーエージェントのリスト
]

# エラー時の再試行
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 — マーケットプレイスを含む任意のサイトのためのビジュアルパーサー

これらのサービスはすでにプロキシ、制限、保護の回避を設定しています — あなたは何をパーシングするかを指定するだけです。欠点は、月額料金が2,000₽からであることです。

ブロックの監視と自動反応

適切な設定があっても、ブロックが発生する可能性があります:マーケットプレイスは保護を更新し、プロキシが禁止リストに載り、制限が変更されます。問題を追跡し、自動的に反応することが重要です。

監視すべきブロックの兆候:

  • HTTP 429(Too Many Requests) — リクエスト制限を超えました、休止またはIPの変更が必要です
  • HTTP 403(Forbidden) — IPがブロックされました、プロキシの即時ローテーションが必要です
  • HTTP 503(Service Unavailable) — 一時的な過負荷または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  # すべての試行が失敗しました

ロギングとアラート: 重大なイベント時に通知を設定します。例えば、次のような場合にTelegramにメッセージを送信します:

  • プールの30%以上のプロキシがブロックされました
  • 成功したリクエストの割合が80%未満に低下しました
  • パーサーが30分以上データを取得できませんでした
  • レスポンスにキャプチャが検出されました

監視するためのメトリクス:

  • 成功率 — 成功したリクエストの割合(>90%であるべき)
  • 平均応答時間 — 平均応答時間(増加は問題を示す可能性があります)
  • 時間あたりのリクエスト数 — 各プロキシの時間あたりのリクエスト数
  • プロキシの健康状態 — プール内の稼働中のプロキシの割合
  • ブロック率 — ブロックの頻度(<5%であるべき)

メトリクスの視覚化にはダッシュボードを使用します:Grafana、Datadog、またはAPIを介して自動更新されるシンプルなGoogle Sheets。

結論

マーケットプレイスのパーシングにおけるブロックは障害ではなく、ツールの適切な設定によって解決できる課題です。ブロックなしで安定して動作するための重要なポイント:

  • Wildberries、Ozon、Avitoにはレジデンシャルプロキシを使用してください — データセンターのプロキシはここでは機能しません
  • リクエスト間に2-5秒のランダム化された遅延を設定してください
  • 150-300リクエストごとまたは30-60分ごとにIPをローテーションしてください
  • 最新のユーザーエージェントを持つリアルなHTTPヘッダーを使用してください
  • ブロックを監視し、自動的に反応してください
  • Avitoには広告の都市に対するIPの地理的関連性が必須です

適切に設定されたパーサーと高品質のプロキシは、数ヶ月間ブロックなしで動作し、毎日数万の商品を収集することができます。重要なのは、速度を追求するのではなく、通常のユーザーの行動を模倣することです。

Wildberries、Ozon、またはAvitoを定期的にパーシングする予定がある場合は、自動ローテーション機能を持つレジデンシャルプロキシを使用することをお勧めします — これは最大の安定性と最小のブロックリスクを提供します。モバイルIPが必要なタスク(例えば、Avitoの厳しいブロックを回避するため)には、ロシアのオペレーターのIPを持つモバイルプロキシが適しています。

```