PythonでプロキシをIPアドレスのローテーションに使用する方法

ウェブスクレイピングでIPローテーションにPythonのプロキシを使用する方法、信頼できるプロキシの見つけ方、ウェブサイトのブロックを回避するヒントを解説します。
2 分読
Python IP rotation

プロキシを使用したIPローテーションはウェブスクレイピングにおいて不可欠であり、特にアクセス制限を設けている可能性のある現代的なウェブサイトを扱う際に重要です。ブロックされたりレート制限を受けたりしないためには、複数のIPアドレスにリクエストを分散させることが重要です。IPアドレスをローテーションすることで、ウェブサイトがスクレイピング活動を追跡・制限することが難しくなります。これによりウェブスクレイピングの効率性と信頼性が向上し、より効果的にデータを抽出できます。ウェブスクレイピング中にプロキシとIPアドレスのローテーションを使用することで、IPベースのBANやペナルティを回避し、レート制限を突破し、地域制限コンテンツにアクセスできます。

本記事では、IPアドレスのローテーションのためにウェブスクレイピングワークフローにプロキシを実装する方法を解説します。効果的なプロキシの入手先、IPローテーションのヒント、そして対象ウェブサイトにブロックされないようにする方法についても説明します。

PythonによるIPローテーション

Pythonを使った一般的なスクレイピングプロセスでは、RequestsScrapyなどのPythonライブラリを使用してウェブサイトにアクセスし、コンテンツをパースします。その後、抽出したい情報のためにウェブサイトのコンテンツをフィルタリングできます。以下は典型的なスクレイピングプロセスの例です:


import requests

url = 'http://example.com'

# Make requests 
response = requests.get(url)
print(response.text)

このプロセスで必要な情報を取得でき、一度だけデータを抽出する単発利用やケースには適しています。ただし、システムのIPアドレスを使用してリクエストを行うため、ウェブサイトが時間の経過とともにアクセスを制限する繰り返しや継続的なリクエストで問題が発生する可能性があります。

スクレイピング例の結果は次のとおりです:

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", 
…

RequestsやScrapyなど、スクレイピングやウェブリクエスト向けのほとんどのPythonライブラリには、リクエストに使用するIPアドレスを切り替える手段があります。ただし、これを活用するには有効なIPアドレスのリストまたはソースが必要です。これらのソースは無料のものや、Bright Dataのプロキシなどの商用のものがあります。

商用オプションは有効性を保証し、スクレイピングプロセスのダウンタイムをなくすためにプロキシを管理・ローテーションする便利なツールを提供します。たとえば、Bright Dataにはユースケース、スケーラビリティ、リクエストデータへのブロックなしアクセスの保証に基づいて異なる価格設定の複数のカテゴリのプロキシがあります:

シームレスなデータスクレイピングのためのBright Dataのプロキシサービス

無料プロキシを使用して、スクレイピングプロセス全体でローテーションできる有効なプロキシを含むリストをPythonで作成できます:


proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]

これにより、複数のリクエストを行う際にリストから異なるIPアドレスを選択するローテーションメカニズムが必要になります。Pythonでは、以下の関数のようになります:

import random
import requests

def scraping_request(url):

   ip = random.randrange(0, len(proxies))
   
   ips = {"http": proxies[ip], "https": proxies[ip]}
   response = requests.get(url, proxies=ips)
   print(f"Proxy currently being used: {ips['https']}")
   return response.text

このコードは呼び出されるたびにリストからランダムなプロキシを選択します。プロキシはスクレイピングリクエストに使用されます。

無効なプロキシを処理するエラーケースを含めると、完全なスクレイピングコードは次のようになります:

import random
import requests

proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]
def scraping_request(url):

   ip = random.choice(proxies)
   try:
      response = requests.get(url, proxies={"http": ip, "https": ip})
      if response.status_code == 200:   
         print(f"Proxy currently being used: {ip}")
   ip = random.randrange(0, len(proxies))
   
   ips = {"http": proxies[ip], "https": proxies[ip]}
   response = requests.get(url, proxies=ips)
   try:

      if response.status_code == 200:   
         print(f"Proxy currently being used: {ips['https']}")
         print(response.text)   

      elif response.status_code == 403:
         print("Forbidden client")

      elif response.status_code == 429:
         print("Too many requests")
         
   except Exception as e:
      print(f"An unexpected error occurred: {e}")

                
scraping_request("http://example.com")

このローテーションプロキシリストを使用して、Scrapyなど他のスクレイピングフレームワークでリクエストを実行することもできます。

Scrapyを使ったスクレイピング

Scrapyでは、ウェブのクロールを成功させるために、ライブラリをインストールして必要なプロジェクトの構成要素を作成する必要があります。

Python対応環境でpipパッケージマネージャーを使用してScrapyをインストールできます:

pip install Scrapy

インストール後、以下のコマンドを使用して現在のディレクトリにテンプレートファイルを含むScrapyプロジェクトを生成できます:

scrapy startproject sampleproject

cd sampleproject

scrapy genspider samplebot example.com

これらのコマンドはIPローテーションメカニズムで肉付けできる基本的なコードファイルも生成します。

sampleproject/spiders/samplebot.pysamplebot.pyファイルを開き、以下のコードで更新します:


import scrapy
import random

proxies = ["103.155.217.1:41317", "47.91.56.120:8080", "103.141.143.102:41516", "167.114.96.13:9300", "103.83.232.122:80"]
ip = random.randrange(0, len(proxies))
   
class SampleSpider(scrapy.Spider):
    name = "samplebot"
    allowed_domains = ["example.com"]
    start_urls = ["https://example.com"]
    
    def start_requests(self):
        for url in self.start_urls:
            proxy = random.choice(proxies)
            yield scrapy.Request(url, meta={"proxy": f"http://{proxy}"})

    request = scrapy.Request(
        "http://www.example.com/index.html",
        meta={"proxy": f"http://{ip}"}
    )
    def parse(self, response):
        # Log the proxy being used in the request
        proxy_used = response.meta.get("proxy")
        self.logger.info(f"Proxy used: {proxy_used}") 
        print(response.text)

このスクレイピングスクリプトを実行するには、プロジェクトディレクトリのトップで以下のコマンドを実行します:

scrapy crawl samplebot
スクリプトの実行

IPローテーションのヒント

ウェブスクレイピングは、スクレイパーが必要なデータを取得するための新しい方法やテクニックを考案し、ウェブサイトがアクセスをブロックする新しい方法を見つけるという、ウェブサイトとスクレイパーの間の競争の形態へと進化しています。

IPローテーションはウェブサイトが設定した制限を回避することを目的とした技術です。IPローテーションの効果を最大化し、対象ウェブサイトにブロックされる可能性を最小限に抑えるために、以下のヒントを参考にしてください:

  • 大規模で多様なプロキシプールを確保する:IPローテーションを使用する際は、多数のプロキシと幅広い種類のIPアドレスを持つ大規模なプロキシプールが必要です。この多様性により適切なローテーションが実現し、レート制限やBANにつながるプロキシの過剰使用リスクが軽減されます。異なるIP範囲と場所を持つ複数のプロキシプロバイダーの使用を検討してください。また、自然なユーザー行動をより適切にシミュレートするために、異なるプロキシでのリクエストのタイミングと間隔を変えることも検討してください。
  • 堅牢なエラーハンドリングメカニズムを持つ:ウェブスクレイピングプロセス中に、一時的な接続の問題、ブロックされたプロキシ、または対象ウェブサイトの変更によるエラーが発生する場合があります。スクリプトにエラーハンドリングを実装することで、接続エラー、タイムアウト、HTTPステータスエラーなどの一般的な例外を捕捉・処理し、スクレイピングプロセスのスムーズな実行を確保できます。短期間に多数のエラーが発生した場合にスクレイピングプロセスを一時停止するサーキットブレーカーの設定も検討してください。
  • 使用前にプロキシをテストする:スクレイピングスクリプトを本番環境にデプロイする前に、プロキシプールのサンプルを使用して、さまざまなシナリオでIPローテーション機能とエラーハンドリングメカニズムをテストしてください。サンプルウェブサイトを使用して実際の状況をシミュレートし、スクリプトがこれらのケースを処理できることを確認できます。
  • プロキシのパフォーマンスと効率を監視する:プロキシのパフォーマンスを定期的に監視して、応答時間の遅さや頻繁な障害などの問題を検出してください。各プロキシの成功率を追跡して非効率なものを特定する必要があります。Bright Dataなどのプロキシプロバイダーは、プロキシの健全性とパフォーマンスを確認するためのツールを提供しています。プロキシのパフォーマンスを監視することで、より信頼性の高いプロキシに素早く切り替え、パフォーマンスの低いものをローテーションプールから削除できます。

ウェブスクレイピングは反復的なプロセスであり、ウェブサイトは構造やレスポンスパターンを変更したり、スクレイピングを防止する新しい対策を実装したりする場合があります。スクレイピングプロセスを定期的に監視し、変化に適応してスクレイピング活動の効果を維持してください。

まとめ

本記事では、IPローテーションとPythonを使ったスクレイピングプロセスへの実装方法を解説しました。また、Pythonを使ったスクレイピングプロセスの効果を維持するための実践的なヒントも学びました。

Bright Dataはウェブスクレイピングソリューションのオールインワンインフラです。高品質で倫理的なプロキシ、スクレイピングブラウザ、スクレイピングボット開発とプロセスのIDE、すぐに使えるデータセット、そしてスクレイピング中にプロキシをローテーション・管理するためのさまざまなツールを提供しています。