簡體   English   中英

python請求http響應500(可以在瀏覽器中訪問站點)

[英]python requests http response 500 (site can be reached in browser)

我試圖弄清楚我在這里做錯了什么,但我一直迷路......

在 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 庫類似的庫( urllib.request.urlopen 出現 500 錯誤),但是我無法適應它,我更想在這里使用請求。

我可能會在這里點擊一些缺少的代理設置,例如此處的建議( Perl File::Fetch Failed HTTP response: 500 Internal Server Error ),但是有人可以解釋一下,這個的正確解決方法是什么?

與瀏覽器請求不同的一件事是 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

編輯

一些 Web 應用程序還會檢查Origin和/或Referer標頭(例如 AJAX 請求); 您可以以與User-Agent類似的方式設置這些。

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

請記住,您設置這些標題基本上是為了繞過檢查,所以請做一個好網民,不要濫用人們的資源。

用戶代理以及其他標題元素可能會導致您的問題。

當我遇到這個錯誤時,我看到了瀏覽器使用 Wireshark 發出的常規請求,結果發現除了服務器預期存在的頭部中的 User-Agent 之外,還有其他東西。

在python請求中模擬瀏覽器發送的標頭后,服務器停止拋出錯誤。

但是等等! 還有更多!

上面的答案確實幫助我解決了問題,但我必須找到更多的東西添加到我的標題中,以便某些網站讓我使用 python 請求。 學習如何使用 Wireshark(以上建議)對我來說是一項很好的新技能,但我找到了一種更簡單的方法。

如果你去你的開發視圖(右鍵單擊然后點擊Chrome瀏覽器檢查),然后去網絡選項卡,然后選擇左邊的名稱之一,然后下尋找請求的標頭和擴展,你會得到一個您的系統發送到服務器的內容的完整列表。 我開始一次添加我認為最有可能需要的元素並進行測試,直到我的錯誤消失。 然后我將該集合減少到可行的最小集合。 在我的例子中,我的頭只有User-Agent來處理其他代碼問題,我只需要添加Accept-Language鍵來處理其他一些網站。 請參閱下圖作為上述文本的指南。

我希望這個過程可以幫助其他人找到盡可能消除不需要的 Python 請求返回碼的方法。

Chrome 中我的開發人員/檢查窗口的屏幕截圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM