内容类型在某些请求的标头中为空

时间:2016-05-20 06:42:16

标签: python http get python-requests content-type

我之前用其他网址运行了数百万次(是,数百万次)查询。但是,在检查以下网页的内容类型时,我收到了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 个答案:

答案 0 :(得分:1)

并非所有服务器都设置Content-Type标头。如果缺少默认值,请使用.get()检索默认值:

if "text/html" in r.headers.get("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

但是如果你的响应中缺少标题,那么它通常不是Python的错误,当然也不是你的代码的错误。

可能是您遇到了错误的服务器或临时故障,或者您联系的服务器出于某种原因并不喜欢您。您的示例响应标头的内容长度也设置为0,例如,表示根本没有要提供的内容。

给您回复的服务器是BigIPload balancer / network router product from a company called F5。很难说究竟是什么类型(他们有全局路由服务器以及每个数据中心或群集负载平衡器)。可能是负载均衡器用尽了后端服务器来处理请求,没有服务器在您所在的区域,或者负载均衡器决定您发送的请求太多并且拒绝提供更多信息这个反应,或者它是月亮的错误阶段,木星正在逆行而且发脾气。我们无法知道!

但是,如果再次发生这种情况,请同时查看响应状态代码。它可能是4xx5xx状态代码,表示您的请求或服务器出现问题。例如,429状态代码响应表示您在很短的时间内发出了太多请求,并且应该减速。选中r.status_code进行测试。