爬取电商网站是两个问题披着同一个名字。第一个是提取:从商品页面可靠地提取价格、标题、库存状态和评论,其可靠程度要足以让您今天存储的数字在下周仍然具有相同的含义。第二个是访问:如何以规模化的方式获取那个页面,而目标网站的整个商业逻辑都建立在将您的爬虫与真实买家区分开来的基础上。大多数指南只解决第一个问题,然后对随之而来的 403 报错墙感到惊讶。
本文对这两个问题都认真对待。它涵盖了零售页面上真正值得收集的几个数据点、一旦超过几百个请求就会遭遇的反爬虫现实、如何为给定商店的防御机制选择匹配的代理或获取类型、一个可运行的提取示例,以及自建技术栈何时不再合算的转折点。目标是构建一个一个月后仍能运行的价格追踪器或目录数据源,而不是一个在您的笔记本上跑一次然后在生产环境中挂掉的脚本。
商品页面上值得爬取的数据
零售目录范围很广,但真正驱动决策的字段却很少。收集这些字段,您就覆盖了大多数人爬取商店的主要原因。
- 价格。被追踪最多的单一字段。只有干净的价格才有用:去掉货币符号,规范化小数分隔符,并将货币代码单独存储,使价格成为可比较的数字,而非需要重新解析的字符串。
- 可用性和库存。"有货"、"仅剩 2 件"、"3 周后发货"和"无货"是不同的信号。同时捕获原始状态和规范化的布尔值,因为竞争对手断货往往比价格变化更具可操作性。
- 目录结构。标题、品牌、类目路径、SKU 或商品 ID,以及变体维度(尺码、颜色)。商品 ID 是让您跨网站和跨时间匹配同一商品的关键,因此将其视为主键来对待。
- 评论和评分。平均分、评论数量和评论文本。数量和均分变化缓慢,追踪成本低;完整的评论文本体量更大,通常分页显示在 JavaScript 渲染的内容后面。
- 媒体和文案。图片 URL 和描述,适用于比较商品列表的呈现方式而非仅仅比较价格的场景。
这里重要的规律是在捕获时进行规范化。您以原始形式存储并打算"稍后清洗"的字段永远不会被清洗。在编写解析器之前就确定每个字段的形态,并拒绝不符合规范的记录,而不是静默地存储格式错误的价格。
零售网站的反爬虫现实
公开的目录页面看起来是开放的,单次 curl 请求通常能成功。这种早期成功是误导性的。零售网站是网络上防护最严密的目标之一,因为爬取竞争对手也是他们自己团队在做的事,所以他们清楚地知道要监视什么。防御机制大致按以下顺序升级。
速率限制。最简单的一层。在短时间内从一个 IP 发出过多请求,您就会遭到限速或临时封禁。这是捕获幼稚爬虫的第一关,也是最容易通过将请求分散到多个 IP 来击败的。
IP 声誉。网站检查您的地址是否属于托管服务商而非家庭连接。机房地址段位于已知 ASN 中,单次查询即可标记。宽松的商店会忽略这一点;防护严密的商店会当场封锁机房流量,这正是代理机房与住宅决策存在的全部原因。
指纹识别。除了 IP 之外,网站还会检查您的 TLS 握手、请求头顺序和 JavaScript 环境。一个声称是 Chrome 但行为不像浏览器的请求,即使来自完美的住宅 IP,也会显得突出。这正是只调整请求头的爬虫悄悄开始收到诱饵页面或挑战的地方。
JavaScript 渲染内容。许多现代电商平台提供几乎为空的 HTML 外壳,然后在客户端构建价格、库存和评论。获取原始 HTML,您想要的字段就不在那里。您需要一个真实的浏览器来执行页面,或者一个为您执行的端点。
主动挑战。CAPTCHA 和托管机器人检测服务,对每个请求进行评分并对可疑请求设置门槛。当您遭遇这些时,调整请求头已远远不够,现实的选择是模拟令人信服的真实用户流量,或使用在服务端处理挑战的托管获取方案。
为了"安全起见",在每个目标上都选用最强、最昂贵的方案(住宅或移动 IP,完整的浏览器渲染)很诱人。这正是爬取预算悄悄流失的方式。先分析每个商店的特点。宽松的目录使用廉价的机房 IP 和原始 HTML 就能通过;只在真正封锁了更便宜层级的目标上才为住宅信任度和渲染付费。遭到封锁才升级一个档次,不要提前升级。
按目标选择代理或获取类型
"电商"没有统一正确的配置,因为零售网站在防御谱系上分布广泛。决策是哪种类型的访问方式与您面前的商店相匹配。代理是一层间接性,从不同的 IP 发出请求;问题是哪种 IP,以及是否还需要浏览器。
| 目标特征 | 适用方案 | 原因 |
|---|---|---|
| 宽松目录,静态 HTML | 机房代理,轮换 | 最便宜最快;规模化时无需真实用户信任 |
| 防护严密,封锁机房 IP | 住宅代理 | 出口 IP 读取为普通购物者,能通过声誉检查 |
| 登录限制/账户专属价格 | ISP(静态住宅) | 住宅信任度加上能保持单一会话的稳定 IP |
| JS 渲染的价格/库存 | 带渲染的 Crawling API | 在服务端执行页面,返回完整的 DOM |
| 最困难的目标,主动挑战 | Crawling API | 端到端拥有轮换、指纹识别和重试 |
有两个轴在起作用。第一个是 IP 信任度:机房 IP 快速廉价但显而易见,住宅 IP 读取为真实家庭连接,静态住宅(ISP)增加了一个在登录会话中不会轮换的稳定地址。完整的中间权衡在ISP 与住宅代理中有所介绍。第二个轴是渲染:如果价格只在 JavaScript 执行后才出现,仅靠 IP 选择无法解决这个问题,您需要在循环中加入浏览器。在代理池中轮换可以让任何单个地址保持在限速以下,而托管网关无需维护 IP 列表即可实现这一点;参阅如何使用轮换代理了解机制细节。
从廉价端开始。先通过轮换机房代理池以纯 HTML 方式运行目标。如果遭到封锁或字段为空,这一失败准确告诉您下一步该升级到哪个档次。
一个实用的提取示例
下面是一个真实提取器的形态:获取页面、解析字段、规范化,并拒绝任何格式错误的内容。这里使用 Python 的 requests 和一个解析器;将选择器替换为您目标网站的实际标记。
import re import requests from bs4 import BeautifulSoup def parse_product(html): soup = BeautifulSoup(html, "html.parser") raw_price = soup.select_one(".price").get_text(strip=True) # Normalize at capture: strip symbols, keep a real number price = float(re.sub(r"[^\d.]", "", raw_price)) stock = soup.select_one(".stock").get_text(strip=True) return { "sku": soup.select_one("[data-sku]")["data-sku"], "title": soup.select_one("h1").get_text(strip=True), "price": price, "in_stock": "out" not in stock.lower(), } # Plain fetch works only on tolerant, static targets resp = requests.get("https://example.com/product/123") print(parse_product(resp.text))
这在宽松的静态商店上能运行,但一旦目标封锁了您的 IP 或用 JavaScript 渲染价格就会失效。当 resp.text 返回封锁页面或没有价格的外壳时,您不需要重写解析器,而是改变获取方式。通过处理 IP 轮换并在浏览器中运行页面的托管端点路由请求,同样的解析器就能针对真实的 DOM 运行。
# Same parser, different fetch: the API rotates IPs and # renders the page server-side, then returns the DOM. resp = requests.get( "https://api.crawlbase.com/", params={ "token": "_YOUR_TOKEN_", "url": "https://example.com/product/123", "javascript": "true", }, ) print(parse_product(resp.text))
这里的关键是分离:提取逻辑是您的代码,很少改变;而访问是您按目标调整的旋钮。保持两者分离,商店加强防御时只需改一下配置,而非重写代码。如果您不想在常见的电商平台上自己编写解析器,结构化数据端点可以直接返回解析好的 JSON 字段,以不再维护选择器为代价换取灵活性。
如何利用这些数据
提取是手段;电商决策才是目的。这个话题的传统版本会蔓延成九种营销策略,但持久有效的用途归结为几点。
价格监控。随时间追踪竞争对手价格,您看到的不只是当前数字,而是规律:竞争对手何时打折、折扣幅度多深、多久打一次。这是在价格下降后做出反应与提前预见之间的区别。手动追踪数百个 SKU 上的几家竞争对手是不可能的;一个定时爬取任务几分钟内就能完成。
库存和品类追踪。了解竞争对手的产品线及其断货时间,能发现您可以填补的空缺和他们无法满足而您可以满足的需求。断货信号往往比价格变化更具可操作性。
目录丰富和匹配。获取更丰富的描述、图片和规格来改善您自己的商品列表,并利用共享商品 ID 在多个电商平台上匹配同一商品,进行真正的同类对比。
评论和情感监控。跨商品汇总评分和评论文本,了解客户对您的商品和竞争对手商品的称赞和投诉,无需手动阅读数千条评论。
何时托管爬取 API 物有所值
自建还是购买的分界线是真实存在的,坦率地说明各方胜出的场景是诚实的做法。当目标宽松、大多是静态 HTML,且爬取是您产品的核心功能而非辅助数据源时,选择自建。在这种情况下,简单的轮换代理加上您自己的解析器是精简且正确的选择,即便是托管网关也能省去您维护 IP 列表的麻烦。
当目标开始反击时,选择购买。一旦您需要维护无头浏览器集群、轮换住宅 IP、指纹逻辑和封锁重试处理,您实际上是在手动重建一个爬取 API,而且通常成本更高、可靠性更低。托管端点将轮换、渲染、重试和挑战处理封装在一次请求背后,因此您的代码缩减为"发送一个 URL,解析结果"。自持 IP 与外包任务之间的深度对比见回连代理与 Crawling API。
对于用 JavaScript 渲染或一遇到就封锁的零售目标,Crawling API 接受一个 URL 并返回完整的页面:在大型住宅、机房和移动代理池中轮换,发送令人信服的指纹,在页面需要浏览器时进行渲染,并在服务端对封锁进行重试。您的解析器保持不变;访问问题变成一个查询参数。先在免费层级对您最难的商品页面进行测试。
核心要点
- 电商爬取是两个问题。提取(解析字段)和访问(规模化获取页面)。两者都要解决,否则第二个问题会在生产中击溃您。
- 在捕获时规范化。将价格存储为带独立货币代码的数字,同时存储原始和规范化的库存状态,并将商品 ID 作为主键。"稍后清洗"永远不会发生。
- 零售网站是防护严密的目标。随着规模扩大,速率限制、IP 声誉、指纹识别、JS 渲染和主动挑战会逐级升级。在选择工具之前先分析每个商店。
- 将访问类型与目标匹配。宽松目录用机房代理,防护严密的目标用住宅代理,登录限制定价用静态住宅,JS 页面用渲染 API。
- 将提取和访问分开。您的解析器很少改变;获取方式是按目标调整的旋钮。商店加强防御时,代价应是改配置,而非重写。
常见问题
爬取电商网站合法吗?
在许多司法管辖区,爬取公开可访问的数据在很大程度上是被允许的,但合法性取决于您收集什么以及如何使用。避免收集个人数据,尊重网站条款和速率限制,不要爬取您无权访问的登录墙后面的内容,任何商业用途请咨询律师。这是一般性信息,不构成法律建议。
为什么我的爬虫在零售网站上被封锁?
通常是三件事之一:从一个 IP 发出太多请求(速率限制)、地址被识别为机房而非真实用户(IP 声誉),或请求行为不像真实浏览器(指纹识别)。解决办法是将请求分散到轮换 IP 上,在防护严密的目标上使用住宅出口,并发送令人信服的浏览器指纹,或者将整个任务交给处理所有这三项的托管获取方案。参阅如何在不被封锁的情况下爬取。
爬取电商网站最适合哪种代理类型?
取决于商店的防御机制。对静态 HTML 的宽松目录使用轮换机房代理,对封锁机房 IP 的网站使用住宅代理,当需要保持登录会话以获取账户特定价格时使用 ISP(静态住宅)。从廉价端开始,只在真正遭到封锁时才升级。
如何爬取用 JavaScript 加载的商品价格?
普通的 HTML 获取无法看到这些价格,因为价格是在页面加载后在浏览器中构建的。您需要执行 JavaScript,方法是自己驱动一个真实浏览器(参阅使用 Python 和 Selenium 进行网络爬取),或者使用启用了渲染功能的 Crawling API,它在服务端运行页面并返回您可以正常解析的完整 DOM。
我应该自建爬虫还是使用 Crawling API?
当目标宽松且为静态内容、爬取是您的核心产品时选择自建。当目标开始反击时选择使用 Crawling API,因为维护住宅 IP、无头浏览器集群、指纹逻辑和重试机制,实际上是以更高成本重建了一个 Crawling API。两者都可以使用同一个解析器,因此选择的是您想自行运行多少访问层的问题。
应该多久爬取一次竞品价格?
将频率与价格变化的速度和您对数据的处理能力相匹配。对大多数目录来说,每天一次已经足够;对于快速变化的品类或限时促销,可能需要对少数关键 SKU 每小时爬取一次。爬取频率超过您对数据的处理频率,只会在不增加信号的情况下提高封锁风险和成本。
大规模爬取任何站点,无需与基础设施对抗。
Crawlbase 负责处理代理、指纹和 CAPTCHA,让你的团队专注于交付数据流水线,而非维护爬取管道。1,000 次请求免费,无需信用卡。
