Python Selenium获取HTTP状态码异常:页面404仍返回200如何解决?
解决Python获取HTTP状态码始终为200的问题
你的问题核心在于两次请求的环境不一致,以及部分网站的自定义404页面设计导致状态码不符合预期,下面给你详细分析和解决办法:
为什么会出现这种情况?
- 请求环境差异:你用
self.driver.get(link)让浏览器加载页面,又用urlopen(link)发起了一个全新的请求——这两个请求的请求头、Cookie等完全不同(浏览器会自动带上很多标识,而urllib的默认请求非常简洁),服务器对这两个请求的响应可能不一样。 - 自定义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
相关产品推荐
相关产品推荐

