2017-02-25 16 views
0

これは私のプロジェクトのコードの一部です。ウェブページが異なるリクエストで異なるステータスコードを返します

URL="http://www.amazon.com", 
HTTPOpts = [{autoredirect, false}], 
case httpc:request(get, {URL, [{"User-Agent", "Mozilla"}]}, HTTPOpts, []) of 
{ok, {{_, Code, _}, Headers, Body}} when Code == 200 -> 

    %%code for process code=200 %% 

    {ok, {{_, Code, _}, Headers, _}} when Code < 310 , Code >= 300 -> 

    %% redirection 

    {ok, {{_, Code, _}, Headers, _}} when Code ==503 -> 

    %%service unavailable 

問題はhttpリクエストを実行すると、別のステータスコードが返されます。私はいつも私もwget "www.amazon.com"を使用して、それを試してみましたCode = 200

得るようURLの場合

私は私を行う方法の2つの応答、Code = 200Code = 503を得ている上に、これを処理する、それは同じ結果を与えます。 Code = 503の場合の再要求が、それはループに入ることとCode = 200を返さないか、クライアント要求の遅延をもたらす数回繰り返し、後に返す決してありこれに伴う問題:

私の考えを。

解決方法

答えて

2

私たちは、開発者として、私たちが話そうとしている第三者システムの反応を制御できません。あなたが提供した例では、アマゾンがあなたをボットやスクレーパーとして疑うため、意図的にアクセスを拒否しているようです。あなたはを得るたびにレスポンスボディを見ることでこれを証明できます。

開発者としてできることは、特定のシステムに接続するときに起こりうるすべての状況に適応することです。

HTTPの場合、5xxというエラーコードが発生した場合、通常はリクエストを再試行する必要があります。ループに巻き込まれないようにするには、指数バックオフを実装して、コードのリトライ回数を制限します。

HTTP 4xxエラーコードは、通常、リクエストに間違いがあることを示します。ここで再試行したくない場合は、リクエストに間違いがないかどうかを見てみましょう。

特定のケースでは、Amazonはあなたが自動化された訪問者だと思うので、通常のWebブラウザを模倣しようとします。 User-agentヘッダー、クッキーなどから始めてください。

関連する問題