web-dev-qa-db-ja.com

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ライブラリ( rllib.request.urlopenで500エラー )で同様のものを見つけましたが、それを適応させることができません。さらに、ここでリクエストを使用したいと思います。

ここで例として提案されているように、欠落しているプロキシ設定をここで打つ可能性があります( Perl File :: Fetch Failed HTTP response:500 Internal Server Error )が、誰かが私に説明できますか?これです?

9
Kube Kubow

ブラウザリクエストと異なるのは、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
9
Ionut Ticus

User-Agentおよびその他のヘッダー要素が問題の原因である可能性があります。

私がこのエラーに遭遇したとき、私はWiresharkを使用してブラウザーから行われる通常のリクエストを監視しましたが、サーバーにあるはずのヘッダーにUser-Agent以外のものがあることがわかりました。

pythonリクエストでブラウザから送信されたヘッダーをエミュレートした後、サーバーはエラーのスローを停止しました。

1

ちょっと待って!さらにあります!

上記の回答は解決への道筋に役立ちましたが、特定のサイトがpythonリクエストを使用できるようにするために、ヘッダーに追加するさらに多くのものを見つける必要がありました。使用方法の学習Wireshark(上記で推奨)は私にとって新しいスキルとしては優れていましたが、もっと簡単な方法を見つけました。

開発者ビューに移動する場合(右クリックしてChromeでInspectをクリック)、次にNetworkに移動しますタブをクリックし、左側のNamesの1つを選択して、HeadersforRequests Headersおよび展開すると、システムが送信しているものの完全なリストが表示されますサーバ。最も必要と思われる要素を1つずつ追加し、エラーがなくなるまでテストを開始しました。次に、そのセットを、機能する最小のセットに減らしました。私の場合、他のコードの問題に対処するためにヘッダーにUser-Agentのみが含まれているため、Accept-Languageキーを使用して、他のいくつかのサイトを処理します。上のテキストのガイドとして下の図を参照してください。

このプロセスが、望ましくないpythonリクエストの戻りコードを可能な限り排除する方法を見つけるのに役立つことを願っています。

Screen Shot of my Developer/Inspect Window in Chrome

0
Thom Ives