Python urllib.request访问KBB网站始终报400: Bad Request错误如何解决?
问题排查方向
- 请求头标识异常:urllib默认发送的请求会携带
User-Agent: Python-urllib/版本号的标识,KBB的反爬机制会直接拦截这类非浏览器请求,返回400错误。 - 必要请求头缺失:目标站点要求请求携带
Accept、Accept-Language等基础浏览器头字段,缺失会被判定为异常请求。 - 代理配置异常:所用代理失效、代理与站点协议不匹配,也会触发400错误。
修复方案
按以下代码调整请求配置,优先模拟真实浏览器请求特征:
from urllib import request as urlrequest proxy_host = '23.107.176.36:32180' url = "https://www.kbb.com/gmc/canyon-extended-cab/2018/" # 模拟Chrome浏览器请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.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.9,en;q=0.8", "Connection": "keep-alive" } # 构造请求时传入头信息 req = urlrequest.Request(url, headers=headers) req.set_proxy(proxy_host, 'https') try: page = urlrequest.urlopen(req, timeout=15) # 打印响应状态码确认请求成功 print("响应状态码:", page.getcode()) # 如需读取内容可调用page.read() except Exception as e: print("请求错误:", e) # 报错可先将代理配置到浏览器,手动访问目标站点确认代理是否可用
额外注意事项
- 若调整后仍报错,先验证代理可用性:将代理配置到浏览器手动访问目标URL,无法访问则更换可用的HTTPS代理。
- 确认代理类型匹配:如果所用代理为HTTP协议,需将
req.set_proxy(proxy_host, 'https')的第二个参数改为http。 - KBB有请求频率限制,不要短时间内发起大量请求,避免触发IP封禁。
内容的提问来源于stack exchange,提问作者dmort
相关产品推荐
相关产品推荐

