序文
クローラー プログラムを開発および実行する場合、ターゲット 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. エージェントのクロール
プロキシ クロールを実行するときは、次の問題に注意する必要があります。
- プロキシ IP アドレスを使用できる必要があります。使用できないと、クローラー プログラムの効率に影響します。
- プロキシ IP アドレスの数が十分である必要があります。そうでない場合、頻繁な切り替えによりサーバーによってブロックされます。
- プロキシ 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 アドレスの可用性、量、品質に注意する必要があります。プロキシ プールを使用したり、プロキシをランダムに切り替えたり、プロキシをランダムに切り替えたりすることができます。高品質のプロキシを選択することは他の方法で実現されます。