Python Requests请求返回200但提示页面未找到问题求助
问题排查与解决方案
我帮你梳理下问题所在,你的Python请求和Chrome抓包的内容有两处关键差异,这大概率就是服务器返回<H1>globalsettings-index.xml Not Found</H1>的原因:
1. menu参数的引号缺失
Chrome抓包中的menu参数值是带双引号的"DNS"(URL编码后显示为%22DNS%22),但你的Python脚本里直接写的是"DNS",实际发送给服务器的是不带引号的DNS。很多后台系统会严格校验参数格式,这个引号的差异会导致服务器无法匹配到正确的页面资源。
2. 请求头可能不完整
对比Chrome的请求头,你的脚本里的header如果没有包含所有必要字段(比如X-Requested-With、Referer),服务器可能会拒绝返回正确内容——它会校验请求是否来自合法的前端页面。
修改后的Python脚本示例
import requests import time # 补全完整请求头,和抓包内容保持一致 header = { "Accept": "*/*", "Accept-Encoding": "gzip, deflate", "Accept-Language": "zh-CN,zh;q=0.9", "Connection": "keep-alive", "Host": "172.28.0.254", "Referer": "http://172.28.0.254/esi/912100/esi.cgi?page=index.xml&sessionID=1530588493", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.81 Safari/537.36", "X-Requested-With": "XMLHttpRequest" } def revise_Dns(id, shareid): url1 = "http://172.28.0.254/esi/912100/esi.cgi" payload = { "page": "globalsettings-index.xml", "userIdent": id, "menu": "\"DNS\"", # 加上双引号,和抓包的参数值完全一致 "replace": "inline", "SharedTmpSid": shareid, "cacheAvoider": str(int(round(time.time() * 1000))) } g = requests.get(url1, params=payload, headers=header) print(g.status_code) print(g.text) # 调用时传入有效的id和shareid # revise_Dns(id, shareid)
额外调试建议
如果修改后还是有问题,可以开启requests的调试日志,查看实际发送的请求细节,和Chrome抓包对比找出其他差异:
import logging import http.client # 开启调试日志,查看完整请求过程 http.client.HTTPConnection.debuglevel = 1 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True
运行脚本后,你就能看到完整的请求URL、头信息和参数,和抓包内容逐一比对即可定位剩余问题。
内容的提问来源于stack exchange,提问作者K.Vincent
相关产品推荐
相关产品推荐

