コンテンツにスキップ

Webスクレイピングを成功させるためにプロキシをローテーションする方法

経験豊富な Web スクレイピングの専門家として、私はプロキシのブロックの問題に何度も遭遇してきました。大規模な Web スクレイピングを成功させるには、プロキシの適切なローテーションがいかに重要であるかを、どれだけ強調してもしすぎることはありません。

この包括的な 3000 語以上のガイドでは、ブロックを回避し、効率的にスクレイピングするための最適なプロキシ ローテーション戦略について詳しく説明します。

Web スクレイピングにプロキシ ローテーションが不可欠な理由

Web スクレイピングにプロキシが必要な理由を簡単にまとめてみましょう。

Web サイトをスクレイピングすると、短期間に何百、何千もの自動化されたリクエストがそのサーバーに送信されます。この非常に疑わしいトラフィック パターンは、ターゲット サイトによって簡単に検出されます。

スクレイパーを特定してブロックするために、ほとんどの Web サイトは次のような保護を採用しています。

  • IPレート制限 – IP が一定期間内に実行できるリクエストの数を制限します
  • キャプチャ – あなたが人間であることを証明するための挑戦を提示します
  • IPブロック – スクレーパーとして検出された場合、IP アドレスを禁止します

プロキシを使用しない場合、すべてのスクレイパー トラフィックは単一の住宅またはデータセンターの IP から発信されます。

IP がレート制限に達するか、完全にブロックされるまで、それほど時間はかかりません。

私の経験に基づくと、単一の IP からスクレイピングすると次のことが起こります。

  • 50 ~ 100 件のリクエスト、レート制限に達する可能性が高く、1 秒以上ごとに 10 リクエストまで速度を落とす必要があります。これにより、スクレイピング速度が大幅に低下します。

  • 200 ~ 500 件のリクエスト、ボットではないことを検証するためにキャプチャがトリガーされる可能性が高くなります。キャプチャを手動で解決すると、スクレイピング速度が低下します。

  • 500 ~ 1,000 件のリクエスト、IPが完全にブロックされる可能性があります。ゲームオーバー。

ご覧のとおり、プロキシを使用せずに意味のある数のページをスクレイピングすることは不可能です。

ここでプロキシ ローテーションが登場します。

プロキシのローテーションとは、スクレイパーのリクエストを分散することを意味します 複数の IP アドレスにわたる プロキシサーバーを使用します。これにより、次のことが可能になります。

  • スクレイピングのフラグが立てられやすい 1 つの IP からすべてのトラフィックが発信されることは避けてください。

  • ターゲット サイトのレート制限内に保ちながら、リクエストの数をスケールアップします。

  • 一部のプロキシがブロックされても、すぐに切り替えることでスクレイピングを続けます。

プロキシのローテーションがなぜ重要なのかを証明する実際の例を紹介しましょう。

最近、私は e コマース サイトから 50,000 件の商品リストを収集する仕事を依頼されました。プロキシを使用しない場合、次のようなことが起こります。

  • リクエストが 500 件を超えたあたりで、キャプチャを打つようになり、リクエスト間で 5 秒の遅延が発生しました。削る動作が恐ろしく遅くなりました。

  • 2000 件のリクエストで、私の IP はサイトによって完全にブロックされました。スクレイピングは停止しました。

ここで、5 つの住宅用プロキシのみをローテーションするように切り替えました。結果は次のとおりです。

  • 各プロキシは、キャプチャを避けるために速度を落とす必要があるまでに、約 500 件のリクエストを実行しました。

  • 新しい IP にローテーションし続けたため、プロキシはブロックされませんでした。

  • プロキシ間で負荷を分散することで、50,000 件のリストすべてをスクレイピングすることに成功しました。

この実際の例は、プロキシのローテーションが、数百ページのスクレイピングと数万ページのスクレイピングの違いをどのように意味するかを明確に示しています。

私の経験に基づくと、プロキシのローテーションは次のとおりです。 義務的な あらゆる本格的な Web スクレイピング操作に対応します。

次に、使用すべきスマートなプロキシ ローテーション戦略をいくつか見てみましょう。

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

スクレイピングのパフォーマンスを最適化できる、実証済みのプロキシ ローテーション パターンがいくつかあります。一般的なアプローチには次のようなものがあります。

ラウンドロビン

このメソッドは、プロキシ IP のリストを順番にループします。

たとえば、3 つのプロキシの場合:

Request 1 -> Proxy 1 
Request 2 -> Proxy 2
Request 3 -> Proxy 3
Request 4 -> Proxy 1
Request 5 -> Proxy 2

ラウンド ロビン ローテーションにより、リクエストがすべてのプロキシにほぼ均等に分散されます。同じプロキシを繰り返し再利用することを防ぎます。

主な欠点は、1 つのプロキシがブロックされると、ローテーションごとにそのプロキシが選択され続けることです。

私のテストによると、ラウンド ロビンは 5 ~ 10 個の正常なプロキシの中規模のプールで適切に機能します。

ランダムプロキシ

この戦略では、リクエストごとにプールから完全にランダムなプロキシが選択されます。

Request 1 -> Proxy 3
Request 2 -> Proxy 2
Request 3 -> Proxy 5
Request 4 -> Proxy 1
Request 5 -> Proxy 8 

ランダムなプロキシ選択により、プロキシがどのように使用されるかが完全に予測できなくなります。サイトは、ランダムなローテーションのパターンを検出するのが困難です。

リスクとしては、ランダム化により、同じプロキシが偶然に繰り返し選択される可能性があることが挙げられます。これを防ぐには、巧みなランダム化アルゴリズムが必要です。

ランダムなプロキシ ローテーションは、15 ~ 25 以上のプロキシの大きなプールで最も効果的に機能することがわかりました。

パフォーマンスベース

より高度な方法では、プロキシの成功/失敗率を追跡し、それに応じてプロキシを選択します。

たとえば、キャプチャやブロックに遭遇するプロキシはあまり使用されませんが、高パフォーマンスのプロキシはより多く使用されます。

これには、プロキシの障害を検出し、各プロキシの統計を保持するためのロジックが必要です。ただし、これにより「健全な」プロキシを最大限に使用できるようになります。

私の経験では、パフォーマンス ベースのローテーションは最良の結果をもたらしますが、実装するにはより多くのコーディング作業が必要です。

IPの一貫性

一部のサイトでは、ユーザー セッション内の IP の不一致を検出することによってスクレイパーをフィンガープリントします。

たとえば、単一ユーザー セッション中にサイトで異なる IP からのリクエストが表示された場合、それはスクレイピングの危険信号です。

IP 一貫性ローテーションにより、各プロキシが個々のユーザー セッションのすべてのトラフィックを確実に処理します。したがって、ターゲット サイトでは各ユーザーの一貫した IP が認識されます。

この手法は、ソーシャル メディアや e コマースなど、ユーザー セッションが厳しく監視されているサイトをスクレイピングする場合に役立ちます。

専門家のヒント

「一般的な落とし穴は、プロキシのローテーションが速すぎることです。リクエストごとに IP を切り替えるのは過剰なことがよくあります。私は通常、プロキシごとに 50 ~ 100 リクエストごとに徐々にローテーションします。これにより、疑わしいと思われるフットプリント パターンが回避されます。」

どのローテーション戦略を使用する場合でも、次のことが重要です。 あまり積極的にせず、徐々に回転させます。サイトでは、超頻繁な IP スイッチングがスクレイピング フットプリントとして検出される場合があります。

次に、プロキシのローテーションを最適化するための重要なヒントをいくつか見てみましょう。

プロキシをローテーションするためのベスト プラクティス

広範な試行錯誤を通じて、私はプロキシ ローテーションのベスト プラクティスをいくつか特定しました。

プロキシサブネットによるローテーション

多くのプロキシは、Luminati や Smartproxy などの大規模プロバイダーの同じサブネット範囲から来ています。

ランダムな偶然によってローテーションすると、プロキシが同じサブネットに属している場合、プロキシが順番に表示される可能性があります。

Request 1 -> 123.45.67.89 (Subnet A)
Request 2 -> 123.45.67.93 (Subnet A again!) 

同じサブネット範囲からの IP の繰り返しは、スクレイピングにとってはまったくの無駄です。

さまざまなプロキシ サブネットとプロバイダー間を積極的にローテーションするようにしてください。同じサブネットから 2 つのプロキシを連続して選択しないでください。

プロキシ タイプを適切に組み合わせて使用​​する

すべての卵を 1 つのカゴに入れないでください。以下のものを組み合わせて使用​​します。

  • データセンター – 最速の速度。スクレーパーを頻繁に使用するとブロックが発生する危険があります。
  • 住宅の – ゆっくりですが、より「人間的」に見えます。限られた可用性。
  • モバイル – モバイル ユーザーとして表示されます。多くのサイトはモバイルを完全にはサポートしていません。

プロキシ タイプの適切なバランスをとることで、1 つのプロキシ プールが過負荷になったりブロックされたりした場合でも、確実に対応できます。

失敗したプロキシを無効にする

堅牢なローテーションを行ったとしても、一部のプロキシではブロックやキャプチャで失敗することは避けられません。

エラーまたはブロックを返すプロキシを一時的に無効にします。これにより、ユーザーは「クールオフ」に変更され、ターゲット サイトでのステータスがリセットされます。

無効になったプロキシを定期的に再テストして、回復したかどうかを確認できます。

遅延を追加する

リクエスト間にランダムな遅延を挿入すると、スクレイピング トラフィックがより人間らしく見えるようになり、レート制限の乱用を回避できます。

私の典型的なアプローチは、1 ~ 3 リクエストごとに 5 ~ 10 秒のランダムな遅延を追加することです。

また、キャプチャ チャレンジなどのスロットルの兆候を検出し、遅延を動的に増やすこともできます。

国を交代する

国固有のサイトをターゲットにしている場合は、必ずその国に実際にあるプロキシを使用してください。

たとえば、英国のユーザーに焦点を当てたサイトをスクレイピングする場合、英国にある住宅プロキシとデータセンター プロキシをローテーションするようにしています。

地理ベースのローテーションは、リクエストを行うローカル ユーザーとして溶け込むのに役立ちます。

専門家のヒント

「私がお勧めする賢いトリックの 1 つは、プロキシのローテーションごとにユーザー エージェントをわずかに変更することです。これにより、ターゲット サイトがスクレイパーを簡単にプロファイリングして検出するのを防ぐ、さらに別の変数が追加されます。」

ユーザー エージェントの回転などの小さな調整を追加して創造力を発揮し、スクレーパーの指紋をさらにマスクします。

Python でのプロキシ ローテーションの実装

プロキシ ローテーション戦略について説明したので、サンプルの Python 実装を見てみましょう。

まず、利用可能なプロキシのリストを定義します。

proxies = [
  ‘104.45.147.53:8080‘,
  ‘45.15.62.230:8123‘, 
  ‘177.36.45.82:3128‘,
  # etc
]

次に、このリストを実際にローテーションするロジックが必要です。 Python を使用します random リクエストごとにランダムなプロキシを選択するライブラリ:

import random

def get_random_proxy():
  return random.choice(proxies)

同じプロキシを 2 回選択することを避けるために、以前に使用したプロキシを追跡し、新しいプロキシを取得するまで再ランダム化します。

last_proxy = None

def get_random_proxy():

  proxy = random.choice(proxies)  

  while proxy == last_proxy:
    proxy = random.choice(proxies)

  last_proxy = proxy

  return proxy 

これで、回転されたプロキシを requests モジュール:

import requests

# Rotate proxy
proxy = get_random_proxy() 

# Make request with rotated proxy  
requests.get(‘http://example.com‘, proxies={‘http‘: proxy, ‘https‘: proxy})

これにより、わずか数行で基本的なプロキシ ローテーションのセットアップが完了します。

次に、いくつかのベスト プラクティスを組み込んだ、より高度なプロキシ ローテーターを見てみましょう。

import random
from time import sleep

# Proxy list
proxies = [
  {‘ip‘: ‘104.45.147.53:8080‘, ‘country‘: ‘US‘, ‘subnet‘: ‘147‘},
  {‘ip‘: ‘45.15.62.230:8123‘, ‘country‘: ‘CA‘, ‘subnet‘: ‘62‘},
  # etc
]

# Tracking variables
last_proxy = None
last_subnet = None
disabled_proxies = [] 

def get_proxy():

  # Remove disabled proxies
  global proxies 
  proxies = [p for p in proxies if p[‘ip‘] not in disabled_proxies]

  # Weight random selection 
  proxy_weights = []
  for proxy in proxies:
    if proxy[‘country‘] == ‘US‘:
      # Prefer US proxies
      weight = 100 
    else:
      # Lower weight for non-US
      weight = 50

    if proxy[‘subnet‘] == last_subnet:
      # Lower weight if same subnet
      weight -= 20

    # Apply weight    
    proxy_weights.extend([proxy]*weight)

  # Pick weighted random proxy
  proxy = random.choice(proxy_weights) 

  # Avoid immediate subnet repeat
  while proxy[‘subnet‘] == last_subnet:
    proxy = random.choice(proxy_weights)

  # Rotate subnet 
  last_subnet = proxy[‘subnet‘]

  # Optional delay
  sleep(1)

  return proxy[‘ip‘]

# Usage:

proxy = get_proxy()
try:
  response = requests.get(‘http://example.com‘, proxies={‘http‘: proxy, ‘https‘: proxy})
  # Success - do nothing
except:
  # Failure - disable proxy
  disabled_proxies.append(proxy) 

これにより、以下を備えたより堅牢な回転子が得られます。

  • プロキシの重み付け
  • 失敗したプロキシの削除
  • サブネットのローテーション
  • リクエスト間の遅延

プロキシ マネージャー API との統合など、パフォーマンスをさらに向上させるための最適化は他にも数多くあります。

ローテーションのためのプロキシ API の活用

プロキシのローテーションを自分で管理すると、時間がかかる場合があります。プロキシ API はプロキシ管理を抽象化し、統合をシームレスにします。

チェックすべきいくつかの注目すべきプロキシ API:

ルミナティ – 72 万を超える IP を備えた最大の有料プロキシ ネットワーク。非常に大規模なスクレイピング操作に最適です。最低料金は月額約 500 ドルです。

オキシラブ – 住宅、データセンター、モバイルのタイプ全体で 3 万のプロキシを提供します。価格は 300 万リクエストの場合、月額 1 ドルから始まります。

スマートプロキシ – 40 万の IP を備えたバックコネクト レジデンシャル プロキシを専門としています。プランは 75 GB のトラフィックで月額 5 ドルから始まります。

ジオサーフ – 50 か国以上のプロキシを使用したニッチなターゲティングに最適です。住宅プランは月額 290 ドルから始まります。

マイクロリーブ – 予算住宅用プロキシ API は、85 万リクエストに対して月額 1 ドルから。

スクレイプオプス – ローテーションと CAPTCHA 解決機能が組み込まれたインテリジェントなプロキシ API。プランは 299 万件のリクエストに対して月額 1 ドルから始まります。

API の主な利点は、統合が簡素化され、時間のかかるセットアップを行わずに即座にプロキシを取得できることです。ほとんどのハンドルは内部でプロキシの使用を最適化します。

たとえば、ScrapeOps プロキシ API を使用してサイトをスクレイピングするスクリプトは次のとおりです。

import scrapeops

api = scrapeops.API()

for page in range(1, 100):
   url = f‘http://site.com/page/{page}‘
   html = api.get_html(url)
   # Parse html

API はすべてのプロキシ管理を抽象化し、あらゆるページからクリーンな HTML を提供します。

大規模なスクレイピング プロジェクトの場合、専用のプロキシ API を利用すると、プロキシを自分で処理する場合に比べて、開発時間を大幅に節約できます。

最終的な考え

プロキシは、本格的な Web スクレイピング操作には必須です。簡単に言えば、プロキシもスクレイピングもありません。

必ず複数のプロキシを使用し、ラウンドロビン、パフォーマンス重視、ランダムなどの確実なローテーション戦略を実装してください。

サブネットのローテーション、失敗したプロキシの無効化、遅延の追加、プロキシ タイプの混合などのベスト プラクティスに従ってください。

プロキシを注意深くローテーションすることで、IP ブロックやキャプチャを気にせずに大規模にスクレイピングできるようになります。

このガイドが、Web スクレイピング プロジェクトでプロキシをローテーションするための最適なテクニックの包括的な概要を提供することを願っています。他にプロキシ ローテーションのヒントがあれば教えてください。

タグ:

参加する

あなたのメールアドレスは公開されません。 必須フィールドは、マークされています *