为何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
相关产品推荐
相关产品推荐

