Alibaba.com 是全球最大的 B2B 交易平台之一,列出了来自数十个国家供应商的 40 多个类别的产品。对于任何进行选品、价格研究或竞争分析的人来说,公开搜索结果是一个信息密集的信号:每次查询返回产品标题、价格区间、最小起订量、供应商名称,以及将它们联系在一起的链接。将这些整理成结构化数据集,可以将手动浏览转变为可排序、可比较、可随时间跟踪的数据库。

本指南展示了如何以可靠的方式使用 Node.js 抓取 Alibaba 搜索结果。你将构建一个小型可运行的爬虫,通过 Crawling API 获取渲染后的搜索结果页(SERP),用 Cheerio 解析每个产品卡,处理分页,并导出干净的 JSON 和 CSV 文件。整个演示限定在任何人无需账号即可看到的公开搜索结果数据范围内,末尾的合法性章节不是套话,请在将本指南应用于任何实际场景之前务必阅读。

你将构建什么

一个 Node.js 脚本,接收一个公开的 Alibaba 搜索 URL,通过 Crawling API 获取 HTML,并为页面上的每个产品卡提取结构化记录。我们将以一个示例查询作为运行示例,并从每个搜索结果中提取以下字段:

  • 标题 房源卡中显示的产品标题。
  • 价格 该产品显示的价格或价格区间。
  • 最小起订量 供应商设定的最小起订量或促销特性文本。
  • 供应商 该房源背后的店铺或公司名称。
  • 链接 产品详情页的目标 URL。
  • 店铺链接 供应商的公司主页 URL。

为什么普通请求在 Alibaba 上会失败

如果你从脚本向 Alibaba 搜索 URL 发送裸 HTTP 请求,很少能得到你在自己浏览器中看到的干净页面。有两个因素对你不利。首先,SERP 的大部分内容是在初始 HTML 加载后由 JavaScript 组装的,因此原始请求返回的可能是一个产品卡缺失的外壳。其次,Alibaba 会监控自动化流量:看起来不像真实浏览器的请求会被质询、被要求解决 CAPTCHA,或者在获取到列表之前就被封锁。

因此,一个能正常工作的 Alibaba 爬虫需要在一次请求中同时满足两点:平台识别为真实访客的 IP,以及当页面依赖脚本时能渲染页面的浏览器。你可以自己用无头浏览器加轮换住宅代理池来搭建这套方案,但保持两者健康运行才是工作量的主要所在。Crawling API 将两者合并为一次调用:你发送 URL,它从可信 IP 获取并在需要时渲染,并返回可供 Cheerio 等轻量级库解析的完整 HTML。

为什么轮换在这里很重要

Alibaba 是防护最严密的交易平台之一,因此单个数据中心 IP 频繁请求 SERP 会立即暴露意图。Crawling API 在服务端轮换数据中心和住宅地址,并为你处理 CAPTCHA,因此你无需自己获取和维护这个 IP 池。你可以从最多 20,000 次免费请求开始,无需信用卡。

前提条件

编写任何代码之前,需要准备几件事。每项都不需要太长时间。

基本的 Node.js 知识。 你应该能够编写和运行 Node 脚本,并使用 npm 安装包。如果你是在这个技术栈中进行爬取的新手,我们关于如何使用 Node.js 构建网络爬虫的指南涵盖了本教程假定你已了解的基础知识。

Node.js 14 或更高版本。 使用 node -v 确认你的版本。如果尚未安装,请从 nodejs.org 安装。

Crawlbase 账号和 token。 注册后,打开你的控制台,从账号文档页面复制你的请求 token。最多 20,000 次请求免费。像密码一样保护该 token:它用于验证你的请求,因此不要将其提交到版本控制。

搭建项目

创建一个项目目录并安装爬虫所需的两个库。

bash
mkdir alibaba-serp-scraper
cd alibaba-serp-scraper

npm init -y
npm install crawlbase cheerio

两个依赖项各司其职:crawlbase 是向 Crawling API 发送请求的官方客户端,cheerio 是一个快速的 jQuery 风格 HTML 解析器,让你可以通过 CSS 选择器提取各个字段。在该目录中创建一个名为 index.js 的文件,爬虫代码就写在那里。

步骤 1:通过 Crawling API 获取页面

首先获取 HTML。用你的 token 初始化 Crawling API 客户端,将其指向一个公开的 Alibaba 搜索 URL,并在编写任何选择器之前确认页面能正常返回。CrawlingAPI 客户端返回一个响应,其 body 包含渲染后的 HTML。

javascript
const { CrawlingAPI } = require('crawlbase');

// Replace with your token from the Crawlbase dashboard
const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

const alibabaSerpURL =
  'https://www.alibaba.com/trade/search?SearchText=samsung+s24+ultra';

api
  .get(alibabaSerpURL)
  .then((response) => {
    // original_status is the status Alibaba itself returned
    console.log('Status:', response.originalStatus);
    console.log(response.body.slice(0, 500));
  })
  .catch((error) => {
    console.error('Request failed:', error);
  });

示例查询是 samsung+s24+ultra,通过 SearchText 参数传递,这是 Alibaba 交易搜索传递搜索词的方式。使用 node index.js 运行脚本,你应该会看到 200 状态码和前 500 个字符中真实的产品标记。这确认了在编写任何解析逻辑之前,获取已正常工作:页面已渲染且请求已被接受。检查 originalStatus 能让区域限制或封锁立即显现,而不是悄悄地将错误页面输入解析器。

Crawlbase Crawling API

200 状态码之所以能返回,正是因为请求以真实访客身份到达了 Alibaba。Crawling API 从轮换 IP 获取 SERP,渲染 JavaScript 构建的产品卡,并在服务端清除 CAPTCHA,然后将完整 HTML 交给你,省去了自行运行无头浏览器集群和获取住宅代理池的麻烦。先在免费套餐上试试公开的搜索 URL。

步骤 2:用 Cheerio 解析产品卡

拿到 HTML 后,将其加载到 Cheerio 中,通过选择器提取每个产品。Alibaba 将每个商品列表包装在商品列表容器下的卡片中,标题、价格、最小起订量和供应商各自在卡片内的独立元素中。在浏览器开发者工具中右键检查实时页面,以确认当前的类名;以下选择器匹配撰写本文时的布局。

javascript
const cheerio = require('cheerio');

// Alibaba serves protocol-relative URLs (//...); normalise them to https
function toHttps(href) {
  if (!href) return null;
  return href.includes('http') ? href : `https:${href}`;
}

function parseSerp(html) {
  const $ = cheerio.load(html);
  const results = [];

  const numberOfResults = $('.seb-refine-result_all').text().trim();

  $('.offer-list-wrapper .J-search-card-wrapper').each((index, element) => {
    const card = $(element);

    const title = card.find("[data-spm='d_title']").text().trim();
    const url = card.find("[data-spm='d_title']").attr('href');
    const price = card.find('.search-card-e-price-main').text().trim();
    const minItem = card.find('.search-card-m-sale-features__item').text().trim();
    const storeName = card.find('.search-card-e-company').text().trim();
    const storeLink = card.find('.search-card-e-company').attr('href');
    const image = card.find('.search-card-e-slider__img').attr('src');
    const reviews = card.find('.search-card-e-review').text().trim();

    if (!title) return;

    results.push({
      position: index + 1,
      title,
      price,
      minItem,
      storeName,
      reviews,
      url: toHttps(url),
      storeLink: toHttps(storeLink),
      image: toHttps(image),
    });
  });

  return { numberOfResults, results };
}

module.exports = { parseSerp };

包装选择器 .offer-list-wrapper .J-search-card-wrapper 选中每个产品卡。在每个卡片内,标题及其产品 URL 来自 [data-spm='d_title'] 链接,价格来自 .search-card-e-price-main,最小起订量文本来自 .search-card-m-sale-features__item,供应商名称和主页链接来自 .search-card-e-company。Alibaba 返回的许多链接是协议相对的(以 // 开头),因此小巧的 toHttps 辅助函数会在值不是绝对 URL 时前缀 https:if (!title) return; 守卫跳过空卡片或非产品卡,防止促销磁贴污染输出。.seb-refine-result_all 元素包含页面顶部显示的总结果数。

选择器会发生变化

Alibaba 的类名(如 J-search-card-wrappersearch-card-e-price-main)会在前端重新部署时更改。将上述选择器视为起始模板,而非合同。当每个卡片的字段都返回空值时,请在浏览器开发者工具中重新检查实时页面并更新选择器。定期维护选择器是任何生产爬虫的正常操作,而非出了问题的信号。

步骤 3:整合代码并导出

现在将获取和解析合并为一个可运行的脚本。抓取渲染后的 SERP,将 HTML 传给解析器,然后将结构化输出写入 JSON 和 CSV,使数据可以直接用于电子表格或数据库。

javascript
const { CrawlingAPI } = require('crawlbase');
const cheerio = require('cheerio');
const fs = require('fs');

const api = new CrawlingAPI({ token: 'YOUR_CRAWLBASE_TOKEN' });

function toHttps(href) {
  if (!href) return null;
  return href.includes('http') ? href : `https:${href}`;
}

function parseSerp(html) {
  const $ = cheerio.load(html);
  const results = [];
  const numberOfResults = $('.seb-refine-result_all').text().trim();

  $('.offer-list-wrapper .J-search-card-wrapper').each((index, element) => {
    const card = $(element);
    const title = card.find("[data-spm='d_title']").text().trim();
    if (!title) return;

    results.push({
      position: index + 1,
      title,
      price: card.find('.search-card-e-price-main').text().trim(),
      minItem: card.find('.search-card-m-sale-features__item').text().trim(),
      storeName: card.find('.search-card-e-company').text().trim(),
      reviews: card.find('.search-card-e-review').text().trim(),
      url: toHttps(card.find("[data-spm='d_title']").attr('href')),
      storeLink: toHttps(card.find('.search-card-e-company').attr('href')),
      image: toHttps(card.find('.search-card-e-slider__img').attr('src')),
    });
  });

  return { numberOfResults, results };
}

function toCsv(results) {
  const headers = ['position', 'title', 'price', 'minItem', 'storeName', 'url'];
  const escape = (v) => `"${(v || '').toString().replace(/"/g, '""')}"`;
  const rows = results.map((r) =>
    headers.map((h) => escape(r[h])).join(',')
  );
  return [headers.join(','), ...rows].join('\n');
}

async function main() {
  const url =
    'https://www.alibaba.com/trade/search?SearchText=samsung+s24+ultra';
  const response = await api.get(url);

  if (response.originalStatus !== 200) {
    throw new Error(`Unable to crawl, status ${response.originalStatus}`);
  }

  const data = parseSerp(response.body);
  fs.writeFileSync('alibaba-serp.json', JSON.stringify(data, null, 2));
  fs.writeFileSync('alibaba-serp.csv', toCsv(data.results));
  console.log(`Saved ${data.results.length} products`);
}

main().catch((error) => console.error(error));

使用 node index.js 运行完整脚本。它获取"samsung s24 ultra"的 SERP,为每个产品卡提取一条记录,并将所有内容写入 alibaba-serp.jsonalibaba-serp.csv。JSON 保留了带有结果总数的嵌套结构,而 CSV 将核心采购字段扁平化为行,可以直接放入电子表格。更改 URL 中的查询词,同样的两个函数就能处理任何返回的内容。

输出结果示例

你将获得一个干净的对象,包含总结果数和有序的产品列表,每个产品包含标题、价格、最小起订量、供应商、链接和图片。

json
{
  "numberOfResults": "3,000+ products found",
  "results": [
    {
      "position": 1,
      "title": "Mobile Phone Case For Samsung Galaxy S24 Ultra Plus Tpu Pc Shockproof Covers",
      "price": "US$1.29 - US$1.69",
      "minItem": "Min. order: 50 pieces",
      "storeName": "Guangzhou Junbo Electronic Co., Ltd.",
      "reviews": "4.9/5.0 (68)",
      "url": "https://www.alibaba.com/product-detail/Mobile-Phone-Case_1600969904884.html",
      "storeLink": "https://gzjunbo.en.alibaba.com/company_profile.html",
      "image": "https://s.alicdn.com/@sc04/kf/Hcdcc7db446e9420f9378c0ec3482037bk.png_300x300.png"
    },
    {
      "position": 2,
      "title": "Cellphone Original S24 Ultra 16GB+512GB Smartphone 7inch Unlocked 5G",
      "price": "US$43.42 - US$54.47",
      "minItem": "Min. order: 1 piece",
      "storeName": "Dongguan Zhongfu Electronic Technology Co., Ltd.",
      "reviews": "3.3/5.0 (197)",
      "url": "https://www.alibaba.com/product-detail/Hot-selling-S24-Ultra_1600969407142.html",
      "storeLink": "https://fukadi.en.alibaba.com/company_profile.html",
      "image": "https://s.alicdn.com/@sc04/kf/H771126c0475c4a3d9ee7842740b0cf4an.jpg_300x300.jpg"
    }
  ]
}

这个数据结构使 Alibaba 数据对 B2B 工作真正有用:价格区间和最小起订量用于供应商比较,供应商名称和店铺链接帮助你筛选候选供应商,评论字符串为每个列表提供粗略的质量信号。关于将交易平台数据转化为定价决策的更多内容,请参阅我们关于将网络爬取用于价格情报的指南。

跨页面和查询扩展规模

单个查询的单页只是演示;真正的采购任务需要跨多个搜索词深入到更多结果中。Alibaba 的交易搜索通过 page 查询参数分页,因此 page=2 是第二页,page=3 是第三页,以此类推。结构保持不变:构建每个 URL,通过 Crawling API 获取,并使用同一函数解析。保持长时间运行健康的关键习惯是控制节奏,因此在请求之间暂停,而不是在紧密循环中连续请求。

javascript
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

async function scrapeQuery(searchText, pages = 3) {
  const encoded = encodeURIComponent(searchText).replace(/%20/g, '+');
  const allResults = [];

  for (let page = 1; page <= pages; page++) {
    const url =
      `https://www.alibaba.com/trade/search?SearchText=${encoded}&page=${page}`;
    const response = await api.get(url);
    if (response.originalStatus === 200) {
      allResults.push(...parseSerp(response.body).results);
    }
    await sleep(3000);
  }

  console.log(`Collected ${allResults.length} products across ${pages} pages`);
  return allResults;
}

Crawlbase 默认每秒最多处理 20 个请求,这对于控制节奏的爬虫来说有充足的余量;如果你确实需要更高的速率,支持团队可以提高限额。来自 API 的任何 5XX 响应都不计费,因此重试被封锁或不可用的 URL 不会产生任何费用。如果你更倾向于通过轮换 IP 池路由自己的流量而非使用托管 API,Smart AI Proxy 提供与之相同的 IP 轮换,作为即插即用的代理端点。关于更广泛的交易平台方法,我们关于电子商务网络爬取的指南涵盖了跨网站通用的模式。

保持不被封锁

即使可信 IP 问题已解决,Alibaba 仍然会监控爬虫形态的流量,其交易平台页面渲染负载较重,因此以下几个习惯能保持运行的健康。

  • 控制请求节奏。 在紧密循环中频繁请求搜索页面是最快被质询的方式。分散请求,变换查询词,而不是以全速翻遍同一词条。
  • 依赖轮换。 一组轮换 IP 将请求分散到多个地址,使没有任何单一 IP 触发限制。Crawling API 已为你处理这些;如果自建方案,这一环节是关键。
  • 当产品卡缺失时开启渲染。 如果产品卡返回为空,说明页面需要 JavaScript 来构建它们。启用 Crawling API 的渲染选项,让 SERP 像真实浏览器加载时那样被获取。我们关于抓取 JavaScript 网站的指南解释了何时有此必要。
  • 字段返回空时重新检查。 Alibaba 会定期更改其标记。如果产品卡停止解析,请在开发者工具中打开实时页面并更新选择器。

关于更广泛的方法,请参阅如何不被封锁地爬取网站

抓取 Alibaba 合法吗?

爬取 Alibaba 是否被允许,取决于 Alibaba 的服务条款、你所在的司法管辖区,以及你对数据的处理方式。Alibaba 的服务条款对自动访问设置了限制,因此无论你的工具多么谨慎,爬取都可能与这些条款相违背。这里的任何代码都无法改变这一点;代码只是让技术部分可行。请阅读 Alibaba 的服务条款和其 robots.txt,并将两者视为你采集内容的边界。

以下是应当坚守的几条原则。仅收集公开搜索结果数据:任何人在 SERP 上无需账号即可看到的产品标题、价格、最小起订量、供应商名称和链接。将你的请求量控制在足够低的水平,确保不会给 Alibaba 的服务器造成压力,控制爬取节奏而不是全速运行。不要抓取买家或供应商的联系方式、消息或任何需要登录才能访问的内容,也不要以仿佛是你自己原创内容的方式重新分发产品图片或描述。

本指南刻意限定在公开搜索结果页面范围内,因为这是使工作具有可辩护性的界限。Alibaba 为需要经授权访问产品和供应商数据(含更高体量)的合作伙伴运营着 Open Platform 官方 API,这才是项目超出公开页面爬取规模后的正确路径。对于涉及个人数据、账户保护内容或计划重新发布的版权媒体的任何操作,官方数据协议才是正确路线,而非更聪明的爬虫。

回顾

核心要点

  • 普通请求不够用。 Alibaba 用 JavaScript 构建其 SERP,并对机器人形态的流量发起质询,因此你需要渲染加上可信且轮换的 IP 才能获取真实产品卡。
  • Crawling API 从真实 IP 获取内容。 向它发送 URL,它在服务端轮换 IP,渲染产品卡,并清除 CAPTCHA,然后返回可供解析的完整 HTML。
  • Cheerio 负责提取。 选中每个 .J-search-card-wrapper,然后从中读取标题、价格、最小起订量、供应商和链接,并预期类名会发生变化。
  • 用 page 参数分页,同时导出两种格式。 递增 page 深入结果,加上暂停控制节奏,并写入 JSON 保留结构、写入 CSV 用于电子表格。
  • 坚守公开数据边界。 遵守 Alibaba 的服务条款和 robots.txt,保持低请求量,不要触碰联系方式或账户数据,当公开页面爬取规模不足时使用官方 Open Platform API。

常见问题

为什么普通请求在 Alibaba 上会失败或返回空页面?

Alibaba 在初始 HTML 加载后使用 JavaScript 组装其大部分搜索结果页面,因此原始请求返回的可能是一个产品卡缺失的外壳。它还会标记看起来不像真实浏览器的流量,并可能提供 CAPTCHA 或封锁。通过 Crawling API 获取(渲染页面并使用轮换 IP)使请求看起来像普通访客,从而获得真实的产品列表。

我可以用 Node.js 抓取 Alibaba 搜索结果吗?

可以。使用 Crawlbase 客户端和 Cheerio,你可以获取 SERP 并提取标题、价格、最小起订量、供应商和链接。Crawling API 充当桥梁,从可信 IP 将你的请求送达 Alibaba 并渲染页面,使请求顺利处理而不是被封锁。更广泛的入门内容,请参阅我们关于如何使用 Node.js 构建网络爬虫的指南。

我可以从 Alibaba SERP 提取哪些字段?

本教程从每个产品卡提取产品标题、价格、最小起订量、供应商名称、产品链接、店铺链接、图片和评论字符串,以及查询的总结果数。坚守公开搜索结果数据,避免任何需要登录才能访问的内容,包括供应商联系方式和账户保护内容。

抓取 Alibaba 需要 JavaScript 渲染吗?

通常需要,因为产品卡是在页面加载后由脚本构建的。如果基本获取返回空的商品列表,请启用 Crawling API 的 JavaScript 渲染选项,让页面像真实浏览器加载时那样被获取。我们关于抓取 JavaScript 网站的指南解释了何时有此必要。

如何翻页获取更多 Alibaba 结果?

使用 page 查询参数:page=2 是第二页,page=3 是第三页,以此类推。构建每个页面的 URL,通过 Crawling API 获取,使用同一函数解析,并在请求之间暂停几秒,控制爬取节奏而不是频繁请求。

我的选择器没有返回任何内容。发生了什么变化?

几乎肯定是 Alibaba 的标记发生了变化。当 Alibaba 重新部署其前端时,J-search-card-wrappersearch-card-e-price-main 这样的类名就会更改,因此上个月还能正常工作的选择器可能已经失效。请在浏览器开发者工具中重新检查实时 SERP 并更新选择器。定期维护选择器是任何生产爬虫的正常操作。

开始构建

大规模爬取任何站点,无需与基础设施对抗。

Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。

自助开通 · 无需销售通话 · 提供企业级爬取量