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

Python Selenium获取HTTP状态码异常:页面404仍返回200如何解决?

解决Python获取HTTP状态码始终为200的问题

你的问题核心在于两次请求的环境不一致,以及部分网站的自定义404页面设计导致状态码不符合预期,下面给你详细分析和解决办法:

为什么会出现这种情况?

  1. 请求环境差异:你用self.driver.get(link)让浏览器加载页面,又用urlopen(link)发起了一个全新的请求——这两个请求的请求头、Cookie等完全不同(浏览器会自动带上很多标识,而urllib的默认请求非常简洁),服务器对这两个请求的响应可能不一样。
  2. 自定义404页面:很多网站不会直接返回404状态码,而是返回200状态码,再在页面内容里展示404的提示信息,这种情况下无论你怎么请求,状态码都是200,需要通过页面内容判断是否是404。

解决方案

方案1:通过Selenium获取浏览器实际收到的状态码(最准确)

Selenium本身没有直接提供获取HTTP状态码的API,但可以通过Chrome DevTools Protocol(CDP)捕获浏览器的网络请求日志,拿到真实的状态码:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import json

# 初始化Chrome浏览器(可根据需要调整配置)
chrome_options = Options()
chrome_options.add_argument('--headless=new')  # 可选,无头模式不显示浏览器窗口
driver = webdriver.Chrome(options=chrome_options)

link = "你的目标链接"
driver.get(link)

# 遍历性能日志,找到目标请求的状态码
logs = driver.get_log('performance')
for log in logs:
    message_data = json.loads(log['message'])['message']
    # 捕获网络响应完成的事件
    if message_data['method'] == 'Network.responseReceived':
        response_info = message_data['params']['response']
        # 匹配目标链接的响应
        if response_info['url'] == link:
            status_code = response_info['status']
            print(f'HTTP状态码: {status_code}')
            break

driver.quit()

方案2:让urllib模拟浏览器请求

如果你坚持用urllib,需要模拟浏览器的请求头(比如User-Agent),让请求更接近真实用户的访问,同时处理urllib的HTTP错误异常:

from urllib.request import Request, urlopen
from urllib.error import HTTPError

link = "你的目标链接"
# 从浏览器开发者工具复制真实的User-Agent(可根据你的浏览器调整)
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'
}

try:
    req = Request(link, headers=headers)
    response = urlopen(req)
    code = response.getcode()
    print(f'HTTP状态码: {code}')
except HTTPError as e:
    # 捕获4xx、5xx等错误状态码
    print(f'HTTP状态码: {e.code}')
except Exception as e:
    print(f'请求出错: {str(e)}')

方案3:处理自定义404页面的情况

如果网站返回200但实际是404页面,你需要结合页面内容判断:

# 用Selenium获取页面内容后判断
driver.get(link)
page_source = driver.page_source
if "404" in page_source or "页面不存在" in page_source:
    print('实际是404页面(状态码200)')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:27:44