2016-05-20 1 views
0

私はこのクエリを他のURLで何百万回も(はい、何百万回)実行しました。しかし、次のWebページのコンテンツタイプをチェックするときにKeyErrorが発生します。一部のリクエストのヘッダーでコンテンツタイプが空白になっています

コードスニペット:

r = requests.get("http://health.usnews.com/health-news/articles/2014/10/15/limiting-malpractice-claims-may-not-curb-costly-medical-tests", timeout=10, headers=headers) 
if "text/html" in r.headers["content-type"]: 

エラー:

KeyError: 'content-type' 

を私はr.headersの内容をチェックし、それはです:

CaseInsensitiveDict({'date': 'Fri, 20 May 2016 06:44:19 GMT', 'content-length': '0', 'connection': 'keep-alive', 'server': 'BigIP'}) 

これを引き起こしている可能性がありますか?

答えて

1

すべてのサーバーでContent-Typeヘッダーが設定されているわけではありません。ヘッダはあなた応答から欠落している場合は、それを

$ curl -s -D - -o /dev/null "http://health.usnews.com/health-news/articles/2014/10/15/limiting-malpractice-claims-may-not-curb-costly-medical-tests" 
HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
X-Powered-By: Brightspot 
Content-Type: text/html;charset=UTF-8 
Date: Fri, 20 May 2016 06:45:12 GMT 
Set-Cookie: JSESSIONID=A0C35776067AABCF9E029150C64D8D91; Path=/; HttpOnly 
Transfer-Encoding: chunked 

しかし:あなたは、私がこれを再現することはできません与えたURLについては

if "text/html" in r.headers.get("content-type", ''): 

を:それが欠落している場合は、デフォルトを取得するには.get()を使用して、通常はPythonの欠陥ではなく、確かにあなたのコードの欠陥ではありません。

バグの多いサーバーや一時的な不具合が発生した可能性があります。また、連絡したサーバーが何らかの理由であなたを気に入らない場合もあります。サンプルレスポンスヘッダーのコンテンツ長は0に設定されています(たとえば、配信するコンテンツがまったくないことを示しています)。

この応答を返すサーバーは、BigIPload balancer/network router product from a company called F5です。どのような種類のものか(グローバルルーティングサーバーとデータセンターまたはクラスタロードバランサがあります)ロードバランサが要求を処理するためにバックエンドサーバーを使い果たした、地域にサーバーを持たない、または負荷分散装置があまりにも多くの要求を送信すると判断し、この応答以上のものを与えることを拒否した可能性があります、またはそれは月の間違った段階であり、木星は逆行しており、それは怒鳴ります。私たちは知ることができません!

+0

おそらく、単一のIPからの要求の抑制が原因でしょうか? PS:あなたは素晴らしい人です。 – User

+1

@ユーザー:難しいと言えるかもしれません。 HTTPサーバーはブラックボックスであり、彼らは彼らがどのようにうまくいけばいいか応答することができます。私は、 'Server'ヘッダーも私たちと違うことに気付きました。 –

関連する問題