我想知道我在这里做错了什么,但我一直迷路......
在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),但有人可以解释一下,这个的正确解决方法是什么?
答案 0 :(得分:7)
与浏览器请求不同的一件事是User-Agent;但是你可以使用这样的请求改变它:
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
答案 1 :(得分:2)
以上答案确实帮助我解决了问题,但是我不得不寻找更多东西添加到标题中,以便某些站点允许我使用python请求。学习如何使用Wireshark(上文建议)对我来说是一项很好的新技能,但是我找到了一种更简单的方法。
如果进入开发人员视图(右键单击,然后在Chrome中单击检查),然后转到网络标签,然后选择名称,然后在 Headers 下查找 Requests Headers ,然后展开,您将获得系统发送到服务器的完整列表。我开始添加我认为最有可能一次需要添加的元素,并进行测试直到错误消失。然后,我将该集合缩小为可行的最小集合。就我而言,标头仅具有 User-Agent 来处理其他代码问题,因此我只需要添加 Accept-Language 键即可处理其他一些站点。请参阅下面的图片,作为上面文本的指南。
我希望这个过程可以帮助其他人找到消除可能的python请求返回代码的方法。
答案 2 :(得分:1)
User-Agent以及其他标题元素可能会导致您的问题。
当我遇到这个错误时,我看到了浏览器使用Wireshark发出的常规请求,结果发现除了服务器期望在那里的标题中的User-Agent之外还有其他东西。
在python请求中模拟浏览器发送的标头后,服务器停止抛出错误。