Header Ads

[Python][エラー対策]HTTP Error 503: Service Temporarily Unavailableの対策について

Pythonで、動的に、HTTPS通信を繰り返して、
スクレイピングを行っている際に、
「HTTP Error 503: Service Temporarily Unavailable」が
表示されるケースが存在した。

その際の対策についてメモしておく。


(サーバ状態について)

「HTTP Error 503」は、アクセス対象のサーバ側が、
「高負荷状態である」
「メンテ中である」
「許容転送量を超えた」などの状態の際に通知される。

スクレイピングの場合は、主に、
「高負荷」「許容転送量」が影響しており、
これ以上アクセスが続くと、
サーバダウン等の問題が発生する可能性があるため、
エラーを通知して、セッションを切断させることが多い。

また、不正アクセス対策から、
同一IPからの接続に対しての監視、制御が行われていることが多い。

(クライアント側スクリプトについて)

503エラーの原因について
今回作成していたスクリプトでは、
「女優」「声優」などの大きなカテゴリーにおいて、
クエリを発行し、DBアクセスのAPIを呼び出して、
該当カテゴリーに属するデータを全部取ってくるといった
自動スクリプトであった。

1回のクエリを発行する間隔は、
「time.sleep(秒)」で待ち合わせを行い、
「高負荷」「セッションタイムアウト」に対する対策を行っていた。

従って、考えられるエラー原因は、
「許容転送量」であると考えられる。

503エラーの対策について
「許容転送量」については、
サーバ毎に許容量が異なるため、
許容量を調査する必要がある。

今回の「HTTP Error 503: Service Temporarily Unavailable」場合は、
同一IPアドレスからの
・繰り返しアクセス回数「1500回」
・総データ転送量「100MB」
・1回あたりのデータ転送量「1MB未満」
・繰り返しアクセスした時間「1時間30分」
といった結果が個別ファイル出力によるタイムスタンプ、ファイルサイズより得られた。

1501回目のアクセスで
1回あたりのデータ転送量が「1MB」を超えた大きなデータが来ていたので、
これが、エラーのトリガとなった可能性が高いものと考えられる。

今回は、ファイル出力から、エラーのトリガとなる対象が確認できたため
「HTTP Error 503」が出た場合、一旦、アクセスを停止させ、
一定時間後、「HTTP Error 503が出た対象の次のクエリから再開させるといった
対策方法をとった。

単純例)
該当APIのコンテンツプロバイダURIに対して

try:
    ~
    
    flg = 0
    for uri in uriList:
        if "原因対象" in uri:
            flg = 1
    
    
        if flg == 1:
            クエリ発行
            file = open(result+'.txt', 'a', encoding='utf-8')
            ~
            file.write(result))
            file.close()
            time.sleep(1)
            
except Exception as e:
    print("[ERROR] ",e)

finally:
    print("End")
       
納品が関係するようなスクリプトでは、
対応としては、下の下で、論外あるが、
趣味レベルのスクリプトとして考えると、
フラグで回避してしまうのが簡単である。

原因対象を除いて、クエリが発行できるので、
原因対象のクエリを別途用意して、個別取得することを考えれば、
自動化プログラムとしての機能は満たせる。

「HTTP Error 503」の原因解析、対策案の1つとして、
参考になればと思う。

0 件のコメント