You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python爬虫手动可访问URL却返回HTTP 404响应码?

爬虫二次请求返回404的排查与解决方案

1. 对齐请求头参数

浏览器访问时会携带完整的标识头信息,脚本第二次请求可能缺失关键字段导致服务器识别异常。

  • 对比第一次成功请求与第二次失败请求的请求头,重点核对User-Agent、Referer、Cookie这类字段
  • 直接复用浏览器的请求头到脚本中,示例代码:
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Referer': '你的初始请求URL'
}

2. 修正URL读取格式

从crawl.txt读取URL时,可能混入换行符、空格等无效字符,导致请求地址错误。

  • 读取后立即做格式化处理:
with open('crawl.txt', 'r') as f:
    target_url = f.readline().strip()  # 去除首尾空白与换行符
  • 打印读取后的URL,确认和手动输入的完全一致:print(f"当前请求地址: {target_url}")

3. 保持会话一致性

第一次请求可能触发服务器设置Cookie,第二次用新会话请求会被拒绝。

  • 使用requests.Session()维持会话,所有请求复用同一个会话对象:
# 脚本初始化时创建会话
session = requests.Session()

# get_html函数中替换请求方式
response = session.get(target_url, headers=headers)

4. 添加请求延迟

服务器可能对请求频率做了限制,第二次请求触发限流后返回404(部分服务器用404伪装限流)。

  • 在两次请求周期中加入延迟:
import time
time.sleep(2)  # 每次请求后暂停2秒,可根据实际调整

5. 校验实际请求地址

确认脚本请求的URL是否和手动访问的完全一致,比如是否遗漏协议、路径斜杠,或被错误拼接。

  • 打印实际请求的URL与响应状态:
response = session.get(target_url, headers=headers, allow_redirects=True)
print(f"服务器实际接收URL: {response.url}")
print(f"响应状态码: {response.status_code}")

内容的提问来源于stack exchange,提问作者dvines

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 13:11:15