欢迎光临
我们一直在努力

Python爬虫实战:Playwright 攻克 Costco 开市客,实时监控进口热销榜!

㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐⭐⭐ 🉐福利: 一次订阅后,专栏内的所有文章可永久免费看,持续更新中,保底1000+(篇)硬核实战内容。

全文目录:

      • 🌟 开篇语
      • 0️⃣ 前言(Preface)
      • 1️⃣ 摘要(Abstract)
      • 2️⃣ 背景与需求(Why)
      • 3️⃣ 合规与注意事项(必写)⚠️
      • 4️⃣ 技术选型与整体流程(What/How)
      • 5️⃣ 环境准备与依赖安装(可复现)
      • 6️⃣ 核心实现:请求层(Fetcher)
      • 7️⃣ 核心实现:解析层(Parser)
      • 8️⃣ 数据存储与导出(Storage)
      • 9️⃣ 运行方式与结果展示(必写)
      • 🔟 常见问题与排错(强烈建议写)
      • 1️⃣1️⃣ 进阶优化(可选但加分)
      • 1️⃣2️⃣ 总结与延伸阅读
      • 🌟 文末
        • ✅ 专栏持续更新中|建议收藏 + 订阅
        • ✅ 互动征集
        • ✅ 免责声明

🌟 开篇语

哈喽,各位小伙伴们你们好呀~我是【喵手】。 运营社区: C站 / 掘金 / 腾讯云 / 阿里云 / 华为云 / 51CTO 欢迎大家常来逛逛,一起学习,一起进步~🌟

  我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

  📌 专栏食用指南(建议收藏)

  • ✅ 入门基础:环境搭建 / 请求与解析 / 数据落库
  • ✅ 进阶提升:登录鉴权 / 动态渲染 / 反爬对抗
  • ✅ 工程实战:异步并发 / 分布式调度 / 监控与容错
  • ✅ 项目落地:数据治理 / 可视化分析 / 场景化应用

📣 专栏推广时间:如果你想系统学爬虫,而不是碎片化东拼西凑,欢迎订阅专栏👉《Python爬虫实战》👈,一次订阅后,专栏内的所有文章可永久免费阅读,持续更新中。    💕订阅后更新会优先推送,按目录学习更高效💯~

0️⃣ 前言(Preface)

Costco 的商品以“大包装、低毛利”著称,其官网上的价格往往比代购便宜 20%-30%。但是,官网没有公开的 API 文档,且商品列表是动态加载的。

读完这篇你能获得:

  • 掌握 Playwright 网络拦截 (Network Interception) 的进阶用法,直接获取后端 JSON 数据。
  • 学会处理 Token 鉴权,无需模拟登录即可抓取公开商品数据。
  • 产出一份包含 商品原价、促销价、产地 的高价值数据表。
  • 1️⃣ 摘要(Abstract)

    本文将演示如何使用 Playwright 模拟浏览器访问 Costco 中国官网,自动监听并截获传输中的商品列表 API 响应。我们将绕过复杂的 DOM 解析,直接从 JSON 中提取商品名称、价格、库存状态及原产地信息,最终生成 CSV 报表。

    核心收获:

    • 零解析压力:无需编写易碎的 CSS/XPath 选择器,直接拿 JSON。
    • 精准数据:获取到网页上隐藏的 SKU 详细信息(如保质期、限购数量)。

    2️⃣ 背景与需求(Why)

    • 为什么要爬:

      • 比价神器:Costco 的价格是很多进口商品的“底价锚点”,爬取后可用于对比京东/天猫国际的价格。
      • 库存监控:热门商品(如茅台、戴森、Kirkland 坚果)经常瞬间断货,监控库存状态非常有必要。
    • 目标站点:Costco 中国官网 https://www.costco.com.cn/ (示例分类:食品/家居)。

    • 目标字段清单:

      • product_name: 商品名称 (如 “Kirkland Signature 混合坚果”)
      • price: 当前售价
      • original_price: 原价(如有折扣)
      • origin: 产地 (如 “美国”)
      • stock_status: 库存状态 (In Stock / Out of Stock)

    3️⃣ 合规与注意事项(必写)⚠️

    • Robots 协议:Costco 对爬虫管控严格。请务必遵守 robots.txt,不要尝试抓取用户个人中心或购物车数据。
    • 频率控制:Costco 官网使用了 CDN 防护,高频请求会导致 IP 被封禁(403 Forbidden)。建议每次采集间隔 10-20秒,且尽量复用 Session。
    • 会员限制:Costco 官网大部分商品无需登录即可查看价格,但部分特殊商品可能隐藏价格。本文仅针对公开可见数据。

    4️⃣ 技术选型与整体流程(What/How)

    • 技术选型:

      • 动态渲染:页面是 React/Vue 写的,数据异步加载。
      • 方案:Playwright (Network Interception)。这是最稳妥的方案,因为它可以完美模拟真实用户行为,同时“顺手牵羊”拿走 API 数据。
    • 流程图: 启动浏览器 → 访问分类页 → 设置 Response 监听器 → 滚动触发加载 → 捕获 API JSON → 清洗入库

    5️⃣ 环境准备与依赖安装(可复现)

    • Python 版本:Python 3.9+

    • 依赖安装:

      pip install playwright pandas
      playwright install chromium

    • 项目结构:

      costco_spider/
      ├── main.py
      └── data/

    6️⃣ 核心实现:请求层(Fetcher)

    Costco 的 API 通常包含 products 或 search 关键字。我们需要在页面加载时,把这些 JSON 响应像网兜捞鱼一样捞起来。

    from playwright.sync_api import sync_playwright
    import json
    import time
    import random

    # 全局列表,用于存储拦截到的商品数据
    captured_products = []

    def handle_response(response):
    """
    回调函数:处理每一个网络响应
    """

    # 过滤掉图片、CSS 等无关请求,只看 API
    # Costco 的接口通常包含 /api/v2/products 或 /rest/v2/china/products
    if "products" in response.url and "search" in response.url and response.status == 200:
    try:
    # 尝试解析 JSON
    data = response.json()
    # 这里的结构需要根据实际抓包结果调整
    # 假设结构是: { products: [ … ], pagination: { … } }
    if "products" in data:
    print(f"🎣 捕获到 API 数据包: {response.url[:60]}…")
    items = data.get("products", [])
    captured_products.extend(items)
    except Exception:
    # 不是 JSON 或者解析失败,忽略
    pass

    def fetch_costco_data(url, scroll_times=5):
    with sync_playwright() as p:
    # headless=False 方便调试,上线可改为 True
    browser = p.chromium.launch(headless=False, slow_mo=800)
    context = browser.new_context(
    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36…"
    )
    page = context.new_page()

    # ⚡️ 开启监听:这是核心!
    page.on("response", handle_response)

    print(f"🚀 前往 Costco 官网: {url}")
    page.goto(url, wait_until="networkidle")

    # 模拟滚动加载,触发更多 API 请求
    for i in range(scroll_times):
    print(f"🖱️ 滚动第 {i+1} 次…")
    page.mouse.wheel(0, 3000)
    # 随机等待,给 API 响应留时间
    time.sleep(random.uniform(3, 5))

    # 检测到底部
    # … (可参考前文的滚动检测逻辑)

    browser.close()
    return captured_products

    7️⃣ 核心实现:解析层(Parser)

    既然我们拿到了 JSON,解析就变得非常简单且健壮了。Costco 的 JSON 字段通常很规范。

    def parse_products(raw_items):
    clean_data = []

    print(f"🔍 开始解析 {len(raw_items)} 条原始数据…")

    for item in raw_items:
    try:
    # 提取基础信息
    name = item.get("name", "Unknown Product")
    code = item.get("code", "") # 商品编码

    # 提取价格 (注意:API 可能返回多种价格结构)
    price_info = item.get("price", {})
    current_price = price_info.get("value", 0)
    currency = price_info.get("currencyIso", "CNY")

    # 提取库存状态
    stock = item.get("stock", {})
    stock_status = stock.get("stockLevelStatus", "unknown")

    # 提取产地/品牌 (通常在 description 或 features 里)
    # 这里假设有一个 manufacturer 字段
    manufacturer = item.get("manufacturer", "")

    # 构造清洗后的字典
    clean_item = {
    "商品名称": name,
    "商品编码": code,
    "当前价格": current_price,
    "货币": currency,
    "库存状态": stock_status,
    "品牌/产地": manufacturer,
    "抓取时间": time.strftime("%Y-%m-%d %H:%M:%S")
    }

    clean_data.append(clean_item)

    except Exception as e:
    print(f"❌ 解析出错: {e}")
    continue

    return clean_data

    8️⃣ 数据存储与导出(Storage)

    依然是 CSV,方便后续做透视表分析。

    import pandas as pd
    import os

    def save_to_csv(data_list, filename="costco_hot_products.csv"):
    if not data_list:
    print("📭 购物车是空的,没有抓到数据。")
    return

    os.makedirs("data", exist_ok=True)
    filepath = os.path.join("data", filename)

    df = pd.DataFrame(data_list)

    # 去重:按商品编码 code
    df.drop_duplicates(subset=['商品编码'], keep='first', inplace=True)

    df.to_csv(filepath, index=False, encoding='utf-8-sig')
    print(f"💾 成功保存 {len(df)} 条商品信息至: {filepath}")

    9️⃣ 运行方式与结果展示(必写)

    if __name__ == "__main__":
    # 目标:Costco 官网 – 热销/新品页面 (URL 需根据实际情况获取)
    # 示例:搜索 "Kirkland" 柯克兰自有品牌
    target_url = "https://www.costco.com.cn/search?text=Kirkland"

    print("🛒 Costco 爬虫启动…")

    # 1. 抓取 (监听 API)
    raw_data = fetch_costco_data(target_url, scroll_times=3)

    # 2. 解析
    clean_data = parse_products(raw_data)

    # 3. 存储
    save_to_csv(clean_data)

    CSV 结果示例:

    商品名称当前价格库存状态品牌/产地
    Kirkland Signature 混合坚果 1.13kg 189.9 inStock Kirkland Signature
    Kirkland Signature 科克伦 厨房纸巾 159.0 outOfStock Kirkland Signature
    Dyson V15 Detect Absolute 4599.0 inStock Dyson

    🔟 常见问题与排错(强烈建议写)

  • Response 监听不到 API?

    • 原因:Costco 的 API 可能是 GraphQL 或者 REST 混合的。
    • 排错:打开 Chrome 开发者工具 (Network -> Fetch/XHR),刷新页面,找到那个体积最大的 JSON 请求。把它的 URL 特征词(比如 ocapi、webservices)加入到 handle_response 的判断条件里。
  • 抓到的价格是 null?

    • 原因:有些商品需要登录会员才能看到价格。
    • 解决:Playwright 支持加载 Cookies。你可以先在本地浏览器登录好,把 Cookies 导出为 JSON,然后在代码里 context.add_cookies([…]) 注入登录态。
  • 被重定向到验证码页面?

    • 原因:触发了 Incapsula 防护。
    • 解决:增加 slow_mo 的时间,或者手动在弹出的浏览器窗口里过一次验证码,Playwright 会继续执行。
  • 1️⃣1️⃣ 进阶优化(可选但加分)

    • 价格预警通知: 对比上一次抓取的 CSV,如果发现某款心仪商品(比如茅台)的 stock_status 从 outOfStock 变成了 inStock,立刻调用钉钉/飞书 API 发送报警。
    • 分类全量遍历: 编写一个递归函数,获取首页所有的一级分类链接,自动遍历整个商城,构建完整的 Costco 商品数据库。

    1️⃣2️⃣ 总结与延伸阅读

    恭喜!你已经掌握了 “API 劫持” 这一高级爬虫技巧。相比于传统的 HTML 解析,这种方法更稳定、更高效,且能获取到更多隐藏数据。 下一步:

    • 山姆会员店 (Sam’s Club):作为 Costco 的最大竞品,山姆的 App/小程序 抓取难度更高,但思路类似(抓包 -> 模拟请求)。
    • 数据分析:分析 Costco 和山姆的同类商品(如烤鸡、牛肉卷)的价格差异,生成一份“中产阶级省钱指南”。

    🌟 文末

    好啦~以上就是本期的全部内容啦!如果你在实践过程中遇到任何疑问,欢迎在评论区留言交流,我看到都会尽量回复~咱们下期见!

    小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦~ 三连就是对我写作道路上最好的鼓励与支持! ❤️🔥

    ✅ 专栏持续更新中|建议收藏 + 订阅

    墙裂推荐订阅专栏 👉 《Python爬虫实战》,本专栏秉承着以“入门 → 进阶 → 工程化 → 项目落地”的路线持续更新,争取让每一期内容都做到:

    ✅ 讲得清楚(原理)|✅ 跑得起来(代码)|✅ 用得上(场景)|✅ 扛得住(工程化)

    📣 想系统提升的小伙伴:强烈建议先订阅专栏 《Python爬虫实战》,再按目录大纲顺序学习,效率十倍上升~

    ✅ 互动征集

    想让我把【某站点/某反爬/某验证码/某分布式方案】等写成某期实战?

    评论区留言告诉我你的需求,我会优先安排实现(更新)哒~


    ⭐️ 若喜欢我,就请关注我叭~(更新不迷路) ⭐️ 若对你有用,就请点赞支持一下叭~(给我一点点动力) ⭐️ 若有疑问,就请评论留言告诉我叭~(我会补坑 & 更新迭代)


    ✅ 免责声明

    本文爬虫思路、相关技术和代码仅用于学习参考,对阅读本文后的进行爬虫行为的用户本作者不承担任何法律责任。

    使用或者参考本项目即表示您已阅读并同意以下条款:

    • 合法使用: 不得将本项目用于任何违法、违规或侵犯他人权益的行为,包括但不限于网络攻击、诈骗、绕过身份验证、未经授权的数据抓取等。
    • 风险自负: 任何因使用本项目而产生的法律责任、技术风险或经济损失,由使用者自行承担,项目作者不承担任何形式的责任。
    • 禁止滥用: 不得将本项目用于违法牟利、黑产活动或其他不当商业用途。
    • 使用或者参考本项目即视为同意上述条款,即 “谁使用,谁负责” 。如不同意,请立即停止使用并删除本项目。!!!

    赞(0)
    未经允许不得转载:171主机测评 » Python爬虫实战:Playwright 攻克 Costco 开市客,实时监控进口热销榜!
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址