抓取指南 · 1 分钟阅读

如何在抓取时避免IP封禁

IP封禁通常来自行为,而不是运气不好 — 请求过多,标题不规范,以及一个尖叫着“机器人”的指纹。以下是如何在规则内抓取并保持请求流畅。

为什么网站禁止 IP(以及首先要修复什么)

大多数封锁是由你请求的方式触发的,而不是你是谁。

三个信号在大多数禁令背后发挥着重要作用:

  • 速率&流量 — 来自一个IP的请求每秒过多,或者是人类无法产生的完全均匀的节奏。
  • 指纹 — TLS/JA3,HTTP/2帧顺序,以及与您声称的浏览器不匹配的头部顺序。
  • 头部 — 缺失或默认的用户代理,没有接受语言,过时或缺失的引用来源。

在优化任何内容之前,请阅读目标的robots.txt和服务条款。抓取公共数据通常是可以的;但猛击一个端点,忽视发布的速率限制,或收集个人数据可能会违反服务条款,并在某些司法管辖区违反法律。遵守爬虫延迟,缓存您获取的内容,不要反复请求一个站点。

一旦您负责任地抓取,您的主要杠杆是IP的分配方式:

方法最佳适用于权衡
轮换(每个请求/批次的新IP)高流量公共页面,搜索风格的爬虫分散负载,但会破坏会话、购物车和登录
粘性/会话(一段时间内相同的IP)登录流程、多步骤导航、分页看起来像人类,但将负载集中在一个出口上

s4m运行数据中心代理 — 经过身份验证的SOCKS5 + HTTP,而不是住宅代理。它们每GB速度快且便宜,但一些消费者网站更容易标记数据中心范围,因此请将它们与干净的头部和诚实的速率限制配对。需要一个稳定的出口用于登录?添加一个专用IP。更喜欢完整的隧道?请参见/vpn/,在/compare/权衡选项,或阅读更多指南。

让您不被封禁的杠杆

将这些结合起来——没有单一的技巧能胜过良好的反机器人系统。

速率限制和抖动

限制并发,添加请求之间的随机延迟,并遵守爬虫延迟以及服务器发送的任何429 / Retry-After。

轮换或保持粘性

为无状态、高流量的爬虫轮换IP;为登录的多步骤流程保持一个固定出口。许多工作混合了两者。

干净的指纹

发送真实的浏览器头部,使用一致的Accept-Language和Referer,而不是将您标记为机器人的库默认值。

在失败时退后

在429和5xx响应上使用指数退避和抖动,当网站明确发出停止信号时完全停止。

每个IP的使用控制

s4m限制可以按IP、账户和账户类型进行管理员调节,因此一个失控的任务无法烧毁共享出口或你的预算。

无日志,优先使用 RAM

通过TLS认证的代理,设计上无日志。您的目标列表和流量保持属于您,无论是卡支付还是加密货币。

抗封禁的抓取设置

从第一次请求到持久爬虫的六个步骤。

检查robots.txt和服务条款

确认端点允许自动访问,注意任何爬虫延迟,并跳过个人或明显禁止的数据。

设置请求预算

选择一个并发上限和一个远低于看起来滥用的目标每秒请求数,然后添加随机延迟。

发送真实的头部

设置一个真实的User-Agent、Accept和Accept-Language,并在会话期间保持一致。

选择旋转与固定

为无状态页面轮换出口;在登录会话中重用一个粘性出口,以便状态不会在流程中断裂。

添加指数退避

在 429 / 503 时,等待 Retry-After(或 2^n)加上抖动,然后重试几次,再优雅地放弃。

每个IP的使用限制

使用 s4m 每 IP 限制,以便单次抓取无法耗尽出口,并在扩展时监控按量使用。

Python:通过s4m代理的礼貌爬虫

粘性会话,真实的头部,带抖动的退避。用您的凭据替换USER:PASS——绝不要硬编码真实IP。

python
import random
import time
import requests

# s4m datacenter proxies (authenticated). Placeholder host only.
USER, PASS = "USER", "PASS"
HTTP  = f"http://{USER}:{PASS}@proxy.s4m.online:3128"
SOCKS = f"socks5://{USER}:{PASS}@proxy.s4m.online:1080"  # pip install requests[socks]

PROXIES = {"http": HTTP, "https": HTTP}

HEADERS = {
    "User-Agent": (
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 "
        "(KHTML, like Gecko) Chrome/125.0 Safari/537.36"
    ),
    "Accept": "text/html,application/xhtml+xml;q=0.9,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.9",
}


def polite_get(url, session, max_retries=5):
    for attempt in range(max_retries):
        r = session.get(url, headers=HEADERS, proxies=PROXIES, timeout=20)
        if r.status_code == 429 or r.status_code >= 500:
            wait = float(r.headers.get("Retry-After", 2 ** attempt))
            time.sleep(wait + random.uniform(0, 1))  # backoff + jitter
            continue
        r.raise_for_status()
        return r
    raise RuntimeError(f"gave up after {max_retries} tries: {url}")


def crawl(urls):
    # One Session = one sticky exit for this run; open a new one to rotate.
    with requests.Session() as s:
        for url in urls:
            resp = polite_get(url, s)
            yield url, resp.text
            time.sleep(random.uniform(1.5, 4.0))  # rate-limit + jitter


if __name__ == "__main__":
    for url, html in crawl(["https://example.com/page/1"]):
        print(url, len(html))
FAQ

问题,已解答

数据中心代理足够避免封禁吗?

它们隐藏您的原始 IP 并分散负载,这可以防止许多基于速率的阻止。但 s4m 代理是数据中心的,而不是住宅的,一些消费者网站更容易标记数据中心范围——因此将它们与干净的头部、合理的速率限制和在状态重要的地方使用粘性会话结合起来。

我应该使用轮换代理还是粘性代理?

为无状态、高流量的公共页面轮换出口,以便没有单个IP引起注意。当你登录或进行多步骤流程时保持稳定会话,因为在会话中更改IP看起来可疑,可能会破坏购物车或身份验证。许多作业混合使用两者。

网络爬虫合法吗?

这取决于您的管辖权、数据和网站的条款。公共的非个人数据通常是可以的,但平台的服务条款可能禁止自动访问,即使在技术上是可能的,个人数据则有额外的规则。始终检查 robots.txt 和服务条款,并谨慎抓取。

我如何阻止一个任务消耗我所有的配额?

s4m 代理是计量的,按需付费,每个 IP、每个账户和每种账户类型都有管理员可调的限制。限制爬虫的并发性,并设置每个 IP 的使用限制,以防止失控的循环耗尽您的预算或共享出口。

我可以获得一个稳定的IP用于登录抓取吗?

是的。专用个人IP附加组件是一个静态出口,你可以选择将其与身份解绑,并绑定到代理或VPN——当目标将会话与一个一致的地址绑定时,这很有用。

更聪明地抓取,而不是更努力

经过认证的SOCKS5 + HTTP数据中心代理,按使用量计费,具有每个IP的使用限制和可选的专用IP。设计上无日志——并且诚实地说明这些是数据中心,而不是住宅出口。

人们通过搜索找到此页面

此页面回答的真实搜索短语 — 链接的短语打开详细覆盖它们的页面。