返回博客
洞察

网页抓取代理方案:构建稳定、合规的数据采集架构

为经过授权的网页抓取构建可靠代理层,涵盖任务路由、限速、会话控制、数据校验和可观测性。

抓取任务通过受控代理网关访问公开网页并进入可监控的数据管道

代理可以为经过授权的网页抓取任务提供可控网络路径、指定地区或连续会话,但它不能修复脆弱的选择器、授予受限数据访问权限,也不能让无限请求频率变得合理。稳定采集来自代理策略、访问规则、限速、重试、数据校验和可观测性的组合。

为什么有代理仍然会抓取失败

  • 速率限制:更多 IP 不会消除网站容量限制。HTTP 429 表示请求过多,应依据 Retry-After 退避。
  • 会话错配:在 Cookie 绑定流程中途更换 IP 可能导致会话失效,而独立页面可能不需要连续身份。
  • 地域不一致:搜索结果、价格、库存和内容会随地区变化,出口位置必须与研究问题一致。
  • 解析器漂移:布局、语言、实验版本和字段缺失会产生错误记录,即使请求全部返回 200。
  • 配置冲突:环境代理变量、DNS、TLS 信任和凭据格式都可能让流量走到意外路径。

实际目标不是避开所有封锁,而是建立可测量的采集系统:目标要求降速时主动减速,需要会话连续性时保持身份一致,数据质量下降时停止任务。

根据任务选择代理策略

工作负载

适合作为起点的策略

原因

稳定且明确允许访问的公开端点

数据中心代理或一个静态端点

路由简单、成本可预测

跨地区的独立公开页面

明确选择地区的轮换住宅代理

获得地域覆盖,同时不把无关请求绑定到一个会话

带 Cookie 的多步骤流程

粘性住宅会话或静态住宅 IP

让网络身份与会话状态保持一致

长期账号或区域监控

专享静态住宅 IP

出口身份稳定且便于审计

不应仅因为住宅或移动网络更难被识别就选择它。只有经过授权的任务确实需要该网络类型或地区时,才应使用相应代理。

解决方案架构

可落地的抓取代理架构

将系统拆分为已批准的任务队列、策略与限速层、感知会话的代理控制器、有限重试的请求器、记录校验器和可观测性。这样可以区分连接失败、限速、登录墙、解析失败和地域错误,而不是把所有问题都标记为代理质量差。

从任务队列、策略控制、代理路由、公开页面到数据校验和监控的负责任网页抓取架构

Python:用明确策略发送一个请求

从密钥管理工具或环境变量读取完整代理 URL。下面的示例遇到限速响应会停止,让调度器按照服务器要求安排后续重试。

import os
import requests

PROXY_URL = os.environ["SCRAPING_PROXY_URL"]
PROXIES = {"http": PROXY_URL, "https": PROXY_URL}

def fetch_public_page(url: str) -> str:
    response = requests.get(
        url,
        proxies=PROXIES,
        headers={
            "User-Agent": "ExampleResearchBot/1.0 (+contact@example.com)"
        },
        timeout=(10, 30),
    )

    if response.status_code in (429, 503):
        retry_after = response.headers.get("Retry-After", "not provided")
        raise RuntimeError(
            f"Target requested backoff; Retry-After={retry_after}"
        )

    response.raise_for_status()
    return response.text

Requests 支持按请求设置代理字典,也支持标准代理环境变量。其官方文档提醒,将凭据保存在环境变量或版本控制文件中存在暴露风险;生产环境应使用合适的密钥管理方案。

Scrapy:先限速,再扩容

Scrapy 提供 HttpProxyMiddleware、RobotsTxtMiddleware 和 AutoThrottle。可以从一组保守配置开始:

ROBOTSTXT_OBEY = True

AUTOTHROTTLE_ENABLED = True
AUTOTHROTTLE_START_DELAY = 2.0
AUTOTHROTTLE_MAX_DELAY = 60.0
AUTOTHROTTLE_TARGET_CONCURRENCY = 1.0

CONCURRENT_REQUESTS_PER_DOMAIN = 2
DOWNLOAD_DELAY = 1.0

AutoThrottle 会根据观测延迟调整下载间隔,同时遵守并发和延迟上限。这些数值只是安全起点,并非适合所有网站;如果目标公布了更严格限制或开始返回错误,应进一步降低速率。

提高稳定性的运行规则

  1. 优先使用官方 API、数据导出、Feed 或书面授权。
  2. 从一个地区、一个解析器版本和低并发开始。
  3. Cookie 绑定流程使用同一个粘性或静态身份;只有互相独立且允许的任务才轮换。
  4. 遵守 429、503 和 Retry-After,使用有重试上限的指数退避。
  5. 遇到身份验证墙、验证码或明确拒绝时停止重试并转人工复核。
  6. 入库前验证记录,对字段缺失或页面类型异常的结果进行隔离。
  7. 不在日志和代码仓库中保存代理凭据,泄露后立即轮换。
  8. 监控有效记录成功率,而不只是 HTTP 成功率。

值得监控的指标

  • 按域名和状态码统计响应;按路由统计中位和尾部延迟;429/503 频率及等待时间。
  • 代理认证、DNS、TLS 和连接失败;出口国家或州不匹配。
  • 字段完整度、重复率、数据结构漂移、流量和每条有效记录的代理成本。

不要只根据服务商宣传指标规划容量。应先对实际目标运行小规模、已获授权的试点,再根据有效记录调整并发和预算。

常见问题

轮换代理能让网页抓取自动变稳定吗?

不能。轮换只解决网络路径多样性,不能解决权限、速率限制、Cookie、JavaScript 渲染、解析器变化、重复数据或错误重试逻辑。

什么时候应该使用粘性或静态代理?

当多个已获授权的请求必须保持同一网络身份时,可以使用粘性会话或静态住宅 IP。不需要连续性的独立任务才适合在任务之间轮换。

爬虫应该遵守 robots.txt 吗?

RFC 9309 将 Robots Exclusion Protocol 标准化,用于让服务所有者控制爬虫访问。它本身不是访问授权,因此团队还必须评估网站条款、合同、API 和适用法律。

收到 HTTP 429 后应该怎么办?

降低请求频率,并在提供 Retry-After 时按要求等待。在负载不变的情况下不断更换 IP,不能替代负责任的退避。

受控起步

构建可控的代理层

从一个已获授权的目标、小型任务队列、明确的限速和一个可观测代理策略开始。只有数据质量和目标影响保持可接受时,才逐步扩容。