Python クローラー - IP 隠蔽テクノロジーとプロキシ クローリング

序文

クローラー プログラムを開発および実行する場合、ターゲット Web サイトのクローラー対策メカニズムに遭遇することがよくあります。最も一般的なのは IP ブロックです。この場合、IP 隠蔽テクノロジとプロキシ クロールを使用する必要があります。

 1.IP隠蔽技術

IP隠蔽技術とは、クローラから要求されたIPアドレスが対象のWebサイトにクローラとして認識されないようIPアドレスを偽装する技術です。IP 隠蔽テクノロジーにより、特定の IP アドレスに対するターゲット Web サイトの制限を効果的に回避できます。

1. ランダムなユーザーエージェント

ユーザー エージェントとは、クライアント プログラムが要求したときにサーバーに送信される文字列情報を指し、通常、現在のクライアントのソフトウェア バージョン、オペレーティング システム、言語環境、サービス プロバイダーなどの情報が含まれます。クローラーを開発する場合、使用するユーザーエージェントがブラウザーと異なる場合、サーバーにクローラーとして認識されやすく制限されてしまいます。

したがって、User-Agent 文字列をランダムに生成することで、クライアントを効果的に偽装して、サーバーが実際のユーザーがアクセスしていると認識させることができます。以下は、User-Agent をランダムに生成するサンプル コードです。

import random

def get_user_agent():
    user_agents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36",
        "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0",
        "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 Edge/15.15063",
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0",
        "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 OPR/39.0.2256.48"
    ]
    return random.choice(user_agents)
2.Headerヘッダー情報の設定

クローラーリクエストを行う場合、リクエストリクエストのヘッダー情報、特にリファラーとクッキー情報を設定する必要があります。Header ヘッダー情報を設定するときは、実際のユーザー リクエストに見せかけることにも注意する必要があります。

import requests

url = "http://www.example.com"

headers = {
    "User-Agent": get_user_agent(),
    "Referer": "http://www.example.com/",
    "Cookie": "xxx"
}

response = requests.get(url, headers=headers)
3. 動的 IP プロキシを使用する

動的 IP プロキシは、サーバーがクローラー プログラムの実際の IP アドレスを識別できないように、実際の IP アドレスを隠し、プロキシ サーバー経由でターゲット Web サイトをリクエストするのに役立ちます。

プロキシを使用するには、プロキシ プール、つまり複数の使用可能なプロキシ IP アドレスを準備する必要があります。プロキシ IP プロバイダーを通じて購入することも、無料で入手することもできます。

import requests

def get_proxy():
    return {
        "http": "http://username:password@proxy_address:port",
        "https": "https://username:password@proxy_address:port"
    }

url = "http://www.example.com"

response = requests.get(url, proxies=get_proxy())

2. エージェントのクロール

プロキシ クロールを実行するときは、次の問題に注意する必要があります。

  1. プロキシ IP アドレスを使用できる必要があります。使用できないと、クローラー プログラムの効率に影響します。
  2. プロキシ IP アドレスの数が十分である必要があります。そうでない場合、頻繁な切り替えによりサーバーによってブロックされます。
  3. プロキシ IP アドレスの品質が低いと、接続タイムアウトやネットワーク エラーが発生しやすいため、プロキシ IP アドレスの品質は優れている必要があります。
1.プロキシプールを使用する

プロキシ プールとは、使用可能な複数のプロキシ IP アドレスの集合を指します。プロキシ プールを通じて、使用可能なプロキシ IP アドレスが自動的に維持されるため、プロキシ IP アドレスを手動で追加および削除する必要がなくなります。プロキシ プールの実装については、次のサンプル コードを参照できます。

import random
import requests
import time

class ProxyPool:
    def __init__(self):
        self.pool = []
        self.index = 0

    def get_proxy(self):
        if len(self.pool) == 0:
            return None
        proxy = self.pool[self.index]
        self.index += 1
        if self.index == len(self.pool):
            self.index = 0
        return proxy

    def add_proxy(self, proxy):
        if proxy not in self.pool:
            self.pool.append(proxy)

    def remove_proxy(self, proxy):
        if proxy in self.pool:
            self.pool.remove(proxy)

    def check_proxy(self, proxy):
        try:
            response = requests.get("http://www.example.com", proxies=proxy, timeout=10)
            if response.status_code == 200:
                return True
            return False
        except:
            return False

    def update_pool(self):
        new_pool = []
        for proxy in self.pool:
            if self.check_proxy(proxy):
                new_pool.append(proxy)
        self.pool = new_pool

pool = ProxyPool()

# 添加代理IP地址
pool.add_proxy({"http": "http://username:password@proxy_address:port", "https": "http://username:password@proxy_address:port"})

# 更新代理池
while True:
    pool.update_pool()
    time.sleep(60)
 2. エージェントをランダムに切り替える

プロキシ クロールを実行するときは、同じ IP アドレスへの頻繁な接続が原因でサーバーによってブロックされないように、プロキシ IP アドレスをランダムに切り替える必要があります。ランダムなプロキシ切り替えは、次のサンプル コードを通じて実現できます。

import requests

def get_random_proxy():
    return {"http": "http://username:password@proxy_address:port", "https": "http://username:password@proxy_address:port"}

url = "http://www.example.com"

for i in range(10):
    proxy = get_random_proxy()
    response = requests.get(url, proxies=proxy)
3. 高品質のプロキシを使用する

プロキシ クローリングを実行する場合、品質の低いプロキシ IP アドレスを使用すると、接続タイムアウトやネットワーク エラーが発生しやすくなり、クローラ プログラムの動作効率に影響を与える可能性があります。したがって、高品質のプロキシ IP アドレスを選択することが非常に重要です。

プロキシ IP プロバイダーが提供するサービスを利用して、高品質のプロキシ IP アドレスを選択できます。同時に、プロキシ IP アドレスの可用性を定期的にテストして、無効なプロキシ IP アドレスを適時に排除することもできます。プロキシ IP アドレスの可用性をテストするサンプル コードを次に示します。

import requests

def check_proxy(proxy):
    try:
        response = requests.get("http://www.example.com", proxies=proxy, timeout=10)
        if response.status_code == 200:
            return True
        return False
    except:
        return False

proxy = {"http": "http://username:password@proxy_address:port", "https": "http://username:password@proxy_address:port"}

if check_proxy(proxy):
    print("代理IP地址可用")
else:
    print("代理IP地址不可用")

3. まとめ

Python クローラーを開発する場合、ターゲット Web サイトのクローラー対策メカニズムに遭遇することがよくありますが、最も一般的なのは IP ブロックです。この制限を回避するには、IP 隠蔽技術とプロキシ クローリングを使用できます。IP 隠蔽技術には、ランダムなユーザー エージェント、ヘッダー ヘッダー情報の設定、動的 IP プロキシの使用などの方法が含まれます。ただし、プロキシ クロールでは、プロキシ IP アドレスの可用性、量、品質に注意する必要があります。プロキシ プールを使用したり、プロキシをランダムに切り替えたり、プロキシをランダムに切り替えたりすることができます。高品質のプロキシを選択することは他の方法で実現されます。

おすすめ

転載: blog.csdn.net/wq10_12/article/details/132832491