python请求http响应500(可以在浏览器中访问站点)

新手上路,请多包涵

我想弄清楚我在这里做错了什么,但我一直迷路……

在 python 2.7 中,我正在运行以下代码:

 >>> import requests
>>> req = requests.request('GET', 'https://www.zomato.com/praha/caf%C3%A9-a-restaurant-z%C3%A1ti%C5%A1%C3%AD-kunratice-praha-4/daily-menu')
>>> req.content
'<html><body><h1>500 Server Error</h1>\nAn internal server error occured.\n</body></html>\n'

如果我在浏览器中打开这个,它会正确响应。我正在四处挖掘,发现与 urllib 库类似的库( 500 error with urllib.request.urlopen ),但是我无法适应它,我更想在这里使用请求。

我可能会在这里遇到一些丢失的代理设置,例如这里所建议的( Perl File::Fetch Failed HTTP response: 500 Internal Server Error ),但是有人可以向我解释一下,这个的正确解决方法是什么?

原文由 Kube Kubow 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

与浏览器请求不同的一件事是用户代理;但是你可以使用这样的请求来改变它:

 url = 'https://www.zomato.com/praha/caf%C3%A9-a-restaurant-z%C3%A1ti%C5%A1%C3%AD-kunratice-praha-4/daily-menu'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36'}
response = requests.get(url, headers=headers)
print(response.status_code) #should be 200

编辑

某些 Web 应用程序还将检查 Origin 和/或 Referer 标头(例如 AJAX 请求);您可以以类似于 User-Agent 的方式设置它们。

 headers = {
    'Origin': 'http://example.com',
    'Referer': 'http://example.com/some_page'
}

请记住,您将这些标头设置为基本上绕过检查,所以请做一个好网民,不要滥用别人的资源。

原文由 Ionut Ticus 发布,翻译遵循 CC BY-SA 4.0 许可协议

可是等等!还有更多!

上面的答案确实帮助我解决问题,但我必须找到更多的东西来添加到我的标题中,以便某些站点允许我使用 python 请求。学习如何使用 Wireshark(上面建议的)对我来说是一项很好的新技能,但我找到了一种更简单的方法。

如果您转到您的开发人员视图(右键单击然后单击“在 Chrome 中 检查”),然后转到“ 网络”选项卡,然后选择左侧的 名称 之一,然后在“ 请求标头”下查看“标头 并展开,您将得到一个您的系统发送到服务器的完整列表。我开始一次添加我认为最有可能需要的元素并进行测试,直到我的错误消失。然后我将该集合减少到可行的最小集合。在我的例子中,我的标头只有 User-Agent 来处理其他代码问题,我只需要添加 Accept-Language 键来处理其他几个站点。请参阅下图作为上面文字的指南。

我希望这个过程能帮助其他人找到尽可能消除不需要的 python 请求返回代码的方法。

我在 Chrome 中的开发/检查窗口的屏幕截图

原文由 Thom Ives 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题