目錄
問題背景
問題定位
問題解決
問題背景
使用Python的requests庫對接物聯數據的接口之前一直正常運行,昨天突然請求不通了,通過進一步驗證發現凡是使用代碼調用接口就不通,而使用postman就能調通,請求參數啥的都沒變。
接口返回的結果如下:
<!DOCTYPE html>\n<html>\n<head>\n<meta charset="utf-8">\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n<title>403</title>\n<style type="text/css">\nbody {\n ? ?background-color: #f3f3f4;\n ? ?color: #676a6c;\n ? ?height: 100%;\n ? ?font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";\n}\n\n.middle-box {\n ?max-width: 600px;\n ?z-index: 100;\n ?margin: 0 auto;\n ?padding-top: 40px;\n ?text-align: center;\n}\n\n.middle-box h1 {\n ?font-size: 170px;\n ?font-weight: 100;\n ?margin-top: 20px;\n ?margin-bottom: 10px;\n}\n\n.btn {\n ?border-radius: 3px;\n ?font-size: inherit;\n ?display: inline-block;\n ?width: 100px;\n ?height: 30px;\n ?line-height: 30px;\n ?background-color: #1ab394;\n ?border-color: #1ab394;\n ?color: #fff;\n ?cursor: pointer;\n ?font-size: 14px;\n}\n\n.btn:hover {\n ?background-color: #1c8570;\n}\n\n.btn:active {\n ?background-image: none;\n ?outline: 0;\n ?-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n ?box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n\n.buttons {\n ? ?margin-top: 30px;\n}\n\n</style>\n</head>\n<body>\n ? ?<div class="middle-box">\n ? ? ? ?<h1>403</h1>\n ? ? ? ?<h3 class="font-bold">Forbidden</h3>\n ? ? ? ?<div class="error-desc">?\x9b\xa0?\x9d\x83é\x99\x90é\x97?é¢\x98?\x88\x96è?\x8c??oé\x9d\x9e?3\x95??\x8c?\x82¨?\x9a\x84è??é\x97?è¢??\x8b\x92??\x9d?\x80\x82</div>\n ? ? ? ?<div class="buttons"><a class="btn btn-primary" οnclick="javascript:history.back()">è?\x94?\x9b\x9e</a></div>\n ? ?</div>\n</body>\n</html>
問題定位
初步斷定,在使用requests調用接口時少了點什么,而postman則有這個東西。
后來發現,postman在請求的時候自動加上了請求頭User-Agent,而代碼中headers中沒有配置這一項。
User-Agent請求頭是HTTP請求中的一個頭部字段,它包含了發起請求的應用程序的信息。這個字段通常用于告知服務器,發起請求的是哪種瀏覽器、設備、操作系統或者應用程序。服務器可以根據這個信息來決定是否允許該請求,或者根據不同的客戶端類型返回不同的內容。
User-Agent字符串通常包含了以下信息:
- 瀏覽器名稱和版本
- 操作系統名稱和版本
- 設備類型(如智能手機、平板電腦、桌面電腦)
- CPU類型
- 默認語言
問題解決
在代碼中加上自定義User-Agent請求頭即可:
import requestsurl = "……"
headers = {'Content-Type': 'application/x-www-form-urlencoded', 'User-Agent': "PostmanRuntime/7.39.0"}
req = requests.get(url=url, headers=headers)
同理,也可以將User-Agent請求頭設置為Chrome瀏覽器:
headers = { 'Content-Type': 'application/x-www-form-urlencoded',
'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
該請求頭告訴服務器,請求是由一個運行在Windows 10上的64位版本的Chrome 58瀏覽器發起的。