用 Python 抓取 Etsy:搜索、商品、店铺与评论

最后更新于 April 28, 2026
用 Python 抓取 Etsy:搜索、商品、店铺与评论

Etsy 拥有超过 1 亿个活跃商品列表、560 万卖家,以及每月大约 4.5 亿次访问。这意味着平台上有大量公开可用的数据——价格、趋势、评论和竞争对手信息;如果你曾经手动收集过这些内容,就知道那有多折磨。

我曾经花了一个周末,想为一个市场研究项目手动整理竞争对手的产品。做到第 30 个产品时,我已经开始怀疑自己做过的每一个人生选择,只因为眼前那张表格。问题在于,Etsy 数据对价格分析、产品开发、细分市场发现和卖家基准对比都非常有价值——但前提是你得真的把它规模化抓取出来。本指南就是为此而写:一篇教程,讲清楚如何用 Python 抓取 Etsy 的四种主要页面类型(搜索结果页、商品页、店铺页和评论页),同时也会坦诚介绍 Etsy 的反爬机制,以及面向不想写代码的人提供的无代码替代方案。

用 Python 抓取 Etsy 是什么意思?

简单来说,网页爬虫就是写代码去访问网页,并自动提取你关心的数据——商品名称、价格、描述、图片、评分、评论、店铺信息——再把它整理成表格或数据库这类结构化格式。

Python 是做这类工作的首选语言。它对初学者很友好,社区规模大,而且有一整套非常适合爬虫的库生态:Requests(用于获取网页)、BeautifulSoup(用于解析 HTML)、SeleniumPlaywright(用于浏览器自动化),以及 pandas(用于整理和导出数据)。在 Stack Overflow 的年度开发者调查中,Python 一直稳居最受欢迎语言前三名,而它的爬虫库在 PyPI 上的下载量也名列前茅。

当你抓取 Etsy 时,你提取的是 Etsy 返回给浏览器的 HTML(有时还包括隐藏的 JSON)。你可以提取的数据包括:

  • 商品名称、价格、描述、图片和变体
  • 卖家/店铺信息(名称、销量、所在地、评分)
  • 评分和完整评论文本
  • 搜索结果列表、分类和趋势信号

为什么要抓取 Etsy?能带来实际回报的应用场景

抓取 Etsy 不只是一个技术练习,而是实实在在的竞争优势。无论你是卖家、产品经理还是数据分析师,手头拥有结构化的 Etsy 数据,都能直接影响你的业绩。

etsy_stats_4f1f4d51c3.png

应用场景你抓取什么谁受益业务影响
竞争性定价分析搜索结果 + 商品价格电商运营、卖家动态定价平均可将收入提升 5–22%
小众市场与趋势发现搜索结果、热门商品创始人、分析师尽早发现热门细分领域(例如“preppy pajamas”的搜索增长达到 +1,112%)
产品开发与优化评论、商品详情产品团队某厨房用品品牌利用评论情绪数据,在 60 天内重新夺回 #1 畅销榜
SEO 与关键词研究搜索结果、商品标题/标签营销团队找出高需求、低竞争关键词
卖家基准对比店铺页面、销量销售团队、分析师以每条记录 $0.01–0.10 的成本建立高质量潜在客户名单,而不是购买名单
库存与缺货监控商品可用性电商运营更快响应竞争对手的库存变化

这些应用场景都需要来自不同 Etsy 页面类型的数据——这也正是本教程要覆盖全部四类页面的原因。

节省时间:手动 vs 自动化

  • 手动做 Etsy 调研: 每个产品 30–45 分钟(100 个产品需要 50–75 小时)
  • 自动抓取: 100 个商品列表只需 2–5 分钟
  • AI 驱动的抓取速度可快 30–40%,准确率最高可达 99.5%

Etsy API vs 网页爬虫:你该选哪个?

在你写第一行代码之前,值得先问一句:我应该用 Etsy 官方 API,还是直接抓取网站?这个问题我在论坛里经常看到,答案取决于你需要什么数据。

Etsy API 能做什么,不能做什么

Etsy 提供了带 OAuth 2.0 认证的 API v3。它适合访问你自己店铺的数据——商品列表、订单、收据——但限制也很明显:

  • 竞争对手数据: API 基本只限于你自己的店铺,无法抓取其他卖家的价格、销量或商品列表。
  • 评论: 没有适合批量获取完整评论文本的强力接口。
  • 限流: 默认每秒 10 次请求、每天 10,000 次请求。偏移上限是 12,000 条记录。
  • AI/ML 用途: 在应用审核中会被明确拒绝。
  • 文档: 社区吐槽很多——示例差、接口过时、支持响应慢。

什么时候网页爬虫更合适

如果你需要竞争情报、评论情绪、跨店铺分析,或者 API 没有暴露的数据,抓取就是更好的路径。代价是:你会遇到 Etsy 的反爬防护(下面会详细说),而且需要投入一定的搭建成本。

对比表:API vs 抓取 vs 无代码

对比项Etsy 官方 APIPython 网页爬虫Thunderbit(无代码)
获取商品价格✅(字段有限)✅ 完整 HTML/JSON-LD✅ AI 可提取任意可见字段
评论数据❌ 不支持批量获取✅ 通过评论接口/HTML✅ 子页面抓取
竞争对手店铺数据❌ 仅限自家店铺✅ 任意公开店铺✅ 任意公开店铺
是否需要认证✅ OAuth 2.0⚠️ 登录数据需要 Cookie⚠️ 登录需要浏览器抓取
反爬风险高(DataDome)已处理(浏览器原生)
搭建时间中等(API 密钥、OAuth)高(代码 + 代理)约 2 分钟

如果你需要竞争对手数据、评论或跨店铺分析,API 确实覆盖不了。这就是现实情况。

写代码之前,先选好你的 Python 抓取方案

我在 Reddit 和 Stack Overflow 上经常看到一个问题:“我该用 Requests + BeautifulSoup、Selenium、代理 API,还是别的方案?”正确答案取决于你的技术水平、预算和使用场景。

方案最适合学习曲线支持 JS?反爬处理成本
Requests + BeautifulSoup想要完全掌控的开发者中等手动处理(请求头、代理)免费 + 代理成本
Selenium / PlaywrightJS 较多的页面、登录流程部分支持(浏览器指纹)免费 + 代理成本
代理 API 服务规模化 + 绕过反爬中等✅(通过 API)✅ 内置每月 $49 起
Thunderbit(无代码)非开发者、快速提取很低✅(浏览器原生)✅(浏览器会话)有免费额度

如果你想要完全控制,并且熟悉 Python,那就选 Requests + BeautifulSoup。如果需要 JS 渲染或登录流程,就用 Selenium。如果你想在规模化场景下绕过反爬,考虑代理服务。而如果你想在不编写或维护代码的情况下拿到 Etsy 数据,Thunderbit 值得一试——后面会详细说。

Etsy 如何反击:理解 DataDome 反爬防护

大多数爬虫教程都会告诉你“上代理就行”,然后就结束了。对 Etsy 来说,这远远不够。Etsy 使用的是 DataDome,这是全网最强势的反爬系统之一。DataDome 自己的案例研究 还把 Etsy 作为成功案例,指出爬虫一度占到 Etsy 计算成本的大约 1%。

etsy_antibot_5431142c9c.png

什么是 DataDome,它怎么工作?

DataDome 不只是检查你的 IP 地址,它运行的是多层检测体系:

  • TLS 指纹识别(JA3): Python 的 requests 库有独特的 TLS 签名,DataDome 可以立刻识别出来。
  • HTTP 请求头/协议检查: 它会检查浏览器请求头是否完整且一致;缺失或顺序异常都是危险信号。
  • JavaScript 指纹识别(Picasso 协议): 在浏览器里运行 JS 挑战,验证你是不是真人。
  • 行为机器学习: 每个请求分析 35+ 个信号,并配有 85,000+ 个站点级模型。
  • IP 信誉评分: 数据中心 IP 会被立即标记。
  • Cookie 验证: datadome Cookie 必须存在且有效。

你被拦截的迹象(以及如何检查)

最常见的坑之一是:你拿到了 200 OK 响应,但 HTML 实际上是一个验证码页面,而不是你想要的数据。其他迹象包括:

  • 403 Forbidden 错误
  • 重定向循环
  • 响应正文里包含 dd JavaScript 对象,或者滑块验证码 HTML

一定要检查响应正文,而不仅仅是状态码。可以这样快速判断:

if "captcha" in resp.text.lower() or "datadome" in resp.text.lower():
    print("被拦截了!拿到的是验证码页面,不是数据。")

能降低识别率的请求头和 Cookie

你不能保证绝对不会被拦,但更真实的请求头和 Cookie 管理会大有帮助:

session = requests.Session()
session.headers.update({
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/133.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="133", "Not-A.Brand";v="99", "Google Chrome";v="133"',
    "Sec-Ch-Ua-Mobile": "?0",
    "Sec-Ch-Ua-Platform": '"Windows"',
    "Sec-Fetch-Dest": "document",
    "Sec-Fetch-Mode": "navigate",
    "Sec-Fetch-Site": "none",
    "Upgrade-Insecure-Requests": "1",
})

另外还要注意:

  • 使用 requests.Session() 在请求之间保留 Cookie
  • 请求之间加入随机延迟(2–7 秒)。
  • 模拟引用链: 先访问首页,再访问搜索页,最后访问商品页。
  • 在规模化场景下,住宅代理轮换非常关键。数据中心 IP 几乎会立刻被标记。

这些技巧可以降低被识别的概率,但并不能彻底消除风险。对于高频抓取,你大概率还是需要代理服务或基于浏览器的方法。

配置 Python 环境,开始抓取 Etsy

开始之前:

  • 难度: 中级
  • 所需时间: 约 30–60 分钟(安装 + 第一次抓取)
  • 你需要准备: Python 3.8+、pip、代码编辑器、Chrome 浏览器(用于 DevTools 检查)

安装依赖

创建项目文件夹,搭建虚拟环境,并安装所需库:

mkdir etsy-scraper && cd etsy-scraper
python -m venv venv
source venv/bin/activate  # 在 Windows 上:venv\Scripts\activate

pip install requests beautifulsoup4 lxml pandas
  • requests — 获取网页
  • beautifulsoup4 — 解析 HTML
  • lxml — 更快的 HTML 解析器(可选,但推荐)
  • pandas — 将数据整理并导出为 CSV/Excel

如果后面你还需要浏览器自动化(用于登录或 JS 较重的页面),也安装:

pip install selenium

在写代码前先理解 Etsy 的页面结构

这里有一个非常省时间的技巧:Etsy 会在大多数页面的 <script type="application/ld+json"> 标签中嵌入结构化商品数据。这个 JSON-LD 数据已经组织好了——商品名称、价格、评分、图片——所以你不用为了每个字段都去折腾脆弱的 CSS 选择器。

打开任意 Etsy 商品页,右键选择“查看网页源代码”,然后搜索 application/ld+json。你会找到一个 @type: Product 的数据块,里面包含你需要的大部分信息。搜索结果页则是 @type: ItemList

CSS 选择器仍然有用(比如处理 JSON-LD 中没有的数据:运费详情或评论文本),但 JSON-LD 应该是你的首选。

步骤 1:用 Python 抓取 Etsy 搜索结果

对于大多数 Etsy 抓取项目来说,搜索结果页是起点——无论你是在监控细分市场、追踪竞争对手定价,还是在构建商品数据库。

构建搜索 URL

Etsy 的搜索 URL 形式如下:

https://www.etsy.com/search?q={keyword}&ref=pagination&page={page_number}

对于多词查询,要把空格进行 URL 编码(例如 handmade+jewelryhandmade%20jewelry)。ref=pagination 参数会让请求更像真实浏览器导航。

其他有用的参数包括:order(most_relevant、price_asc、price_desc、date_desc)、min_pricemax_priceship_tofree_shipping=true。每一页会返回 48 个商品

发送请求并解析 HTML

import requests
from bs4 import BeautifulSoup
import json
import time
import random

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
    "Accept-Language": "en-US,en;q=0.9",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
}

def scrape_etsy_search(query, max_pages=3):
    all_products = []
    for page in range(1, max_pages + 1):
        url = f"https://www.etsy.com/search?q={query}&ref=pagination&page={page}"
        resp = requests.get(url, headers=headers, timeout=30)
        if "captcha" in resp.text.lower():
            print(f"第 {page} 页被拦截了。试试加延迟或代理。")
            break
        soup = BeautifulSoup(resp.text, "lxml")
        for script in soup.find_all("script", type="application/ld+json"):
            data = json.loads(script.string)
            if data.get("@type") == "ItemList":
                for item in data.get("itemListElement", []):
                    all_products.append({
                        "name": item.get("name"),
                        "url": item.get("url"),
                        "image": item.get("image"),
                        "price": item.get("offers", {}).get("price"),
                        "currency": item.get("offers", {}).get("priceCurrency"),
                        "position": item.get("position"),
                    })
        time.sleep(random.uniform(2, 5))
    return all_products

从 JSON-LD 中提取商品数据

itemListElement 数组会给出每个商品的名称、URL、图片、价格和货币单位。如果你还需要星级评分或结果数量(这些不总是在 JSON-LD 中),就退回使用 CSS 选择器:

  • 商品卡片:.v2-listing-card
  • 标题:h3.v2-listing-card__title
  • 价格:span.currency-value
  • 链接:a.listing-link(href)

处理分页

循环遍历各页,并在每次请求之间加入随机延迟。Etsy 通常会根据查询返回 20–250 页不等。

results = scrape_etsy_search("handmade+jewelry", max_pages=5)
print(f"抓取了 {len(results)} 个商品。")

在我的测试里,抓取 5 页大约花了 20 秒;相比之下,手动复制粘贴要 30 多分钟。

步骤 2:用 Python 抓取 Etsy 商品页

一旦你从搜索结果中拿到了商品 URL,下一步就是抓取每个商品页的详细数据。

获取商品页

def scrape_etsy_product(url):
    resp = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(resp.text, "lxml")
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "Product":
            offers = data.get("offers", {})
            price = offers.get("price") or offers.get("lowPrice")
            rating_data = data.get("aggregateRating", {})
            return {
                "name": data.get("name"),
                "description": data.get("description", "")[:500],
                "brand": data.get("brand", {}).get("name") if isinstance(data.get("brand"), dict) else data.get("brand"),
                "category": data.get("category"),
                "price": price,
                "currency": offers.get("priceCurrency"),
                "availability": offers.get("availability"),
                "rating": rating_data.get("ratingValue"),
                "review_count": rating_data.get("reviewCount"),
                "images": data.get("image", []),
                "sku": data.get("sku"),
                "material": data.get("material"),
            }
    return None

处理价格区间

有些商品只有一个 offers.price。另一些商品(比如有尺寸或颜色变体)会使用 offers.lowPriceoffers.highPrice。上面的代码通过先取 price,再回退到 lowPrice 的方式兼容这两种情况。

使用 CSS 选择器解析额外字段

对于 JSON-LD 中没有的数据——运费信息、变体选项、完整卖家详情——你需要用 CSS 选择器:

  • 标题:h1[data-buy-box-listing-title]
  • 变体:select[data-selector-id]div[data-option-set]
  • 运费:运费区域附近的 div.wt-text-caption

权衡在于:JSON-LD 更干净,而且在页面布局变化时更稳定。CSS 选择器更脆弱,但能覆盖更多字段。

步骤 3:用 Python 抓取 Etsy 店铺页

这一部分通常是大多数竞争对手教程会直接跳过的,但它其实对销售团队和竞品分析师来说最有价值。

构建店铺 URL 并抓取页面

def scrape_etsy_shop(shop_name):
    url = f"https://www.etsy.com/shop/{shop_name}"
    resp = requests.get(url, headers=headers, timeout=30)
    soup = BeautifulSoup(resp.text, "lxml")

    # 从 HTML 中抓取店铺元数据(不在 JSON-LD 中)
    sales_el = soup.select_one("div.shop-sales-reviews a")
    rating_el = soup.find("input", {"name": "initial-rating"})
    location_el = soup.select_one("div.shop-location")

    shop_data = {
        "name": shop_name,
        "sales": sales_el.text.strip() if sales_el else None,
        "rating": rating_el["value"] if rating_el else None,
        "location": location_el.text.strip() if location_el else None,
    }

    # 从 JSON-LD 中抓取商品列表
    listings = []
    for script in soup.find_all("script", type="application/ld+json"):
        data = json.loads(script.string)
        if data.get("@type") == "ItemList":
            for item in data.get("itemListElement", []):
                listings.append({
                    "name": item.get("name"),
                    "url": item.get("url"),
                    "price": item.get("offers", {}).get("price"),
                })
    shop_data["listings"] = listings
    return shop_data

你能从店铺页提取什么

店铺页上的 JSON-LD 类型是 @type: ItemList——它包含商品列表,但不包含销量、所在地或评分这类店铺级元数据。对于这些字段,你需要 CSS 选择器:

数据点选择器说明
店铺名称h1 或 meta title通常在页面标题中
总销量div.shop-sales-reviews a文本类似“12,345 sales”
星级评分input[name="initial-rating"] 的 value数值 1–5
所在地div.shop-location城市、国家
成为会员时间div.shop-info日期文本

店铺数据对于构建潜在客户名单、竞品基准对比,或者识别某个细分领域里的头部卖家,价值都非常高。

步骤 4:用 Python 抓取 Etsy 评论

评论是 Etsy 上最有价值、但也最棘手的数据之一。完整评论文本、评分和日期不会出现在初始页面 HTML 里;它们是通过内部 API 接口加载的。

方法 1:找到 Etsy 内部评论 API 接口

在 Chrome 中打开商品页,打开开发者工具(F12),切换到 Network 标签页,然后向下滚动到评论区域。你会看到一个 POST 请求,类似这样:

https://www.etsy.com/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews

这个接口会返回包含评论卡片的 HTML 片段。要使用它,你需要:

  • listing_id —— 商品 URL 中的数字 ID
  • shop_id —— 从商品页 HTML 中用正则提取
  • csrf_nonce —— 从页面的 <meta> 标签中提取

提取 ID 和 CSRF 令牌

import re

def get_review_params(product_url):
    resp = requests.get(product_url, headers=headers)
    html = resp.text
    listing_id = product_url.split("/")[-1].split("?")[0]
    shop_id_match = re.search(r'"shopId"\s*:\s*(\d+)', html)
    shop_id = shop_id_match.group(1) if shop_id_match else None
    soup = BeautifulSoup(html, "lxml")
    csrf_meta = soup.find("meta", {"name": "csrf_nonce"})
    csrf = csrf_meta["content"] if csrf_meta else None
    return listing_id, shop_id, csrf

带分页抓取评论

def scrape_reviews(listing_id, shop_id, csrf, max_pages=5):
    session = requests.Session()
    session.headers.update(headers)
    all_reviews = []
    for page in range(1, max_pages + 1):
        payload = {
            "specs": {
                "deep_dive_reviews": {
                    "module_path": "neu/specs/deep_dive_reviews",
                    "listing_id": listing_id,
                    "shop_id": shop_id,
                    "page": page,
                }
            }
        }
        resp = session.post(
            "https://www.etsy.com/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews",
            json=payload,
            headers={"x-csrf-token": csrf, "Content-Type": "application/json"},
        )
        data = resp.json()
        html_fragment = data.get("output", {}).get("deep_dive_reviews", "")
        review_soup = BeautifulSoup(html_fragment, "lxml")
        for card in review_soup.select("div.review-card"):
            rating_el = card.find("input", {"name": "rating"})
            text_el = card.select_one("div.wt-text-body")
            user_el = card.select_one("a[data-review-username]")
            date_el = card.select_one("p.wt-text-body-small")
            all_reviews.append({
                "rating": rating_el["value"] if rating_el else None,
                "text": text_el.text.strip() if text_el else None,
                "reviewer": user_el.text.strip() if user_el else None,
                "date": date_el.text.strip() if date_el else None,
            })
        time.sleep(random.uniform(2, 5))
    return all_reviews

方法 2:直接从 HTML 解析评论(备用方案)

如果 API 方式失败了(例如因为 CSRF 令牌问题),你可以直接从商品页 HTML 中解析第一页评论。限制是:静态 HTML 里只有第一批评论。想抓更多,就需要 API 或 Selenium 这类浏览器自动化工具。

处理需要登录的数据:抓取你自己的 Etsy 店铺

这是一块其他教程几乎不会讲到的空白,但它是现实中的真实需求——尤其是 Etsy 卖家,他们往往想提取自己的订单、收入和店铺统计。

问题在于:只有 requests 的话,无法访问你的 Etsy 仪表盘,因为它不携带你的登录会话 Cookie。

方案 1:用 Selenium 手动登录并捕获 Cookie

使用 Selenium 打开浏览器,手动登录(或者自动登录),然后在认证状态下继续抓取:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://www.etsy.com/signin")
# 在浏览器窗口里手动登录,然后:
input("登录完成后按回车...")

cookies = driver.get_cookies()
# 然后可以用 driver.get() 访问你的仪表盘页面并抓取

你也可以把 Selenium 会话中的 Cookie 保存下来,之后在 requests.Session() 里复用,这样在完成首次登录后,抓取会更快、更轻量。

方案 2:导出浏览器 Cookie 并交给 Requests 使用

使用浏览器扩展(例如“EditThisCookie”)导出你当前的 Etsy 会话 Cookie,然后加载到 Requests 会话中:

import requests

session = requests.Session()
# 添加从浏览器导出的 Cookie
session.cookies.set("uaid", "YOUR_UAID_VALUE", domain=".etsy.com")
session.cookies.set("user_prefs", "YOUR_USER_PREFS_VALUE", domain=".etsy.com")
# ... 按需添加其他会话 Cookie

resp = session.get("https://www.etsy.com/your/orders", headers=headers)

更轻松的路径:Thunderbit 的浏览器抓取模式

因为 Thunderbit 运行在你的 Chrome 浏览器中,它会自动继承你当前的 Etsy 会话。无需认证代码,也无需导出 Cookie——只要打开你的 Etsy 仪表盘,然后开始抓取即可。对于提取订单、收入、统计数据以及其他仅卖家可见的信息,这个功能真的非常实用,而且不需要任何脚本。

用 AI 抓取你的 Etsy 仪表盘

导出并使用你抓取到的 Etsy 数据

保存为 CSV 或 JSON

import pandas as pd

df = pd.DataFrame(results)
df.to_csv("etsy_products.csv", index=False, encoding="utf-8")
df.to_json("etsy_products.json", orient="records", indent=2)

最佳实践:文件名里带上时间戳,使用 UTF-8 编码,并处理商品名称中的特殊字符(Etsy 卖家很爱用表情符号和带重音的字符)。

导出到 Google Sheets、Airtable 或 Notion

对于 Python 用户来说,像 gspread(Google Sheets)或 Airtable API 这样的库都可以让你通过程序把数据推送过去。但如果你用的是 Thunderbit,所有导出——到 Google Sheets、Excel、Airtable 和 Notion——都是免费的,而且只需一键完成。无需 API 密钥,也不需要 OAuth 配置。

跳过代码:如何用 Thunderbit 抓取 Etsy(无代码替代方案)

不是每个人都想写 Python 脚本、维护代理配置,或者在凌晨两点调试 CSS 选择器。如果你就是这种情况,下面教你如何用 Thunderbit 获取 Etsy 数据。

安装 Thunderbit Chrome 扩展

前往 Chrome 网上应用店 安装 Thunderbit。注册一个免费账号——免费版每月提供 6 页,而且所有导出都免费。

在任意 Etsy 页面上使用 AI 智能推荐字段

打开 Etsy 的搜索页、商品页或店铺页。然后在 Thunderbit 侧边栏点击 “AI 智能推荐字段”。AI 会扫描页面并推荐列——商品名称、价格、评分、图片、店铺名称、标签、运费信息等。你可以按需调整或新增列。

点击抓取并导出

点击 “抓取” 即可提取当前页面的数据。对于多页结果,可以使用 Thunderbit 的分页抓取功能。若要把商品 URL 列表补充为每个商品页的详细信息(描述、评论、运费),可以使用 子页面抓取——Thunderbit 会自动访问每个链接并提取额外数据。

导出到 Excel、Google Sheets、Airtable 或 Notion——全部免费。

为什么在 Etsy 抓取上 Thunderbit 比 Python 更好用

  • 无需代理配置,也不用写反爬代码。 Thunderbit 运行在你真实的 Chrome 浏览器里,因此会继承你的会话,并且在 DataDome 看来就像正常用户。
  • AI 会自动适应页面布局变化。 Etsy 更新前端时,不会因为选择器失效而崩掉。
  • 非常适合一次性调研、竞品分析或非技术团队成员。 如果你只是需要一个快速数据集,就没必要搭 Python 环境。
  • 子页面抓取 可以把商品 URL 列表丰富成包含详细数据的表格,而不用写嵌套循环。

想看实际操作,可以去看看 Thunderbit 的 YouTube 频道

Python vs Thunderbit:6 个月成本对比

因素Python 自建Thunderbit
搭建时间8–20 小时5 分钟以内
6 个月成本(含人力、代理)$2,720–9,450$90–228
每月维护4–10+ 小时(选择器更新 = 80%+ 开销)0–1 小时
反爬处理住宅代理,信用成本是正常的 85 倍基于浏览器,原生绕过 DataDome
数据质量高(但需要投入)高(AI 驱动)

我不是在说 Python 是错误选择——如果你需要完全控制、自定义逻辑,或者要集成到更大的数据管道里,代码仍然是王道。但对于大多数只需要 Etsy 数据的业务用户来说,ROI 算下来无代码工具更划算。

抓取 Etsy 的法律与道德建议

每篇爬虫文章里都会有人问合法性,所以这里给你一个简短版本:

  • Etsy 的服务条款明确禁止自动化访问。 不过 Etsy 主要依赖技术手段(DataDome)而不是诉讼,目前还没有已知针对爬虫的 Etsy 相关诉讼。
  • 只抓取公开可用的数据。 不要绕过认证,也不要访问你不拥有的私密卖家仪表盘。
  • 保持合理请求频率。 请求之间间隔 2–7 秒,不要猛轰 Etsy 服务器。
  • 尊重 robots.txt Etsy 允许搜索页,但限制了部分路径。
  • 按照 GDPR 等隐私法规妥善处理个人数据。
  • 商业规模的抓取项目,建议咨询法律顾问。

更多背景可以看我们关于网页爬虫法律影响的文章——其中包括 Meta 诉 Bright Data(2024)案,法院确认了公开数据抓取的合法性。

总结:关键要点

这里讲了很多内容。你可以把这些要点带走:

  • Etsy 的 JSON-LD 结构化数据 让大多数字段的提取,比直接解析原始 HTML 更干净。
  • DataDome 是一个真正的障碍——如果你用 Python 大规模抓取,就要配合合适的请求头、延迟、Cookie 管理和住宅代理。
  • Etsy API 功能有限。 如果你需要评论、竞争对手店铺或跨卖家分析,抓取才是更现实的路径。
  • Thunderbit 提供了无代码替代方案,可以原生处理反爬和认证——如果你想拿到 Etsy 数据又不想维护脚本,非常值得一试。
  • 始终负责任地抓取,并尊重 Etsy 的条款。

如果你想不写代码就开始,可以免费试用 Thunderbit。或者直接用本教程里的 Python 代码,构建你自己的定制爬虫——愿你的选择器永远不要在周五下午崩掉。

想看更多抓取指南,可以查看我们的如何用 Etsy 爬虫提升销量最佳 AI 网页爬虫合集。

试试 Thunderbit,更快抓取 Etsy 数据 Get Started Free

常见问题

1. 用 Python 抓取 Etsy 合法吗?

抓取公开可用的数据,在最近的法律先例中通常是允许的(例如 Meta 诉 Bright Data、hiQ 诉 LinkedIn)。不过,Etsy 的服务条款禁止自动化访问,所以在抓取前一定要先查看他们的 ToS 和 robots.txt。如果是大规模或商业用途,建议咨询法律顾问。

2. 我能在不被封的情况下抓取 Etsy 吗?

Etsy 使用 DataDome,这是目前最强势的反爬系统之一。真实的请求头、请求延迟、Cookie 持久化以及住宅代理轮换,都有助于减少封禁。Thunderbit 的浏览器原生方式则能避开大部分识别,因为它是在你真实的 Chrome 会话中运行。

3. Etsy 有 API 可以替代抓取吗?

有,Etsy 提供了 API v3,但它基本只限于你自己的店铺数据,而且没有强力的评论访问能力。大多数竞争情报和跨店铺分析场景,还是需要抓取。

4. 抓取 Etsy 需要哪些 Python 库?

至少需要:requestsbeautifulsoup4pandas(用于导出)和 json(内置)。如果是 JS 较多或需要登录的页面,再加上 selenium。想更快解析 HTML,可以用 lxml

5. 我该如何专门抓取 Etsy 评论?

Etsy 评论是通过内部 API 接口(/api/v3/ajax/bespoke/member/neu/specs/deep_dive_reviews)加载的。你需要先从商品页提取 listing ID、shop ID 和 CSRF token,然后带分页向该接口发送 POST 请求。作为备用方案,你也可以直接从商品页 HTML 中解析第一批评论——这两种方式在本教程里都已经一步一步讲解。

延伸阅读

Shuai Guan
Shuai Guan
Thunderbit 首席执行官|AI 数据自动化专家 Shuai Guan 是 Thunderbit 的首席执行官,也是密歇根大学工程学院校友。凭借近十年的科技与 SaaS 架构经验,他专注于将复杂的 AI 模型转化为实用、免代码的数据提取工具。在本博客中,他分享自己经过实战检验、毫无保留的网页爬取与自动化策略,帮助您构建更智能、以数据为驱动的工作流。当他不在优化数据流程时,也会将同样的细致投入到摄影爱好中。
目录

只要开口,就能抓取网页

用简单英文说出你的需求。或者更简单,什么都不用说。

试用 Thunderbit 免费
使用 AI 提取数据
轻松将数据传输到 Google Sheets、Airtable 或 Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week