マーケットプレイスからの商品特性の解析は、販売者、アナリスト、価格アグリゲーターにとって非常に重要なタスクです。Wildberries、Ozon、Yandex.Marketなどのプラットフォームは、高度なアンチボットシステムを使用して自動データ収集を積極的にブロックしています。正しく設定されたプロキシがなければ、あなたのパーサーは50〜100のリクエスト後に禁止されてしまいます。この記事では、解析に適したプロキシのタイプ、IPのローテーションの設定方法、主要なマーケットプレイスの保護を回避する方法について説明します。
なぜマーケットプレイスは解析をブロックするのか、そしてそれはどのように機能するのか
現代のマーケットプレイスは、解析によって数百万ルーブルを失っています:競合他社が商品説明をコピーし、アグリゲーターがトラフィックを奪い、サーバーへの負荷が増加します。したがって、Wildberries、Ozon、Yandex.Marketなどのプラットフォームは、自動データ収集に対する多層的な保護を導入しました。
マーケットプレイスはどのように解析を特定するのか:
- 1つのIPからのリクエストの頻度 — 1つのアドレスから1分間に100以上のリクエストがある場合、それは明らかにボットの兆候です。通常のユーザーはその間に5〜10の商品カードを閲覧します。
- JavaScriptの欠如 — requestsやcurlのような単純なパーサーは、価格や特性を読み込むJSコードを実行しません。サイトは、コンテンツがレンダリングなしでリクエストされていることを認識します。
- User-Agentとヘッダー — ライブラリのデフォルトヘッダー(例:"python-requests/2.28.0")はすぐにボットを示します。Accept-LanguageやRefererのヘッダーが欠如していることも疑わしいです。
- ブラウザのフィンガープリンティング — 高度なシステム(Cloudflare、Kasada、DataDome)は、Canvas、WebGL、フォント、ブラウザの拡張を分析します。Puppeteerのようなヘッドレスブラウザは、一部のパラメータが欠如しているため簡単に特定されます。
- 行動パターン — ボットは同じ間隔で商品カードを開きます(例えば、正確に2秒ごと)、ページをスクロールせず、マウスを動かしません。これが生身の人間と異なる点です。
ブロックの結果: 1〜24時間のIPの一時的な禁止、各リクエストに対するCAPTCHA、データセンターのIP範囲の完全なブロック。ビジネスにとっては、データ収集の停止と競争優位性の喪失を意味します。
実際のケース: 価格アグリゲーターは、10のデータセンターIPからWildberriesを解析し、各IPから1時間に500リクエストを行っていました。3日後、全ての/24範囲が永久的に禁止され、プロキシプロバイダーを変更し、ローテーション付きのレジデンシャルIPに切り替える必要がありました。
商品解析用プロキシのタイプの比較
商品特性の解析には、主に3つのタイプのプロキシが使用されます。それぞれは、データ量、予算、速度の要件に応じて利点と制限があります。
| プロキシのタイプ | 速度 | 禁止のリスク | コスト | 使用するタイミング |
|---|---|---|---|---|
| データセンターのプロキシ | 高速(50-200 ms) | 高い | 低い | 小規模なデータの解析(1日あたり最大10,000商品)、パーサーのテスト |
| レジデンシャルプロキシ | 中程度(200-800 ms) | 低い | 高い(トラフィックに応じて) | ボット対策のあるWildberries、Ozonの解析、大量データの解析 |
| モバイルプロキシ | 中程度(300-1000 ms) | 非常に低い | 非常に高い | 最大の保護を伴う解析、厳しいブロックを回避するため、重要なプロジェクト |
データセンターのプロキシ — データセンター(AWS、Hetzner、OVH)のサーバーのIPアドレスです。高速で安価ですが、マーケットプレイスはASNデータベースを使用して簡単に特定できます。小規模なカタログ(1日あたり最大10,000商品)や、深刻な保護がないプラットフォームの解析に適しています。コスト:月額1〜3ドル/ IP。
レジデンシャルプロキシ — アプリケーション内のSDKを介して合法的に取得された家庭ユーザーのIPです。マーケットプレイスはこれらを通常の購入者として認識します。大量のWildberries、Ozon、Yandex.Marketの解析に最適です。コスト:1GBのトラフィックあたり5〜15ドル(約10,000〜30,000リクエスト)。
モバイルプロキシ — モバイルオペレーター(MTS、Beeline、MegaFon)のIPです。保護を回避するための最も信頼性の高いタイプですが、高価で遅いです。ブロックが許されない重要なタスクにのみ使用してください。コスト:月額50〜150ドル/ IP(ローテーション付き)。
レジデンシャルとデータセンター:あなたのタスクに最適な選択はどれか
プロキシのタイプの選択は、3つの要因に依存します:解析のボリューム、プラットフォームの保護レベル、予算。具体的な使用シナリオを見てみましょう。
データセンターのプロキシが適している場合
シナリオ1:パーサーのテスト
新しいパーサーを開発しており、データ抽出のロジックを確認しています。デバッグのために100〜500の商品を解析する必要があります。この場合、レジデンシャルプロキシは無駄な出費です。データセンターの5〜10のIPを取得し、それぞれから1時間に50〜100リクエストを行ってください。これでブロックなしでテストできます。
シナリオ2:保護のないプラットフォームの解析
小規模な地域マーケットプレイス、Avitoのような掲示板(特定のカテゴリで)、OpenCartのオンラインストアは、しばしば深刻なアンチボットシステムを持っていません。ここでは、データセンターは適度な負荷(IPあたり最大200リクエスト)で安定して機能します。
シナリオ3:限られた予算と小規模なボリューム
1日あたり5,000〜10,000の商品を解析する必要があり、予算が限られている場合は、攻撃的なローテーションを伴うデータセンターを試してみてください(50〜100リクエストごとにIPを変更)。はい、ブロックが増えるでしょうが、再試行ロジック(新しいIPでのリクエストの再試行)を正しく設定すれば、これで機能します。
レジデンシャルプロキシが必要な場合
シナリオ1:WildberriesとOzonの解析
これらのプラットフォームはCloudflare、DataDome、独自のアンチボットシステムを使用しています。データセンターからは20〜50リクエスト後にCAPTCHAまたは禁止されます。5〜10分ごとにローテーションするレジデンシャルプロキシを使用すると、数十万の商品を問題なく解析できます。あるクライアントは、1,000のレジデンシャルIPのプールを使用して、1週間でWildberriesの全カタログ(2,000万以上の商品)を解析しました。
シナリオ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(サービス利用不可) — 問題はプロキシではなく、サイトの過負荷かもしれません。IPを変更せずに30〜60秒間の休止。
- 成功したリクエストが連続して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: ja-JP,ja;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はロシアのプラットフォームの場合「ja-JP」である必要があります。「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) — FirefoxとWebKitをサポートするPlaywright用の類似品です。
レベル3:CloudflareとDataDomeの回避
WildberriesはCloudflare Bot Managementを使用し、OzonはDataDomeを使用しています。これらのシステムは、IPやヘッダーだけでなく、行動も分析します:スクロール速度、マウスの動き、ページの読み込み時間。
Cloudflare Challengeの兆候: コンテンツの代わりに「ブラウザを確認中...」というページが5秒の遅延で表示されます。これはブラウザを確認するJavaScriptチャレンジです。
回避方法:
- FlareSolverr — Cloudflare Challengeを自動的に解決するプロキシサービスです。URLを送信すると、回避用のクッキーを返します。70〜80%の確率で機能します。
- Playwrightでの待機 — ヘッドレスブラウザでページを読み込み、10〜15秒待機(JSが実行されるまで)、クッキーを抽出して通常のHTTPリクエストで使用します。リソースを節約します:ブラウザはクッキーを取得するためだけに必要で、その後はrequestsを介して解析します。
- レジデンシャルプロキシ + ステルスブラウザ — この組み合わせは95%以上の成功率を提供します。Cloudflareはユーザーの実際のIPと正しいブラウザのフィンガープリンティングを確認します。
重要: Cloudflareは常に保護を更新しています。2024年12月に機能していたものが2025年3月には機能しない可能性があります。常にバックアッププランを持ってください:2Captcha/AntiCaptchaサービスを介した手動でのCAPTCHA解決や、マーケットプレイスのAPIへの切り替え(利用可能な場合)。
レベル4:ユーザーの行動を模倣する
高度なアンチボットシステムは行動パターンを追跡します。実際のユーザーはページをスクロールし、マウスを動かし、時々戻ります。ボットは完璧な2.000秒の間隔で商品カードを開きます。
模倣する方法:
- 遅延のランダム化 — 固定の3秒の代わりに、random.uniform(2.5, 5.0)を使用します。ユーザーの気を散らすように、稀に長い休止(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でパーサーを作成するためのフレームワークです。最も柔軟で高速なオプションで、1日あたり数百万の商品を解析できます。中程度のPythonの知識が必要です。
プロキシのサポート: ミドルウェアを介して。人気のあるソリューション:scrapy-rotating-proxies(リストからのローテーション)、scrapy-proxy-pool(プロバイダーのAPIとの統合)。設定には10〜15分かかります。
利点: 無料で、非常に高速(非同期リクエスト)、ロジックを完全に制御でき、大規模なコミュニティがあります。
欠点: コードを書く必要があり、JavaScriptサイトに関しては難しさがあり(SplashまたはPlaywrightとの統合が必要です)。
使用するタイミング: 1日あたり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というファイルを作成します(1行に1つ):
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;
}