
本文详解如何通过动态请求头(尤其是随机化 accept-encoding)规避 coches.net 的机器人检测,实现稳定、可持续的 html 页面抓取,避免返回“ups! parece que algo no va bien...”错误页。
本文详解如何通过动态请求头(尤其是随机化 accept-encoding)规避 coches.net 的机器人检测,实现稳定、可持续的 html 页面抓取,避免返回“ups! parece que algo no va bien...”错误页。
在使用 requests + BeautifulSoup 抓取西班牙主流汽车平台 coches.net 时,开发者常遇到一个典型问题:看似合法的 GET 请求却持续返回错误页(标题为 "Ups! Parece que algo no va bien..."),而非目标页面的 HTML 内容。这并非网络异常或解析错误,而是网站后端通过行为指纹识别出自动化请求并主动拦截。
核心原因在于:coches.net 部署了较灵敏的反爬策略,仅靠轮换 User-Agent(如 Windows + Chrome 组合)远远不够——它会检测请求头的一致性与静态特征。实验表明,当 Accept-Encoding 字段固定(甚至设为无意义字符串如 "some nonsense")时,系统在约 5 次请求后即触发封锁;而一旦将其设为每次请求都变化的随机值,即可显著延长有效访问窗口,实现连续 10+ 次稳定响应。
以下是推荐的稳健实践方案:
✅ 正确做法:动态化关键请求头字段
import requests
from bs4 import BeautifulSoup
import random
url = "https://www.php.cn/link/8948986d77d8c218f03ebcca19417d92"
for i in range(15):
# 每次请求生成全新 headers —— 关键是 Accept-Encoding 必须唯一且不可预测
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.54",
"Accept-Encoding": f"gzip, deflate, br, {random.randint(1000, 999999)}", # 混入随机数提升熵值
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "es-ES,es;q=0.9,en;q=0.8",
"Connection": "keep-alive",
"Upgrade-Insecure-Requests": "1"
}
try:
response = requests.get(url, headers=headers, timeout=10)
response.raise_for_status() # 主动抛出 HTTP 错误状态
soup = BeautifulSoup(response.text, "html.parser")
title_tag = soup.find("title")
if title_tag and "Ups!" not in title_tag.get_text():
print(f"✅ 请求 {i}: 成功获取主页 → {title_tag.get_text().strip()}")
else:
print(f"⚠️ 请求 {i}: 可能被拦截 → 标题: {title_tag.get_text().strip() if title_tag else 'None'}")
except Exception as e:
print(f"❌ 请求 {i} 失败: {e}")
⚠️ 注意事项与进阶建议
- 不要复用 Session 或连接池:coches.net 可能关联 TCP 连接生命周期,建议每次请求新建 requests.Session() 或直接使用 requests.get()。
- 添加合理延迟:即使头信息足够“真实”,高频请求仍易触发速率限制。生产环境务必加入 time.sleep(random.uniform(1.5, 4.0))。
- 避免 Cookie 持久化:首次请求不带 Cookie 头更安全;若需登录态,请谨慎管理并定期清理。
-
监控响应状态码与内容特征:除检查
外,还可验证是否存在关键选择器(如 soup.select_one('nav.main-nav')),作为是否成功加载的双重判断依据。 - 备用方案准备:长期运行建议集成代理池(如 BrightData、ScraperAPI)或浏览器自动化(Playwright),以应对策略升级。
? 小结:反爬的本质是“降低请求可预测性”。对 coches.net 而言,Accept-Encoding 的随机化比 User-Agent 轮换更有效——因为它既符合 HTTP 规范(浏览器实际会发送该字段),又打破了服务端基于请求指纹的聚类识别逻辑。掌握这一技巧,可大幅提高静态网页抓取的鲁棒性与可持续性。










