> ## Documentation Index
> Fetch the complete documentation index at: https://docs.brightdata.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 如何降低网络爬虫成本

> 降低网络爬虫成本的实用技巧,从选择合适的IP类型到优化带宽和服务计划。

# 你的爬虫管道有效，但月度账单在不断攀升。带宽费用、住宅代理使用费和服务器成本在大规模使用时迅速增加。

大部分支出是可以避免的。本指南介绍了在每一层中削减成本的实用技术：IP选择、请求优化、带宽减少和服务计划结构。

<iframe width="100%" height="360" src="https://www.youtube.com/embed/yT4i9fof8XI" title="How to save money on data collection" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen />

## 从最便宜的有效IP类型开始

网页爬虫中最大的成本杠杆是IP类型。数据中心IP的每GB成本远低于住宅IP或移动IP，但许多团队在数据中心IP可行时默认使用住宅IP。

把它看作运输：你不会仅仅因为方便就用隔夜快递运送所有东西。你从地面运输开始，只有在交货时间需要时才升级。

| IP类型     | 相对成本 | 最适合                                 |
| -------- | ---- | ----------------------------------- |
| **数据中心** | 最低   | 没有高级反机器人系统的网站                       |
| **ISP**  | 中等   | 需要在数据中心速度下获得住宅级信任的网站                |
| **住宅**   | 较高   | 使用Cloudflare、Akamai或PerimeterX保护的网站 |
| **移动**   | 最高   | 阻止所有其他IP类型的高度保护目标                   |

**经验法则：** 从数据中心IP开始。只有在确认它们对你的目标不起作用时，才沿着成本梯度向上移动。

### 如何测试网站是否支持数据中心IP

在编写任何代码之前，先在浏览器中手动测试：

1. 配置你的浏览器（Firefox效果很好）通过数据中心代理和单个粘性会话路由流量
2. 导航到目标URL
3. 如果页面正常加载，那么数据中心IP可以用于此网站

如果它通过数据中心代理在浏览器中加载，你也可以在代码中实现。关键是让你的请求看起来完全像浏览器的请求。

### 使用headers和cookies让数据中心IP正常工作

没有headers或cookies的裸HTTP请求在大多数网站上都无法工作，即使使用干净的数据中心IP。但添加正确的headers和cookies通常会让你获得接近完美的成功率。

以下是使用数据中心IP爬取Amazon产品页面的真实示例：

```javascript Node.js theme={null}
const axios = require("axios");

const TARGET_URL = "https://www.amazon.com/dp/B0EXAMPLE";

// 不带headers/cookies：成功率约10%
const bareRequest = await axios.get(TARGET_URL, {
  proxy: { host: "datacenter-proxy", port: 8080 },
});

// 带headers和cookies：成功率约100%
const optimizedRequest = await axios.get(TARGET_URL, {
  proxy: { host: "datacenter-proxy", port: 8080 },
  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/webp,*/*;q=0.8",
    "Accept-Language": "en-US,en;q=0.5",
    "Accept-Encoding": "gzip, deflate, br",
    Connection: "keep-alive",
    "Upgrade-Insecure-Requests": "1",
    Cookie: "session-id=123-4567890; i18n-prefs=USD; sp-cdn=L5Z9:US",
  },
});
```

差异是显著的：成功率从10%跳升到接近100%，只需通过模拟真实浏览器发送的内容。

**查找正确headers和cookies的位置：**

1. 在通过数据中心代理路由的浏览器中打开目标网站
2. 打开开发工具(F12)并转到**网络**选项卡
3. 重新加载页面并点击主文档请求
4. 复制**请求Headers**部分
5. 在你的爬虫代码中使用那些确切的headers

<Tip>
  Headers和cookies不会经常改变。你可以通过在无头浏览器中加载目标域一次、提取cookies和headers，然后为数百个HTTP客户端请求重用它们来自动化刷新。
</Tip>

## 仅当HTTP客户端不足时才使用浏览器

通过代理获取网页有两种方式：

* **HTTP客户端**（axios、Python `requests`、cURL）：发送单个请求并仅下载HTML。快速、轻量级且廉价。前面的部分都使用这种方法。
* **浏览器自动化**（Puppeteer、Playwright、Selenium）：启动一个完整的浏览器，渲染JavaScript、加载图像、样式表和页面上的所有其他资源。在带宽上要重得多。

两者都通过你的代理。区别在成本：HTTP客户端下载约500 KB HTML，而浏览器为同一页面加载20+ MB的资源。使用这个决策树选择正确的方法：

```
HTTP客户端（带headers/cookies）能获取数据吗？
├── 是 → 使用HTTP客户端（最便宜、最快）
└── 否 → 网站需要JavaScript渲染吗？
    ├── 是 → 使用浏览器自动化
    └── 否 → 检查是否缺少headers、cookies或TLS指纹
```

当你确实需要浏览器时，使用真实的Chrome二进制而不是Chromium。反机器人系统对浏览器构建进行指纹识别，Chromium会暴露"自动化"的身份。

```javascript Node.js (Puppeteer) theme={null}
const puppeteer = require("puppeteer-extra");
const StealthPlugin = require("puppeteer-extra-plugin-stealth");

puppeteer.use(StealthPlugin());

const browser = await puppeteer.launch({
  executablePath: "/usr/bin/google-chrome", // 真实Chrome，不是Chromium
  headless: "new",
  args: ["--no-sandbox"],
});

const page = await browser.newPage();

// 设置真实的headers
await page.setExtraHTTPHeaders({
  "Accept-Language": "en-US,en;q=0.9",
});

await page.goto("https://www.amazon.com/dp/B0EXAMPLE", {
  waitUntil: "domcontentloaded",
});
```

这个交换本身就可以在许多会以其他方式阻止你的爬虫的网站上消除验证码。

<Note>
  如果你根本不想管理浏览器，[Bright Data浏览器API](/products/scraping-browser/introduction)在云中运行真实的GUI浏览器，内置所有反阻止功能。你通过Puppeteer或Playwright连接，我们处理基础设施。
</Note>

## 使用浏览器时减少带宽

单个Amazon产品页面加载超过20 MB的资源。如果你只需要标题、价格和描述等文本数据，大部分带宽都是浪费的钱。

### 阻止不必要的资源类型

拦截网络请求并中止你不需要的任何东西：

```javascript Node.js (Puppeteer) theme={null}
await page.setRequestInterception(true);

page.on("request", (request) => {
  const resourceType = request.resourceType();

  // 阻止图像、样式表、字体和媒体
  if (["image", "stylesheet", "font", "media"].includes(resourceType)) {
    request.abort();
  } else {
    request.continue();
  }
});

await page.goto("https://www.amazon.com/dp/B0EXAMPLE");
```

仅阻止图像就可以减少页面加载带宽50%或更多。将样式表和字体添加到阻止列表会进一步减少它。

### 按域阻止请求

许多页面加载第三方脚本（分析、社交小部件、广告网络），这些对你需要的数据没有任何贡献：

```javascript Node.js (Puppeteer) theme={null}
const BLOCKED_DOMAINS = [
  "google-analytics.com",
  "facebook.net",
  "doubleclick.net",
  "adservice.google.com",
];

page.on("request", (request) => {
  const url = request.url();
  if (BLOCKED_DOMAINS.some((domain) => url.includes(domain))) {
    request.abort();
  } else {
    request.continue();
  }
});
```

<Warning>
  小心测试阻止。某些JavaScript文件是页面渲染你的目标数据所必需的。从阻止图像和明显的第三方域开始，然后逐步扩展阻止列表。如果网站崩溃，回溯。
</Warning>

### 获得数据后停止加载

你不需要等待整个页面完成加载。等待你需要的特定元素，然后停止：

```javascript Node.js (Puppeteer) theme={null}
await page.goto("https://www.amazon.com/dp/B0EXAMPLE", {
  waitUntil: "domcontentloaded", // 不要等待所有资源
});

// 仅等待你需要的元素
await page.waitForSelector("#productTitle");
await page.waitForSelector(".a-price .a-offscreen");

// 立即提取数据
const title = await page.$eval("#productTitle", (el) => el.textContent.trim());
const price = await page.$eval(".a-price .a-offscreen", (el) =>
  el.textContent.trim()
);

// 在剩余资源完成加载前关闭页面
await page.close();
```

这可以将带宽从20+ MB减少到每页不足2 MB，同时仍然捕获你需要的一切。

## 直接导航到数据

每次额外的页面导航都会耗费带宽和时间。构建到你需要的数据的最短路径。

**较长路径（3次导航）：**

1. 在Amazon上搜索"Xbox"
2. 点击第一个产品结果
3. 点击"查看所有评论"

**较短路径（1次导航）：**
通过将产品ID代入评论URL直接导航到`https://www.amazon.com/product-reviews/B0EXAMPLE`。

大多数网站的产品页面、评论页面和搜索结果URL模式可预测。逆向工程URL结构并完全跳过点击。

## 混合HTTP客户端和浏览器方法

某些网站需要浏览器会话来生成身份验证令牌，但实际数据页面使用HTTP客户端也能正常工作。你可以结合两种方法以获得各自的优势：

1. **在无头浏览器中加载一个页面**以收集会话cookies和身份验证令牌
2. **从浏览器会话中提取cookies**
3. **将这些cookies与你的HTTP客户端一起使用**用于所有后续页面

```javascript Node.js theme={null}
// 第1步：从一个浏览器会话获取身份验证cookies
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto("https://target-site.com/search?q=product");

// 第2步：提取cookies
const cookies = await page.cookies();
const cookieString = cookies.map((c) => `${c.name}=${c.value}`).join("; ");
await browser.close();

// 第3步：为快速HTTP请求使用cookies（不需要浏览器）
const productUrls = [
  "https://target-site.com/product/123",
  "https://target-site.com/product/456",
  "https://target-site.com/product/789",
];

for (const url of productUrls) {
  const response = await axios.get(url, {
    headers: {
      Cookie: cookieString,
      "User-Agent": "Mozilla/5.0 ...",
    },
    proxy: { host: "datacenter-proxy", port: 8080 },
  });
  // 解析response.data
}
```

这个模式为单个页面加载使用重浏览器带宽，然后为数百个数据页面切换到轻量级HTTP客户端请求。大规模时，成本差异是显著的。

## 选择正确的数据收集方法

在优化各个请求之前，考虑你是否应该构建爬虫。

| 方法        | 你管理的内容                  | 最适合                     |
| --------- | ----------------------- | ----------------------- |
| **内部**    | 一切：代理、解锁、解析、存储、服务器、工程团队 | 数据收集是核心业务的公司            |
| **混合**    | 解析和存储；一个服务处理解锁和IP轮换     | 想要对数据处理进行控制但不想控制基础设施的团队 |
| **数据即服务** | 仅分析；你从提供商购买结构化数据        | 其核心业务是分析数据而不是收集数据的团队    |

**内部**需要多个工程团队和持续的基础设施。除非数据收集是你的核心产品，否则这种方法很少具有成本效益。

**混合**消除了最大的时间消耗：对抗反机器人系统。使用[Bright Data Web Unlocker](/products/web-unlocker/introduction)，你发送一个URL，我们返回干净的HTML。所有五个检测层（IP轮换、TLS指纹识别、浏览器指纹识别、行为仿真和验证码求解）都在单个API调用中处理。你的开发人员专注于
