使用Python Requests请求INMET接口出现404错误求助
解决INMET请求302跳转后404的问题
看起来你遇到的是典型的「浏览器能正常访问,但爬虫代码触发404」的问题——从日志能看到,你的GET请求先返回200,紧接着触发302重定向到/sonabra/log2/index.php,但这个路径直接返回404。这种情况大概率是网站更新了验证逻辑,你的代码缺少必要的请求头或会话状态,被网站判定为非合法请求了。
给你几个具体的排查和修复方案:
1. 补全请求头,模拟真实浏览器行为
requests.Session()默认的请求头非常极简,很多网站会通过User-Agent、Referer这些字段判断请求是否来自真实浏览器。你可以复制自己浏览器的请求头(F12打开开发者工具,在Network面板里找对应请求的Request Headers),加到会话里:
session = requests.Session() # 替换成你浏览器实际的请求头,这里是Chrome的示例 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3", "Referer": "http://www.inmet.gov.br/", "Upgrade-Insecure-Requests": "1" }) # 先访问INMET首页,初始化会话Cookie session.get("http://www.inmet.gov.br/", timeout=5) # 再发起目标GET请求 GET = session.get("http://www.inmet.gov.br/sonabra/pg_dspDadosCodigo_sim.php?QTgwNA==", timeout=1) GET.raise_for_status() # 后续解析和POST代码不变
2. 关闭自动重定向,手动排查跳转逻辑
requests默认会自动跟随重定向,但有时候网站的重定向需要特定的前置状态。你可以关闭自动重定向,看看跳转目标是否合理:
GET = session.get( "http://www.inmet.gov.br/sonabra/pg_dspDadosCodigo_sim.php?QTgwNA==", timeout=1, allow_redirects=False ) # 打印重定向目标 print("重定向目标:", GET.headers.get("Location")) # 如果跳转的是登录页或验证页,说明需要先完成验证流程
3. 同步浏览器的Cookie到会话
浏览器访问时会保留网站设置的Cookie,你的代码会话可能缺少关键Cookie导致被拦截。你可以在浏览器中打开目标URL,复制开发者工具里的Cookie,手动加到会话中:
# 替换成浏览器里实际的Cookie键值对 session.cookies.set("INMET_SESSION", "your_browser_cookie_value") session.cookies.set("another_cookie", "another_value")
4. 检查网站是否更新了验证机制
从日志的404路径来看,网站可能更新了验证页面的路径,或者新增了反爬措施(比如JS渲染的验证码、会话验证)。你可以:
- 在浏览器中一步步操作目标页面,看是否需要登录、滑块验证或其他步骤
- 对比浏览器和代码的网络请求差异(比如请求参数、方法、头信息)
另外,建议你去INMET官网看看有没有开放的公共数据API——官方接口比爬取页面更稳定,也不会轻易被反爬拦截。
内容的提问来源于stack exchange,提问作者RomuloPBenedetti
相关产品推荐
相关产品推荐

