低いサクセスレートの原因を診断する方法:ステップバイステップガイド
サクセスレートは、試行の総数に対する成功したリクエストの割合です。このメトリクスが標準以下に低下すると、お金、時間、データが失われます。しかし、原因は数十種類あります。不正な設定からターゲットサーバーのブロックまで。この記事では、診断への体系的なアプローチを詳しく説明し、解決策を見つけます。
サクセスレートとは何か、標準値は何か
サクセスレート(SR)=(成功したリクエスト数 / リクエストの総数)× 100%
標準値はタスクの種類によって異なります:
| タスク | 標準的なSR | クリティカルレベル |
|---|---|---|
| 公開データのスクレイピング | 95~99% | 85%未満 |
| SMM自動化 | 90~97% | 80%未満 |
| 広告検証 | 98~99.5% | 95%未満 |
| API統合 | 99~99.9% | 98%未満 |
SRがベースラインから5~10%低下した場合、診断が必要です。20%以上低下した場合は、緊急の対応が必要です。
診断の最初のステップ
ステップ1:ログとメトリクスを確認する
過去24~72時間のデータを収集します:
- SRが正確にいつ低下したか(正確な時刻)
- リクエストの何パーセントがエラー407(プロキシ認証が必要)を返すか
- 何パーセントが429(リクエストが多すぎます)か
- 何パーセントがタイムアウト(接続タイムアウト)か
- 負荷(RPS - 1秒あたりのリクエスト数)が変わったか
ステップ2:分離してテストする
アプリケーションなしでプロキシをチェックするための簡単なスクリプトを使用します:
import requests
import time
proxy = "http://proxy_ip:port"
proxies = {"http": proxy, "https": proxy}
target_url = "https://httpbin.org/ip"
success = 0
failed = 0
for i in range(100):
try:
response = requests.get(
target_url,
proxies=proxies,
timeout=10,
verify=False
)
if response.status_code == 200:
success += 1
print(f"✓ 試行 {i+1}: 成功")
else:
failed += 1
print(f"✗ 試行 {i+1}: ステータス {response.status_code}")
except Exception as e:
failed += 1
print(f"✗ 試行 {i+1}: {str(e)}")
time.sleep(0.5)
sr = (success / (success + failed)) * 100
print(f"\nサクセスレート: {sr:.1f}%")
print(f"成功: {success}、エラー: {failed}")
このテストが標準的なSRを示す場合、問題はコードまたは設定にあります。SRがここでも低い場合、問題はプロキシまたはターゲットサーバーにあります。
プロキシ側の問題
エラー407:プロキシ認証が必要
原因:
- 不正な認証情報(ユーザー名/パスワード)
- アカウントの有効期限が切れている
- IPアドレスがホワイトリストにない(必要な場合)
- IP回転が機能していないか無効になっている
解決策:
import requests
# レジデンシャルプロキシの正しい形式
proxy = "http://login:password@proxy-host:port"
proxies = {"http": proxy, "https": proxy}
# テスト
response = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print(response.text)
プロキシサーバーの過負荷
すべてのサービスユーザーが同時に大量のリクエストを送信する場合、RPS(1秒あたりのリクエスト数)に制限がある可能性があります。これは稀ですが、起こります。
確認事項:
- ピーク時の現在のRPS
- 料金プランの制限
- ログに429エラーがあるか
解決策:リクエスト間に遅延を追加するか、料金プランをアップグレードします。
IPアドレスの品質
レジデンシャルプロキシの場合、低いSRはブロックされたアドレスが回転していることを意味する可能性があります。確認事項:
- IPアドレスの何パーセントが403 Forbiddenを返すか
- 同じアドレスが繰り返されるか
- パターンがあるか - 1つの国/地域は機能し、別の地域は機能しないか
ターゲットサーバーのブロックとフィルター
エラー429:リクエストが多すぎます
ターゲットサーバーは1つのIPまたは全体から多くのリクエストを見ています。解決策:
- 遅延を追加: `time.sleep(random.uniform(1, 3))`
- IP回転を使用: 各リクエスト - 新しいIP
- RPSを低下: リクエストを順序立てて送信し、並列ではなく
- 現実的なヘッダーを追加: User-Agent、Referer、Accept-Language
エラー403 Forbidden
サーバーがあなたのIP(またはプロキシのIP)をブロックしました。これは以下の可能性があります:
- 地理的位置によるフィルター
- プロキシサービスのブラックリスト
- ボット検出器(JavaScript、CAPTCHA)
解決策:モバイルプロキシまたはレジデンシャルプロキシを回転させて使用します。ブロックするのが難しいです。
エラー403:User-Agentチェック
一部のサービスは疑わしいUser-Agentでリクエストを拒否します:
import requests
import random
user_agents = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36",
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36",
"Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15"
]
headers = {
"User-Agent": random.choice(user_agents),
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml",
"Referer": "https://google.com"
}
response = requests.get(
"https://target-site.com",
headers=headers,
proxies={"http": proxy, "https": proxy},
timeout=10
)
print(response.status_code)
クライアントコードのエラー
不正な例外処理
一般的なエラー:コードは接続エラーを失敗したリクエストと見なしますが、再接続を試みません:
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# リトライ付きの正しい方法
session = requests.Session()
retry_strategy = Retry(
total=3,
backoff_factor=1,
status_forcelist=[429, 500, 502, 503, 504],
allowed_methods=["GET", "POST"]
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)
try:
response = session.get(url, proxies=proxies, timeout=10)
except requests.exceptions.RequestException as e:
print(f"エラー: {e}")
# ログして次のリクエストに進む
不正なタイムアウト
タイムアウトが短すぎる場合(1~2秒)、遅いプロキシは拒否されます:
- 通常のスクレイピング:10~30秒
- モバイルプロキシ:15~45秒
- API:5~10秒
SSL/TLSエラー
`verify=False`を使用する場合、実際の問題が隠れる可能性があります。証明書を更新する方が良いです:
import requests
import certifi
# 正しい方法
response = requests.get(
url,
proxies=proxies,
verify=certifi.where(), # verify=Falseの代わりに
timeout=15
)
ネットワークの問題とタイムアウト
接続タイムアウト対読み取りタイムアウト
違いは重要です:
- 接続タイムアウト:プロキシが応答しない(プロキシまたはネットワークの問題)
- 読み取りタイムアウト:ターゲットサーバーがデータをゆっくり送信(ターゲットサーバーの問題)
import requests
# timeout = (connection_timeout, read_timeout)
try:
response = requests.get(
url,
proxies=proxies,
timeout=(5, 15) # 接続に5秒、読み取りに15秒
)
except requests.exceptions.ConnectTimeout:
print("プロキシが応答しません")
except requests.exceptions.ReadTimeout:
print("ターゲットサーバーが遅い")
DNS問題
ターゲットサーバーが解決しない場合、これはプロキシエラーではありません:
import socket
# プロキシ外でDNSをチェック
try:
ip = socket.gethostbyname("target-site.com")
print(f"解決: {ip}")
except socket.gaierror:
print("DNSエラー - サイトが見つかりません")
低いSRの診断チェックリスト
- ベースラインを確立:以前の標準的なSRは何でしたか?
- 分離テストを実行(上記のスクリプト)100リクエスト
- ログを確認:どのHTTPコードが優位か?(407、429、403、タイムアウト?)
- 407の場合:ユーザー名/パスワードとIPホワイトリストを確認
- 429の場合:リクエスト間に遅延を追加し、IP回転を使用
- 403の場合:User-Agent、Refererを確認し、現実的なヘッダーを追加
- タイムアウトの場合:タイムアウトを増やし、RPSを確認し、リトライロジックを使用
- コードを確認:正しい例外処理、正しいタイムアウト
- ターゲットサーバーを確認:プロキスなしで直接アクセス可能か?
- 他のすべてが失敗した場合:別のタイプのプロキシまたは別のプロバイダーを試す
クイック診断テーブル
| HTTPコード | 考えられる原因 | 解決策 |
|---|---|---|
| 407 | 不正なプロキス認証情報 | ユーザー名/パスワード、IPホワイトリストを確認 |
| 429 | リクエストが多すぎる | 遅延を追加し、IP回転を使用 |
| 403 | IPがブロックされているか、ボット検出器 | 現実的なヘッダーを追加し、モバイルプロキシを使用 |
| タイムアウト | プロキスが遅いか、ターゲットサーバーが過負荷 | タイムアウトを増やし、RPSを確認 |
| 接続拒否 | プロキスサーバーにアクセスできない | IP:portを確認し、プロキシステータスを確認 |
まとめ
低いサクセスレートは症状であり、病気ではありません。原因は多くあります。コードの誤字からターゲットサーバーのブロックまで。体系的な診断が解決策の鍵です:
- メトリクスとログを確認
- 問題を分離(プロキシ対ターゲットサーバー対コード)
- エラーのタイプを決定(407、429、403、タイムアウト)
- 対応するソリューションを適用
信頼性と高いSRが必要なタスクの場合、IP回転を備えたレジデンシャルプロキシをお勧めします。検出が難しく、より安定しています。proxycove.comで無料テストを試し、タスクでテストしてください。