2013-07-02 38 views
0

我有a url。当我尝试以编程方式访问它,后端服务器失败(我不运行服务器):为什么请求库在这个URL上失败?

import requests 
r = requests.get('http://www.courts.wa.gov/index.cfm?fa=controller.managefiles&filePath=Opinions&fileName=875146.pdf') 
r.status_code # 200 
print r.content 

当我看到的内容,这是一个错误页面,虽然状态代码为200。如果你点击链接,它会在你的浏览器中工作 - 你会得到一个PDF - 这正是我期望的r.content。所以它在我的浏览器中工作,但在请求中失败。

为了诊断,我试图消除我的浏览器和请求库之间的差异。到目前为止,我:

  • 禁用了JavaScript
  • 残疾人(或删除)饼干
  • 设置用户代理是在每个

相同的,但我不能得到的在请求中正常工作或由于禁用某些东西而导致浏览器失败。有人可以更好地了解浏览器魔法帮助我诊断并解决这个问题吗?

+0

可能是因为内容长度未指定? – Konklone

+0

不,我认为这是普遍可以接受的,虽然皱起了眉头。奇怪,但看到我的评论下面的更大的怪异。 – mlissner

回答

1

该请求是否可以在Chrome中使用?如果是这样,您可以打开Web检查器并右键单击该请求以将其复制为curl命令。然后,您将可以访问所有标题,参数和请求正文,您可以随时查看哪些内容触发了您在请求库中看到的失败。

+1

它在Chrome中工作,并且复制的cURL命令也可以正常工作。从那里开始,我一直玩到头一次,直到失败。如果您不提供用户代理,则会失败。不知道为什么我的其他代码之前没有工作,但现在可以重现,谢谢。我宣布谁管理这个服务器我新的克星。 – mlissner

+0

@Lukasa和我帮助维护请求的人已经先发制人地声明这些服务的所有管理员是我们的侄子。欢迎来到我们的世界。 ;) –

0

您可能会遇到基于User-Agent进行区分的服务器。此作品:

import requests 
S = requests.Session() 
S.headers.update({'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)'}) 
r = S.get('http://www.courts.wa.gov/index.cfm?fa=controller.managefiles&filePath=Opinions&fileName=875146.pdf') 

with open('dl.pdf', 'wb') as f: 
    f.write(r.content) 
+0

是的,就是这样。看看我对@ ryan的回答的评论。 – mlissner

相关问题