WildberriesやOzonでパーサーを起動し、プロキシを設定したのに、1時間後には制限に達し、数千のカードを収集しただけで多くのIPが禁止されてしまったのですか?問題はほとんど常に同じです: URLパラメータ。フィルター、ソート、ページネーション、UTMパラメータは、1つのカタログを数万の技術的な重複に変え、パーサーはユニークなデータを収集する代わりに、それらすべてを誠実に回避します。
URLパラメータによるページの重複とは
ページの重複とは、技術的には他のURLと異なるが、内容は同じまたはほぼ同じであるURLのことです。典型的な例として、Wildberriesのドレスカタログは/catalog/zhenshchinam/odezhda/platyaでアクセス可能ですが、価格でソートされた同じ出力は/catalog/zhenshchinam/odezhda/platya?sort=priceに変わります。サイズ、ブランド、色、価格帯のフィルターを追加すると、出力には形式的にユニークなURLの各々が数百のパラメータの組み合わせになります。
生のユーザーにとっては便利です: フィルターを選択すると、必要な商品が表示されます。しかし、リンクをマスクで回避するか、ページネーションに従うパーサーにとっては、各組み合わせが読み込んで解析し保存すべき別々のページです。ルールを設定しないと、ロボットはフィルターの無限の渦に「落ち込む」ことになります: 価格でソート → ブランドでフィルター → サイズでフィルター → 再度ソート、今度は別の順序で。ユニークなURLの数は指数関数的に増加しますが、それらの中に有用なデータは増えません — それは同じ商品のカードですが、異なる順序または制限されたセットで表示されるだけです。
別のカテゴリーの重複には、UTMパラメータやセッションパラメータ(utm_source, clid, _openstat)があります。これらはページのコンテンツには全く影響しませんが、パーサーが他のページからリンクをそのまま収集する場合、同じ商品のカードを異なるアドレスの尾を持って何度も引っ張ることになります。
なぜこれはパーサーにとって重要なのか
SEO専門家にとって、ページの重複はインデックスの問題と重みのぼやけを意味します。マーケットプレイスをパーシングして価格を監視したり、品揃えを収集したりする人にとって、重複は直接的な金銭的損失と時間の浪費を意味し、しかも3つの方向で同時に発生します。
第一に、重複ページの各読み込みはプロキシを介したリクエストです。もし有料のローテーションプロキシを使用しているなら(WildberriesやOzonの保護を回避するためには必須です)、無駄なリクエストに対してもトラフィックを支払うことになります。数万のカードの規模では、重複に対する余分な30-40%のリクエストがコストを大幅に増加させます。
第二に、収集速度が大幅に低下します。もしあなたのパーサーが物理的に1秒間に10リクエストを処理できるとして、そのうちの3分の1が同じデータを持つページに送信される場合、ユニークなコンテンツの実際の収集速度は1秒あたり6-7カードに低下します。大きなカタログでは、これは1時間での収集と半日での収集の違いです。
第三に、これは最も痛ましいことですが、IPの禁止のリスクはリクエストの数に比例して増加します。マーケットプレイスのアンチボットシステムは、1つのアドレスからのリクエストの頻度を計算します。もしターゲットデータを収集するために必要なリクエストの3倍を行うと、プロキシの「信用枠」を3倍の速さで使い果たし、キャプチャやブロックに引っかかります。
実際の例: Wildberries, Ozon, Avito
Wildberriesでは、同じカタログが?sort=popular, ?sort=rate, ?sort=newlyのパラメータで提供され、さらにフィルターfbrand, fsize, priceUが加わります。パーサーが「カード → 類似商品 → 再度カード」のリンクを収集すると、これらのすべてのパラメータの組み合わせを持つURLを簡単に生成しますが、商品のセットは90%重複します。
Ozonでも同様の状況があり、?sorting=のパラメータと商品の特性に基づくフィルターがあります — 各カテゴリには独自のフィルターセット(素材、容量、色など)があるため、組み合わせはさらに増えます。
Avitoでは、地理的位置と検索半径のパラメータ(
条件付きの例で計算してみましょう。カテゴリに500のユニークな商品があると仮定しますが、8つのソートオプションと12の人気フィルターの組み合わせのため、URLの正規化なしでパーサーは500ではなく4000-5000ページを回避し、同じカードに再度アクセスします。もし1つのリクエストが居住者プロキシを介して1単位のトラフィックであるなら、単純な回避では、同じ量のユニークデータを取得するために必要な8-10倍のコストを消費します。
さらに悪いことに、同じIPからの類似URLへの再リクエストは、アンチボットシステムにとって典型的なパターンです。リクエストの頻度と均一性が高いほど、保護が迅速に作動します。結果として、閉じたループが形成されます: 重複がリクエストの数を増加させる → プロキシプールへの負荷が増加する → IPがより早く禁止される → プロキシを頻繁に変更し、収集を再起動する必要がある → 最終的なパーシングの時間とコストがさらに増加する。
実際には、セラーはWildberriesで200の競合の価格を1日1回監視したいが、URLがクリーンでないため、彼のスクリプトは2,000ではなく15,000のリクエストを行い、プロキシプールの制限に達し、朝ではなく夕方に不完全なデータを得ることになります。
収集をスケールアップする前に、ターゲットサイトのURL構造を分析するために1時間を費やす価値があります。以下は実践的な手順です:
正規化とは、URLを一貫したカノニカル形式に変換することです。その後、回避する必要があるかどうかを判断します。基本的な原則は、「重要な」パラメータ(例えば、ページネーションのページ番号やカテゴリ)を特定し、「重要でない」パラメータ(ソート、UTM、セッション識別子)を除外することです。
Wildberriesのようなカタログに対する正規化ルールの実践的な例:
正規化後、異なるソートを持つ同じリスティングのすべてのバリエーションが1つのURLに統合されます。プロキシを介してリクエストを送信する前に、パーサーはこの正規化されたアドレスが既に存在したかどうかを確認します — もしそうであれば、スキップします。これは、データの完全性を損なうことなくリクエストの数を減らす最も安価な方法です。
簡単なケースでは、このロジックをコードなしで実装することも可能です — パーシングツールの設定を通じて、「パラメータを無視する」を指定し、リストを列挙するか、URLのクエスチョンマークの後の尾を切り取るための正規表現を指定します。パラメータがあなたのタスクにとって重要な情報を持たない場合。
マーケットプレイスからデータを収集するためのほとんどの既製ソリューションやパーシングツールは、プロジェクト設定のレベルでURLパラメータの除外ルールをサポートしています。最初に確認し、設定するべきことは以下の通りです:
このように設定した後、リクエストの量は通常、ソースサイトのカタログが「パラメータ化」されている程度に応じて3-6倍削減されます。
URLの正規化が完璧であっても、WildberriesやOzonの大規模なカタログのパーシングには、多数のIPアドレス間でリクエストを分散させる必要があります — さもなければ、アンチボット保護がすぐに1つのソースからの異常なアクティビティを追跡します。ここでは、タスクに適したプロキシのタイプを正しく選択することが重要です。
商品カードの大規模な収集や価格の監視において、ボリュームと速度が重要で、合理的なコストであれば、通常はデータセンターのプロキシで十分です — 彼らは居住者のものよりも速く、安価で、1日に数百万のリクエストを処理する際には重要です。しかし、サイトの保護がデータセンターのIP範囲を積極的に禁止する場合は、居住者プロキシに切り替えるべきです。これらは実際のプロバイダーからの通常のユーザーのように見え、疑いを持たれることが少なくなります。
特定のタスク、例えば特定の地域でモバイルデバイスから特定の商品価格がどのように表示されるかを確認する場合には、モバイルプロキシが役立ちます。これらは携帯電話のオペレーターを介した接続をエミュレートし、ほとんどの場合、大規模にブロックされることはありません。
重要なのは、適切なプロキシの選択はURLの正規化を置き換えるものではなく、それを補完するものであるということです。重複をクリーンアップせずに、最も質の高いIPアドレスプールをより早く消費してしまうことになります。最初に無駄なリクエストの数を減らし、その後、残りをプロキシのローテーションでスケールアップする — この順序が最大のコスト削減をもたらします。
パーサーを本格的に起動する前に、短いチェックリストを確認してください:
フィルター、ソート、サービスパラメータは、マーケットプレイスのパーシング時に無駄なトラフィックの主要な源の1つであり、URLの正規化なしでは、パーサーは必要なデータを取得するために必要なリクエストの5-10倍を行う可能性があり、これはプロキシの予算、収集速度、ブロックのリスクに直接影響します。
解決策は簡単に見えますが、準備段階での規律が必要です: ターゲットサイトのURL構造を分析し、どのパラメータがコンテンツに影響を与えるか、どのパラメータが影響を与えないかを特定し、正規化されたアドレスによる重複排除を設定し、その後にプロキシのローテーションを通じて収集をスケールアップします。あなたのタスクがWildberries、Ozon、またはAvitoでの価格と品揃えの安定した監視であれば、最初に居住者プロキシを使用することをお勧めします — これはアンチボットシステムの信頼性と特定のタスクに対する柔軟性の最良のバランスを提供します。
?radius=, ?district=
重複がプロキシの予算と時間を消費する方法
パーサーを起動する前に重複を検出する方法
rel="canonical"を確認します — サイトはしばしば重複するバリエーションの「主要な」URLを示唆します。URLの正規化: ルールと例
import urllib.parse as up
IGNORED_PARAMS = {"sort", "utm_source", "utm_medium", "utm_campaign", "clid", "_openstat"}
def normalize_url(url: str) -> str:
parsed = up.urlparse(url)
query = up.parse_qsl(parsed.query)
# 重要なパラメータのみを残し、他は除外
filtered = [(k, v) for k, v in query if k not in IGNORED_PARAMS]
filtered.sort() # パラメータの順序を一貫した形式にする
new_query = up.urlencode(filtered)
return up.urlunparse(parsed._replace(query=new_query))
パーサーをパラメータを無視するように設定する
パーシングのスケーリングにおけるプロキシの役割
データ収集を開始する前のチェックリスト
チェック項目
必要な理由
ソートとフィルターのパラメータリストが特定されている
どのURLが重複と見なされるかを理解するため
URLの正規化ルールが設定されている
重複を1つのカノニカルアドレスに統合するため
正規化されたURLのハッシュによる重複排除が有効になっている
同じデータの再読み込みを除外するため
プロキシのタイプがボリュームと保護の攻撃性に合わせて選ばれている
禁止のリスクを減らし、収集を加速するため
IPごとのリクエスト制限が余裕を持って設定されている
プロキシプールの大量禁止を避けるため
結論