Etsyショップと商品データ(タグ、価格、評価)のスクレイピング方法

Etsyは、商品ページごとにJSONの塊に名前、価格、評価、タグといったクリーンで構造化されたデータを隠しています。HTMLと格闘する代わりにそれを解析し、競合他社が費用をかけて行うキーワードリサーチのためにそのタグを抽出しましょう。

Etsyは商品とキーワードリサーチの宝庫です - 数百万のアクティブリスティングがあり、それぞれが実際の購入者によってタグ付けされ、評価されています。ただし、公式Open API v3は1日約10,000リクエスト、1秒あたり10リクエストに制限され、興味深いエンドポイントはOAuthの背後にあります。実際の規模での競合他社や市場調査には、公開ページをスクレイピングする必要があります。良いニュースは、どこを見ればクリーンで構造化されたデータをEtsyが提供してくれることです。このガイドでは、HTMLと格闘せずに価格、評価、タグを含むEtsyのショップと商品データを信頼できる方法でスクレイピングする方法を紹介します。

信頼できるトリック:HTMLではなくld+jsonを解析する

Etsyの各商品ページには、<script type="application/ld+json">ブロックが埋め込まれています:schema.orgのProductデータで、タイトル、SKU、価格、通貨、星の値とレビュー数を持つaggregateRatingが含まれています。このJSONを解析することは、Etsyが回転させるCSSクラスを追いかけるよりもはるかに安定しています。プロキシを通じてページを読み込み、塊を引き出せば、数行でクリーンな記録が得られます。

import json, requests
from bs4 import BeautifulSoup

proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}

def scrape_listing(url):
    r = requests.get(url, proxies=proxies, timeout=20)
    soup = BeautifulSoup(r.text, "html.parser")
    blob = soup.find("script", {"type": "application/ld+json"})
    data = json.loads(blob.string)
    return {
        "title":  data.get("name"),
        "price":  data.get("offers", {}).get("price"),
        "curr":   data.get("offers", {}).get("priceCurrency"),
        "rating": data.get("aggregateRating", {}).get("ratingValue"),
        "reviews": data.get("aggregateRating", {}).get("reviewCount"),
    }

print(scrape_listing("https://www.etsy.com/listing/1234567890/example"))
検索ページからリスティングIDへのEtsyスクレイピングパイプラインの図
検索ページはIDを表示します;各商品ページのld+json塊には構造化された記録が含まれています。

引き出す価値のあるフィールド - 特にタグ

価格や評価を超えて、最も価値のあるシグナルはタグです。Etsyの各リスティングは最大13のタグを持つことができ、これらは売り手が買い手が検索すると思うフレーズそのものです。カテゴリ内のトップセリングリスティング全体でタグを収集すると、キーワードマップを逆に構築したことになります - これは専門のSEOツールが再販するデータと同じです。レビュー数を需要のプロキシとして組み合わせることで、実際に売れているものによってカテゴリをランク付けすることができます。リスティングの「お気に入り」数や利用可能な場合はリストされた日付を追加することで、ターゲットにする価値のあるキーワードと、単に忙しそうに見えるだけのキーワードを区別することができます。これがスクレイピングが有料のデータセットよりも早く元が取れる理由です。商品レビューのスクレイピングガイドでは、そのレビューのテキストを感情シグナルに変える方法を紹介しています。

検索ページとショップページのスクレイピング

検索ページとショップページは異なる動作をします。ld+jsonはページが数十のアイテムをレンダリングしている場合でも最初の8つのアイテムしかリストしないので、リスティングの発見にはJSONではなくHTMLカードを解析します。リスティングリンクを取得し、数値IDを重複排除してから、完全な記録を取得するために各商品ページを取得します。Etsyの検索URLはページパラメータを受け入れるので、ループで結果を歩くことができます:

import re

def find_listing_ids(query, pages=3):
    ids = set()
    for page in range(1, pages + 1):
        url = f"https://www.etsy.com/search?q={query}&page={page}"
        r = requests.get(url, proxies=proxies, timeout=20)
        # listing links look like /listing/<id>/<slug>
        for m in re.findall(r"/listing/(\d+)/", r.text):
            ids.add(m)
    return ids

ids = find_listing_ids("ceramic+mug", pages=3)
print(len(ids), "unique listings")

商品画像はi.etsystatic.com CDNにあり、サムネイルが必要な場合はマークアップに直接リンクされています。ショップレベルの調査では、ショップページには売り手の評価、販売数、ポリシーが含まれており、競合他社をボリュームでランク付けするのに役立ちます。

マーケットプレイススクレイピング用に構築された住宅IPを取得する

バリエーション、ページネーション、帯域幅を低く保つ

おもちゃのスクレイパーとスケールで動作するものを分ける2つの詳細があります。まず、バリエーション:多くのEtsyリスティングは複数のオプションを販売しています - サイズ、色、パーソナライズ - それぞれが独自の価格を持っています。ld+jsonのoffersフィールドは単一のオブジェクトまたはそれらの配列である可能性があるため、両方を処理しないと、最初の価格だけを静かに記録し、カテゴリ全体を誤読することになります。次に、ページネーション:検索結果はページ分けされており、Etsyは単一のクエリでどれだけ深く歩けるかを制限しています。広い用語の終わりまでページを進めようとするのではなく、カテゴリをより狭いクエリに分割します(素材、スタイル、価格帯ごとに)。そうすることで、各検索が浅く完全なセットを返し、1つのスクレイパーが「ギフト」のページ40を通過するよりも少ないアンチボットチェックを引き起こします。

帯域幅はマーケットプレイススクレイピングで忍び寄るコストです。完全なEtsy商品ページは、多くの画像やスクリプトを引き出しますが、ld+jsonだけが必要な場合は必要ありません。プレーンHTTPで取得すると、すでに画像のダウンロードをスキップしています - マークアップはテキストです。JavaScriptレンダリングは、本当に必要なページにのみ予約してください。レンダリングされたページは生のフェッチの何倍ものバイト数を要する可能性があります。積極的にキャッシュしてください:リスティングのタグとタイトルは時間ごとにほとんど変わらないので、条件付きリフレッシュがすべてを再ダウンロードするよりも優れています。プロキシ帯域幅コスト削減ガイドでは、HEADチェックとアセットブロッキングの戦術をカバーしており、GBあたりの請求を合理的に保ちます。

CAPTCHAの壁を越える

Etsyはアンチボットチェックを実行しており、ヘッドレスブラウザやデータセンターIPが検索ページをヒットするとすぐにCAPTCHAをトリガーします。これを通過するための3つの方法があります。まず、住宅プロキシを使用します - 本物のISP割り当てIPはサーバーではなく買い物客として読み取られます。次に、調査しているマーケットプレイスにジオを合わせます;価格と配送見積もりは国によって変わります。最後に、ペースを調整します - 一定で人間のような間隔がバーストを上回ります。レンダリングとリトライを全く管理したくない場合は、Scraper APIが指紋、回転、JavaScriptを処理し、解析されたページを返します。これは通常、ヘッドレスフリートを維持するよりも少ないコードです。より広範なパターンについては、Amazon、eBay、Etsyのマーケットプレイス自動化ガイドをご覧ください。

倫理に関する一言:公開リスティングデータをスクレイピングし、Etsyの利用規約とrobots指令を尊重し、売り手の個人連絡先を収集しないでください - それは市場調査からデータ保護問題に踏み込むことになります。これはガイダンスであり、法的アドバイスではありません;ご自身の使用ケースを確認してください。

Etsyはld+jsonで8つのリスティング、リスティングごとに13のタグ、1日あたりのAPI制限10,000を公開していることを示す統計パネル
公開ページはAPIが返すよりも多くの情報を持っています - あなたのIPがブロックなしでそれに到達できるなら。

よくある質問

Etsyからデータをどのようにスクレイピングしますか?

各商品ページを住宅プロキシを通じて読み込み、クリーンなschema.orgデータとしてタイトル、価格、通貨、評価を保持する埋め込まれたld+jsonブロックを解析します。発見のためには、検索ページのHTMLカードを解析してリスティングIDを収集し、各商品ページを取得します。これは回転するCSSクラスをスクレイピングするよりも安定しています。

Etsyにはスクレイピング用のAPIがありますか?

Etsyの公式Open API v3は存在しますが、1日約10,000リクエスト、1秒あたり10リクエストに制限され、多くのエンドポイントはOAuthの背後にあります。競合他社の調査を大規模に行うために、多くの人々は公開ページをスクレイピングします。これには、各リスティングの完全なタグリストを含む、APIが返すよりも多くの情報が含まれています。

キーワードリサーチのためにEtsyのタグをどのように取得しますか?

各リスティングはページマークアップに最大13のタグを持つことができます。カテゴリ内のトップセリングリスティングをスクレイピングし、そのタグを収集し、頻度でランク付けしてキーワードマップを構築します。レビュー数で重み付けすることで需要を概算し、何が売れているか、買い手が何を検索しているかのデータに基づいた絵を描くことができます。

Etsyはなぜスクレイピング時にCAPTCHAを表示するのですか?

データセンターIPや攻撃的なヘッドレスブラウザはボットとして読み取られます。住宅プロキシを使用してリクエストが本物の買い物客のように見えるようにし、ジオをマーケットプレイスに合わせ、リクエストを人間のような間隔でペースを調整します。レンダリングと回転を行うScraper APIを使用すると、追加のコードなしでほとんどのCAPTCHAトリガーを除去できます。

Etsyをうまくスクレイピングするには、すでに提供されているJSONを読み、ブロックなしでページに到達することが重要です。ld+jsonを解析し、タグを抽出し、クリーンな住宅IPにリクエストを分散させれば、価格、評価、検索意図のライブフィードを得ることができます - 本当の製品調査のための原材料です。

Scraper APIでEtsyをスケールでスクレイピング