1. 各プロセスは、インターフェイスから IP リストをランダムに取得し、再利用します。失敗したら、API を呼び出して取得します。
一般的なロジックは次のとおりです。
(1) プロセスごとに、インターフェイスから IP の一部をランダムに取得し、IP ディレクトリを繰り返し試行してデータを取得します。
(2) アクセスに成功した場合は、引き続き次のものを取得します。
(3) 失敗した場合は、インターフェイスから IP のバッチを取得し、試行を続けます。
スキームの欠点: 各 IP には有効期限があります。100個抽出して20個目を使用すると、残りのほとんどが使用できなくなる可能性があります。HTTP リクエストの設定時に接続時間が 3 秒を超え、読み込み時間が 5 秒を超えると、3 ~ 8 秒かかる場合があり、3 ~ 8 秒の間に数百回クロールされる可能性があります。
2. 各プロセスは、使用するインターフェイスから IP をランダムに選択します。失敗した場合は、API を呼び出して IP を取得します。
一般的なロジックは次のとおりです。
(1) プロセスごとに、インターフェイスからランダムに IP を取得し、それを使用してリソースを参照し、
(2) アクセスに成功した場合は、引き続き次のものを取得します。
(3) 失敗した場合は、インターフェイスからランダムに IP を取得し、試行を続けます。
このソリューションの欠点: IP を取得するために API を呼び出す頻度が非常に高いため、プロキシサーバーに大きな負荷がかかり、API インターフェースの安定性に影響を与え、抽出が制限される可能性があります。このソリューションは適切ではなく、長時間安定して実行することはできません。
3. 最初に多数の IP を抽出してローカル データベースにインポートし、データベースから IP を抽出します。
一般的なロジックは次のとおりです。
(1) データベースにテーブルを作成し、インポート スクリプトを記述し、1 分間に必要な API の数 (アドバイスについては、プロキシ IP サービス プロバイダーに相談してください)、IP リストをデータベースにインポートします。
(2) インポート時刻、IP、ポート、有効期限、IP の可用性ステータス、およびその他のフィールドを記録します。
(3) データベースから使用可能な IP を読み取る取得スクリプトを作成し、各プロセスがデータベースから使用する IP を取得します。
クロールの実行、結果の判定、Cookieの処理など 、検証コードがあるか失敗する限り、IPをあきらめて、IPを再度変更します。
#! -*- encoding:utf-8 -*-
import requests
# 要访问的目标页面
targetUrl = "http://ip.hahado.cn/ip"
# 代理服务器
proxyHost = "ip.hahado.cn"
proxyPort = "39010"
# 代理隧道验证信息
proxyUser = "username"
proxyPass = "password"
proxyMeta = "http://%(user)s:%(pass)s@%(host)s:%(port)s" % {
"host" : proxyHost,
"port" : proxyPort,
"user" : proxyUser,
"pass" : proxyPass,
}
proxies = {
"http" : proxyMeta,
"https" : proxyMeta,
}
resp = requests.get(targetUrl, proxies=proxies)
print resp.status_code
print resp.text