如何爬取网站而不被封锁

学习有效的技术 刮掉网站而不被封锁。 覆盖代理旋转,头管理,速率限制,以及Python,Node.js和Go的代码示例.

如何爬取网站而不被封锁

每个严肃的网络刮刮工程最终都会击中同一个墙壁:您的请求开始返回 CAPTCHA, 403 个错误,或者空页. 网站在侦测自动交通方面已变得非常出色,拆散器和反机器人系统之间的军备竞赛比以往任何时候都更加激烈。 无论是收集定价数据、监测竞争者的内容,还是建立用于AI培训的数据集、学习到 刮掉网站而不被封锁 这对于任何可靠的数据管道都至关重要。

本指南涵盖块背后的技术原因,现代反机器人系统的探测信号,以及经过验证的使你的刮刮机顺利运行的战略. 我们使用 住宅代办 以显示这些概念如何转化为已准备好的实施工作。

为何要封锁搜索器

在解决问题之前,它有助于理解你面对的是什么。 网站采用反机器人措施有几个合理的理由:

  • 基础设施保护 ——冲锋刮破可以覆盖服务器,降低真实用户的性能,并增加托管成本.
  • 内容保护 ——出版社,电子商务网站,数据提供者要防止竞争对手大规模复制其数据.
  • 警卫 ——自动交通模式与证书填充,DDoS攻击,脆弱性扫描重叠.
  • 遵守法规 ——处理个人数据的站点可能限制自动化访问,以遵守隐私规定.

现代网站依赖专门的反机器人服务,如Cloudflare Bot Management,Akamai Bot Manager,PerimeterX和DataDome. 这些服务利用各种信号的组合实时分析交通量,它们通过各自的网络分享情报——这意味着在一个网站标出的模式可以触发成千上万其他网站的阻断.

检测被屏蔽的信号

反机器人系统很少依赖单一指标. 它们从多个信号建立风险分数,并阻断超过阈值的请求. 以下是关键检测矢量 :

IP 地址认证

这是最基本的信号。 Datacenter IP范围有详细记录,具有内在较高的风险分数. 如果你的请求来自AWS,Google Cloud,或者任何已知的主机供应商,许多反机器人系统会立即挑战或封杀它们. 纵然如此 居住性综合方案,从一个地址发送过多的请求会得到标记。 IP声誉数据库被实时更新,一个烧焦的IP可以保持黑名单数周.

请求率和模式分析

人类不会要求每秒50页的间隔完全一致. 反机器人系统跟踪请求频率,计时模式,以及导航流量. 通过标定的结果——请求之间有相同的延迟——完全按顺序走路径的刮擦看起来是机械的,即使速度是保守的。

HTTP 指纹

每个HTTP客户端都有一个基于它发送头头的组合的显著指纹:头头顺序,TLS握手特征(JA3/JA4指纹),HTTP/2设置框架,以及头头值. 一个Python requests 图书馆的指纹与Chrome完全不同。 反机器人系统维持已知浏览器指纹的数据库,并标出任何不匹配的东西.

浏览器指纹和 JavaScript 挑战

高级的反机器人系统服务于检查浏览器环境的JavaScript挑战:画布渲染,WebGL能力,安装的字体,屏幕分辨率,时区,语言偏好,以及数百个其他信号. Puppeteer和Playwright等无头浏览器可以通过细微的区别——缺少浏览器插件,导航器对象上不正确的属性描述符,或者没有预期的渲染行为来检测.

行为分析

一些系统跟踪鼠标的运动,滚动图案,并点击行为. 一个直接导航到数据重的页面而不首先访问主页,或者从不移动鼠标,信号自动化的会话.

检测信号风险水平缓解困难初级防御
数据中心 IP 范围关键轻点使用住宅代理
高要求率高级轻点限制率 + 随机延迟
缺少/错误头高级中型现实头文件
TLS 指纹不匹配高级TLS 指纹扫描库
JavaScript 挑战失败关键真实浏览器( Playwright/ Puppeteer)
行为异常中型类似人类的互动模拟
Cookie/会议异常中型中型适当的会议管理

将策略拼凑而不受阻碍

1. 使用住宅代用品进行IP旋转

针对基于IP的屏蔽的唯一最有效的防御就是将您的请求通过 住宅代办住宅IP属于真正的ISP,具有与普通家庭互联网连接相同的声誉。 反机器人系统不能在不影响到合法用户的情况下覆盖住宅区。

有效的代理旋转意味着为每个请求或一小批请求分配不同的IP. 对于依赖会话的刮切(当需要保持登录状态或导航多页流时),使用粘贴的会话,在旋转前将相同的IP保存在限定的时间内.

代理Hat提供带有可配置会话控制的自动旋转. 您可以从 具体国家、州或城市 访问地理限制内容,同时保持住宅级信任分数。

2. 工艺现实主义HTTP 页眉

拆掉图书馆的默认信头是一纸空文。 Python公司的请求 requests 库发送 User-Agent: python-requests/2.31.0 ——即刻标注为自动化. 构建与真实浏览器完全匹配的头条配置 :

  • 设置当前, 完整 User-Agent 匹配真实浏览器版本的字符串
  • 包含 Accept, (中文). Accept-Language, (中文). Accept-Encoding,以及 Sec-CH-UA 页眉
  • 将页眉顺序匹配到您正在冒充的浏览器
  • 在多个浏览器配置文件之间旋转以避免一个指纹
  • 包含一个可信的 Referer 页眉( 如搜索引擎结果页)

3. 实施智能费率限制

制服延误几乎是可疑的,根本没有延误。 执行在现实分布之后的随机延迟 :

  • 请求之间延迟2-5秒
  • 添加增减30%-50%的随机焦点
  • 每20-50个请求插入较长的暂停( 15- 30 秒)
  • 减少每个域的货币——最多2-3个平行请求
  • 接收速率限制信号时执行指数后退( 429 个状态代码)

4. 妥善管理会话和饼干

许多网站在第一次访问时指定了跟踪饼干,并期望它们能满足随后的请求. 一个从不发送饼干的刮刮机,或者每个请求都会发送新鲜饼干,触发异常探测. 每个会话保持一个饼干罐,并在逻辑浏览会话中将饼干带过请求.

5. 处理 JavaScript- 渲染内容

对于需要JavaScript执行的网站,通过Playwright或Puppeteer使用真正的浏览器引擎. 但运行无头浏览器而不采取预防措施很容易被检测到. 关键强化步骤包括:

  • 使用 playwright-extrapuppeteer-extra 带有隐形插件
  • 设置一个现实的视图大小( 不是默认的 800x600)
  • 启用 WebGL 并注入一致的 GPU 渲染器字符串
  • 设定时间区和地址以匹配您的代理服务器的地理位置
  • 在提取数据前添加鼠标的随机移动和滚动动作

6. 尊重机器人.txt并执行后退

虽然机器人.txt并非在所有法域都具有法律约束力,但尊重它却显示出诚意。 更实际的是,那些看到你忽略机器人.txt的网站更可能实施攻击性封锁. 当您收到429(太多请求)或503(无法获取的服务)响应时,总是执行自动后退——这些是明显的信号来减速.

代码示例: 用代理Hat住宅代理

以下例子说明了如何用现实头来配置住宅代理旋转. 每个例子都使用代理Hat SDK来对应的语言. 免费 API 文档,参见代理Hat文件。

Python 示例

安装 SDK : pip install proxyhat (单位:千美元)GitHub 图像页:1

import time
import random
from proxyhat import ProxyHatClient
client = ProxyHatClient(
    api_key="your_api_key",
    country="US",
    session_type="rotating",  # New IP per request
)
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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": "en-US,en;q=0.9",
    "Accept-Encoding": "gzip, deflate, br",
    "Sec-CH-UA": '"Chromium";v="131", "Not_A Brand";v="24"',
    "Sec-CH-UA-Mobile": "?0",
    "Sec-CH-UA-Platform": '"Windows"',
}
urls = [
    "https://example.com/page/1",
    "https://example.com/page/2",
    "https://example.com/page/3",
]
for url in urls:
    response = client.get(url, headers=headers)
    print(f"{response.status_code} - {url} via {response.proxy_ip}")
    # Randomized delay: 2-5 seconds with jitter
    delay = random.uniform(2.0, 5.0)
    time.sleep(delay)

节点.js 示例

安装 SDK : npm install @proxyhat/sdk (单位:千美元)GitHub 图像页:1

const { ProxyHatClient } = require("@proxyhat/sdk");
const client = new ProxyHatClient({
  apiKey: "your_api_key",
  country: "US",
  sessionType: "rotating",
});
const headers = {
  "User-Agent":
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.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": "en-US,en;q=0.9",
};
const urls = [
  "https://example.com/page/1",
  "https://example.com/page/2",
  "https://example.com/page/3",
];
async function scrape() {
  for (const url of urls) {
    const response = await client.get(url, { headers });
    console.log(`${response.status} - ${url} via ${response.proxyIp}`);
    // Randomized delay between requests
    const delay = 2000 + Math.random() * 3000;
    await new Promise((r) => setTimeout(r, delay));
  }
}
scrape();

跳转到示例

安装 SDK : go get github.com/ProxyHatCom/go-sdk (单位:千美元)GitHub 图像页:1

package main
import (
    "fmt"
    "math/rand"
    "time"
    proxyhat "github.com/ProxyHatCom/go-sdk"
)
func main() {
    client := proxyhat.NewClient(&proxyhat.Config{
        APIKey:      "your_api_key",
        Country:     "US",
        SessionType: proxyhat.Rotating,
    })
    headers := map[string]string{
        "User-Agent":      "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
        "Accept":          "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.9",
    }
    urls := []string{
        "https://example.com/page/1",
        "https://example.com/page/2",
        "https://example.com/page/3",
    }
    for _, url := range urls {
        resp, err := client.Get(url, proxyhat.WithHeaders(headers))
        if err != nil {
            fmt.Printf("Error: %v\n", err)
            continue
        }
        fmt.Printf("%d - %s via %s\n", resp.StatusCode, url, resp.ProxyIP)
        // Randomized delay: 2-5 seconds
        delay := time.Duration(2000+rand.Intn(3000)) * time.Millisecond
        time.Sleep(delay)
    }
}

多页流粘贴会话

一些刮刮任务需要在整个多个请求中保持相同的IP地址——例如导航一个标定产品上市,维持一个登录会话,或者完成一个多步骤的表格. ProxyHat支持粘性会话,这些会话在可配置的时间内持有相同的住宅IP.

# Python: Sticky session example
from proxyhat import ProxyHatClient
client = ProxyHatClient(
    api_key="your_api_key",
    country="DE",
    session_type="sticky",
    session_ttl=300,  # Same IP for 5 minutes
)
# All requests within the session use the same IP
response1 = client.get("https://example.com/login", headers=headers)
response2 = client.post("https://example.com/login", data=credentials, headers=headers)
response3 = client.get("https://example.com/dashboard", headers=headers)
print(f"Session IP: {response1.proxy_ip}")  # Same IP for all three requests

常见的错误是触发块

甚至有经验的开发者也会犯这些错误. 每个都可以通过代理带宽进行燃烧,并让IP不必要地标记:

  • 使用默认库头 - 这个 python-requests 用户代理字符串出现在每个块列表中. 总是设置自定义标题 。
  • 忽略 TLS 指纹 你的头可能说"Chrome" 但你的TLS握手会说"Python" 使用库类 curl_cffitls-client 冒充真正的浏览器TLS指纹
  • 初发射时速度太快 - 开始慢。 请求率在数小时而不是数分钟内逐渐上升。
  • 不优雅地处理错误 ——用相同的配置废物带宽立即重试被封锁的请求,并确认你是一个机器人. 对错误执行备份并切换代理会话 。
  • 重用燃烧的IP ——如果请求返回一个 CAPTCHA 或块页,则该IP会为该目标失密. 立即向新会话旋转 。
  • 忽视地域一致性 - 向美国IP发送请求 Accept-Language: ja 而一个+9的时区偏移看起来很可疑。 将您的信头和浏览器设置匹配到代理服务器 地点。 。 。
  • 不监测成功率 ——不跟踪你的块速率,就无法判断你的策略是否有效. 记录每个响应状态并提醒成功率下降.

高价值目标高级技术

指纹随机化

对于被严密保护的网站,不仅旋转IP,而且旋转整个浏览器指纹配置. 每个会话都应该有用户代理,屏幕分辨率,时区,语言,以及平台的一致组合——这些组合应该匹配现实的组合. 一个带有Linux平台字符串的Windows用户代理是一个明显的红旗.

请求链模拟

真正的用户不会直接跳转到产品页面. 他们从搜索引擎到达,浏览分类页面,并跟随内部链接. 构建剪贴机以模拟现实的导航路径:加载主页,跟随链接到分类页面,然后访问目标数据. 这会产生一个令人难以置信的会话模式 。

SERP 拼写考虑

搜索引擎刮刮有独特的挑战,因为Google,Bing等都具有特别积极的机器人探测能力. 住宅代理对于可靠的 SERP 跟踪,您应在多个地点分发请求,以避免触发来自任何单一区域的费率限制。

选择正确的代理类型

并不是每份刮刮工作都需要住宅代理. 正确的选择取决于目标防御和预算. 看我们的 代理类型的详细比较 为了深潜。 以下是一个快速决定矩阵:

使用大小写建议的代理类型原因
一般网页刮伤住宅轮换最佳的信任和成本平衡
电子商务价格监测住宅轮换对大多数零售商的高反机器人保护
SERP 跟踪住宅地理目标搜索引擎阻断数据中心 IPs 十分活跃
社交媒体的刮伤移动代理期望移动流量的平台的最高信任度
公共 API 访问数据中心反机器人风险低,最便宜的选择
偷窥器/台式机址住宅粘贴坚持住家信任

对于大多数刮刮项目来说,住宅旋转代用品提供了可靠性和成本效益的最佳组合。 代理用户定价 基于带宽消耗,所以您只为成功的数据传输付费。

关键外卖

  • 居家代理是基础 ——Datacenter IP在大多数受保护的网站上立即被封锁. 住宅综合方案具有自然信任。
  • 头像IP一样重要 ——带有默认Python头的住宅IP仍然被屏蔽. 构建完整,现实的标题配置 。
  • 随机处理一切 ——延迟,标题组合,导航路径. 可预测的模式是可探测的模式。
  • 监测和调整 追踪你的成功率 当块增加时,在通过您的代理池点燃前先调查并调整.
  • 匹配你的指纹 ——每个信号应讲一个一致的故事:用户代理,TLS指纹,时区,语言,地理位置必须一致.
  • 开始慢点, 逐步缩放 ——从保守的利率限制开始,只有在可靠地确认你的设置工作后才能增加.
  • 对状态流动使用粘性会话 ——登录序列和多页导航需要IP一致性. 使用带有相应 TTL 的粘度会话.

经常被问到的问题

我怎么知道我的刮刀是不是被挡住了?

常见的标志包括接收HTTP 403或429状态代码,被重定向到CAPTCHA页面,在您期望HTML内容的地方获得空响应机构,或者接收的内容与常规浏览器中看到的不同. 监视您的响应状态代码和内容长度——平均响应大小的突然下降往往表明网站返回挑战页面而非实际内容的软块.

住宅代理是否足以避开所有街区?

住宅代用品消除基于IP的阻塞,这是最常见的检测方法,但它们本身并不是完整的解决方案. 您仍需要现实的标题, 适当的速率限制, 和会话管理 。 把住宅代用品当作基础——它们解决了最难的问题(IP的声誉),但你刮堆的其他层也必须是坚固的. 对于最受保护的网站,将住宅代理与浏览器指纹冒充相结合,使用工具如: curl_cffi 或隐形的Playwright。

我每秒能发出多少请求而不被阻止?

没有通用的答案,因为它依赖于目标网站的防御. 作为保守的起点,将自己限制在每域每2-5秒1个请求,并带有旋转IP. 对于保护较少的场所,可以逐渐增加到5-10个并行请求. 对于Google或Amazon等被严密保护的站点,即使有居民代理,也要每3秒不超过1次请求. 总是逐步地提升,并监视你的成功率——如果它下降到95%以下,你的速度太快了.

旋转和粘性代理会话有什么区别?

旋转会话为每个请求指定一个新的IP地址,对于在请求之间不需要坚持状态的独立页面的删除是理想的. 粘接会话在配置的时间内(一般为1-30分钟)保持相同的IP,这对于登录流量,加成导航,或服务器跟踪您的IP的任何多步进程都是必要的. 默认情况下使用旋转会话, 仅在您的使用大小写特别要求会话连续性时才会切换为粘度 。

网络刮伤合法吗?

网络刮刮的合法性因法域、所收集数据的类型以及如何使用而有所不同。 在美国,2022hiQ Labs诉Linked案 在裁决中确定,删除公开的数据并不违反《计算机欺诈和滥用法》。 在欧盟,GDPR适用于个人数据,而不论其收集方式如何. 作为一般规则:为合法商业目的刮除公开的、非个人数据被广泛接受。 总是审查一个网站的"服务条款",尊重机器人.txt作为礼遇,并就具体使用案件咨询法律顾问.

准备开始了吗?

通过AI过滤访问148多个国家的5000多万个住宅IP。

查看价格住宅代理
← 返回博客