eBay検索結果のスクレイピング方法:セッションウォームアップとアンチ検出ガイド
Advanced Data Extraction Specialist
主要なポイント:
- eBayの検索エンドポイントへのコールドリクエストはブロックされる。
https://www.ebay.com/sch/i.html?_nkw=laptopへの直接の自動ナビゲーションは、クリーンな米国居住者のクラウドブラウザセッションからでもeBayのエラーページに到達する。eBayは検索パスを、アイテムやブラウズページよりも厳しく制限している。 - セッションを温めることが解決策。 一つの持続的なクラウドブラウザセッションを開き、まずeBayのホームページにアクセスしてクッキーとナビゲーション状態を整え、その同じセッションで検索URLに移動する。その後、検索ページは完全な結果グリッドを表示して読み込まれる。
.su-card-containerのアンカー抽出。 eBayは結果カードのマークアップを変更したため、以前のli.s-itemセレクターは何も一致しなくなった。現在のオーガニック結果カードは.su-card-containerクラスを持っている — それを選択し、各カードの子フィールドを読み取る。- 統合は単一のCDPエンドポイント。 APIキーを使って一つのScrapeless Scraping Browser WebSocket URLを構築し、Playwrightの
connect_over_cdpを使用することで、ローカルブラウザのように正確に操作される — したがって、レンダリング、居住者出口、およびフィンガープリンティングはすべてクラウド側で行われる。 - 居住者出口がランを持つ。 Scrapeless Scraping Browserは195以上の国で居住者プロキシを通じてルーティングし、各セッションごとにブラウザフィンガープリンティングをランダム化するため、クラウドブラウザはローカルの自動ブラウザがフィルタリングされるeBayページをレンダリングする。
- 無料で始める。 新しいScrapelessアカウントには、無料のScraping Browserランタイムが含まれている — app.scrapeless.comでサインアップ。
はじめに: なぜeBayの検索ページは明らかなアプローチをブロックするのか
eBayはウェブ上で最大の公的マーケットプレイスの一つであり、その検索結果は価格、リスト、競争データの濃密なソースである。価格チームは比較可能なアイテムが売れている価格を追跡し、ブランド保護チームは無許可のリストを監視し、AIエージェントはリストのコンテキストを引き出して製品の質問に回答する。すべては /sch/i.html の検索エンドポイントの背後に存在する。
明らかなアプローチ — そのURLにHTTPクライアントまたはローカルヘッドレスブラウザをポイントすること — はすぐに失敗する。https://www.ebay.com/sch/i.html?_nkw=laptop へのコールド自動リクエストは結果ではなくeBayのエラーページにたどり着く。これはクリーンな米国居住者IPからでも発生する: eBayはIPの評判、デバイスのフィンガープリンティング、リクエスト頻度、行動信号を評価し、アイテムやブラウズページよりも検索パスをより厳しく制限する。そのページは人間に対して表示され、スクリプトに対してはブロックされる。
このチュートリアルでは、オーセンティックな訪問者が行うようにそのゲートをクリアするPythonパイプラインをScrapeless Scraping Browserの上に構築する — まずホームページに到達してセッションを温め、同じセッション内で検索に移動する。CDP経由でクラウドブラウザに接続し、正式にサポートされたクライアントであるPlaywrightを使用することで、レンダリング、居住者出口、および対検出フィンガープリンティングがすべてクラウド側で行われる。異なる大規模マーケットプレイスの同じプリミティブを使用したビルドについては、ベストAmazonスクレイパー紹介を、ツール間でのローカライズ価格比較については2026年のベストZillowスクレイパーをご覧ください。
それを使ってできること
温かいセッションパターン — 最初にホームページ、次に検索および詳細ページを一つの保持されたクラウドブラウザセッションで — はeBayデータパイプラインに必要な仕事のほとんどをカバーする:
- 競合の価格を追跡。 検索クエリの各結果カードから価格とリストタイトルを引き出し、自分のカタログと比較するスケジュールで。
- 商品カテゴリーを監視。 カテゴリーやキーワードクエリをページ全体で歩き回り、リストを型付きのレコードに集めてトレンド分析を行う。
- 無許可のリストを監視。 自ブランドやSKUを検索し、それを掲載すべきではない販売者をフラグ付けする。
- 地理特有の結果をキャプチャ。 米国居住者出口に固定して、米国の買い物客が見るリスト、通貨、および入手可能性を確認する。オフィスIPが解決する内容とは異なる。
- AIエージェントにリストのコンテキストを送信。 検索とアイテムページをレンダリングし、構造化フィールドをクリアにして、リトリーバルレイヤーやエージェントが最新データで製品の質問に答えられるようにする。
- 価格履歴データセットを構築。 同じクエリを時間ごとにスナップショットを取り、レンダリングされた結果を保存して価格の動きを研究する。
なぜScrapeless Scraping Browserなのか
Scrapeless Scraping Browserは、ウェブクローラーやAIエージェント向けに設計されたカスタマイズ可能で対検出のクラウドブラウザである。特にeBayには以下の機能がある:
- 対検出クラウドブラウザ。 フルクラウドサイドのJavaScriptレンダリングを備えた自社開発のChromiumを実行するため、検索グリッド、レイジーロードされた画像、アイテムの詳細は解析前に水分を吸収する。
- 195以上の国の住宅プロキシ。 接続URLに
proxyCountryを設定すると、クラウドブラウザはターゲットとする地域の実際の住宅IPからエグレスするため、eBayは地元の買い物客が見るものを返します。 - セッションごとのフィンガープリンティングのランダム化。 各セッションにはランダム化されたフィンガープリント(ユーザーエージェント、タイムゾーン、WebGL、キャンバス)が付与され、したがって自動化されたブラウザは一つの検出可能なアイデンティティに崩れ落ちることはありません。
sessionTTLを介したセッションの持続。 接続URLにsessionTTLを設定することで、ホームページのウォームアップと検索ナビゲーションの間で一つのセッションを維持し、クッキーとナビゲーションの状態が一度の実行内のリクエスト間で持ち越されます。- 単一のCDPエンドポイント。 APIキーで1つのWebSocket URLを構築します。Playwrightの
connect_over_cdpは、あたかもローカルブラウザのようにこれを駆動するため、あなたの解析コードは変更されません。
ランタイムは無料で始まり、使用に応じてスケールします — Scrapelessの料金を参照してティアを確認し、app.scrapeless.comの無料プランでAPIキーを取得してください。
前提条件
開始する前に、次のものを持っていることを確認してください:
- Python 3.10以上 — 下記のフェッチャーライブラリによって必要。
- pip — パッケージをインストールするために。
- ScrapelessアカウントおよびAPIキー — app.scrapeless.comで無料プランにサインアップし、設定 → APIキー管理からキーを取得してください。
- CSSセレクターとターミナルの基本的な理解 — ページを取得し、その中から値を引き出すために両方を使用します。
インストール
必要なパッケージは1つ:Python用のPlaywright、Scrapelessスクレイピングブラウザの公式サポートクライアントです。
1. Playwrightをインストール
bash
pip install playwright
Playwrightのconnect_over_cdpはリモートのScrapelessクラウドブラウザに接続しますので、playwright installを実行したり、ローカルブラウザのバイナリをダウンロードしたりする必要はありません — レンダリングはクラウド側で行われます。Playwrightは複数のページ読み込みを跨いで一つの接続を保持し、これによりホームページのウォームアップと検索が一つのセッションアイデンティティを共有できます。
2. Scrapeless APIキーを設定する
接続URLに載せられるようにキーをエクスポートします:
bash
export SCRAPELESS_API_KEY=your_api_token_here
Windowsの場合、setx SCRAPELESS_API_KEY "your_api_token_here"(永続的、新しいシェル)または$env:SCRAPELESS_API_KEY="your_api_token_here"(現在のPowerShellセッション)を使用します。以下の接続ヘルパーはこの変数を読み取り、URLにtokenとして埋め込みます。
ステップ1 — 接続を構築し、コールドリクエストがブロックされていることを確認
まず、ブロックを再現して、パイプラインの残りの部分に明確なベースラインを持たせます。ScrapelessスクレイピングブラウザのURLを構築し、Playwrightで接続し、ホームページを訪れることなく直接検索エンドポイントにナビゲートします。
python
import os
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright
def scraping_browser_url(proxy_country="US", session_ttl=240):
# APIキーは`token`としてURLに載せられ、エグレスとライフタイムはクエリパラメータです。
params = urlencode({
"token": os.environ["SCRAPELESS_API_KEY"],
"sessionTTL": session_ttl,
"proxyCountry": proxy_country,
})
return f"wss://browser.scrapeless.com/api/v2/browser?{params}"
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# コールドナビゲーションが直接検索エンドポイントに行き、ホームページのウォームアップはなし。
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
wait_until="domcontentloaded")
print(page.title()) # -> "Error Page | eBay" / "Access Denied"
browser.close()
コールドの自動ナビゲーションが/sch/i.htmlに行くと、クリーンなUS住宅IPからエグレスしているにもかかわらず、eBayのエラーページに着きます。eBayは検索エンドポイントをセンシティブなパスと見なしており、確立されたブラウジングコンテキストなしで到着するリクエストに挑戦します。修正は異なるヘッダーや異なるIPではなく、人が到着する方法で到着することです。次のステップはそれです。
ステップ2 — ホームページでセッションをウォームアップした後、検索
解決策は維持されたセッションです。1つのクラウドブラウザ接続を開き、最初にeBayのホームページをロードしてクッキーとナビゲーション状態を設定し、その後同じセッション内で検索URLにナビゲートします。PlaywrightはScrapelessクラウドブラウザへの単一のCDP接続を保持し、それを通じてすべてのページを駆動するため、ウォームアップと検索は一つのアイデンティティを共有します。
python
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US"))
page = browser.new_page()
# 1. セッションをウォームアップ: ホームページに着いてクッキー/ナビゲーション状態を設定します。
page.goto("https://www.ebay.com/", wait_until="domcontentloaded")
page.wait_for_timeout(2500)
# 2. その同じセッションで検索にナビゲートします。
page.goto("https://www.ebay.com/sch/i.html?_nkw=laptop",
wait_until="domcontentloaded")
page.wait_for_timeout(3000) # グリッドをハイドレートさせる
print(page.title()) # -> "Laptop for sale | eBay"
cards = page.query_selector_all(".su-card-container") # レンダリングされた結果カード
print(len(cards), "cards") # グリッドが今や populated している
ステップ 3 — 結果カードの抽出
eBayは結果カードのマークアップを回転させたので、現在のクラスに基づいている。オーガニックな結果カードは**.su-card-container**を持っており、古いli.s-itemセレクタは今は何も一致しない。カードを選択し、各カードから子フィールドを読み取る。
python
def text_of(el, selector):
node = el.query_selector(selector)
return node.inner_text().strip() if node else None
records = []
for card in page.query_selector_all(".su-card-container"):
# 子セレクタは説明的 — 現在のeBay DOMに対してタイトル/価格/リンクノードを確認せよ
title = text_of(card, ".su-styled-text") # リスティングタイトル(説明的なパス)
price = text_of(card, ".su-styled-text.s-price") # 価格テキスト(説明的なパス)
link_el = card.query_selector("a") # リスティングURL
link = link_el.get_attribute("href") if link_el else None
records.append({
"title": title,
"price": price,
"link": link,
})
print(len(records), "リスティング")
すべての抽出を.su-card-containerに基づけ、子セレクタ(title、price、link)をライブDOMに対して確認するための出発点として扱う。eBayはカードラッパーとは独立して内部マークアップをシャッフルするからだ。すべての欠損フィールドをNoneにデフォルト設定し、スパースなカードが実行をクラッシュさせないようにする — eBayは一部のリスティングフォーマット(入札中のオークション、「詳細を見る」配置)では価格を省略し、いくつかのカードは異なる形のスポンサー枠である。
無料プランでAPIキーを取得: app.scrapeless.com
ステップ 4 — 結果をページングしてリスティングの詳細ページに移動
ほとんどの実作業は1つ以上のURLにわたる。セッションがすでに温かく保持されているため、結果をページングし、各リスティングのアイテムページに移動することは追加コストを伴わない — 同じクッキー、住宅ID、フィンガープリントが全体を通じて持ち回りされる。eBayは検索エンドポイントを_pgnクエリパラメータでページ分けする。
python
rows = []
with sync_playwright() as p:
browser = p.chromium.connect_over_cdp(scraping_browser_url("US", session_ttl=300))
page = browser.new_page()
page.goto("https://www.ebay.com/", wait_until="domcontentloaded") # 一度温める
page.wait_for_timeout(2500)
for n in range(1, 4): # ページ1..3
url = f"https://www.ebay.com/sch/i.html?_nkw=laptop&_pgn={n}"
page.goto(url, wait_until="domcontentloaded")
page.wait_for_timeout(3000)
for card in page.query_selector_all(".su-card-container"):
link_el = card.query_selector("a")
if link_el and link_el.get_attribute("href"):
rows.append({"link": link_el.get_attribute("href")})
# 同じ温かいセッションでリスティングのアイテムページに移動
if rows:
page.goto(rows[0]["link"], wait_until="domcontentloaded")
h1 = page.query_selector("h1") # アイテムページの見出し(DOMに対して確認)
item_title = h1.inner_text() if h1 else None
browser.close()
print(len(rows), "収集したリスティング")
ホームページのウォームアップはセッションの最初に一度行われ、以降の検索ページやアイテムページは確立されたコンテキストを再利用する。アイテムページやブラウズや取引ページは、セッションが温かくなると直接レンダリングされる — より重いゲートは特に検索エンドポイントにあります。リストから詳細へのクロールでは、最初に検索グリッドからリスティングURLを収集し、その後同じbrowserを通じてそれぞれを取得して、住宅セッションとフィンガープリントが全体のウォークで一定に保たれるようにします。
ステップ 5 — プロダクションの堅牢性
動作するスクリプトを信頼できるジョブに移行することは、主にプラットフォームの許容範囲内に留まることに関する。いくつかのルールがほとんどの重みを持つ:
- 同時処理の制限。 ホストごとに**≤3のクラウドブラウザセッションを保持**。これを超えるとレート制限や接続リセットが発生し、マージナルスループットが追加の摩擦を正当化することはほとんどない。
- セッションを1度温めて再利用する。 接続URLに
sessionTTL(例:240秒)を設定し、セッションの最初にホームページを1回訪問した後、同じPlaywright接続を通じて全ての検索とアイテムナビゲーションを実行します。ページごとに再温めすると保持されているコンテキストと接続ハンドシェイクが無駄になります。 proxyCountry=USを固定する。 eBayのリスティング、通貨、可用性は地域によって異なるため、米国の住宅用接続を固定することで、ターゲットとする地域に一致した結果を得ることができます。- 欠損フィールドをnullableとして扱う。 実際のカードは、いくつかのリスティング形式において価格、評価、または配送ラインを省略します。存在することを主張するのではなく、デフォルトで欠損セレクタを
Noneに設定することで、1つのまばらなレコードがバッチを壊さないようにします。
取得できる内容
json
[
{
"title": "Dell Latitude 7420 14\" Laptop i7 16GB 512GB SSD Windows 11 Pro",
"price": "$329.99",
"link": "https://www.ebay.com/itm/1234567890"
},
{
"title": "Apple MacBook Air 13.3\" M1 8GB 256GB - Space Gray",
"price": "$489.00",
"link": "https://www.ebay.com/itm/9876543210"
},
{
"title": "Lenovo ThinkPad X1 Carbon Gen 9 i5 16GB 256GB",
"price": "$415.50",
"link": "https://www.ebay.com/itm/5556667778"
}
]
// 形はステップ3の抽出を反映しており、フィールド値は例示的なサンプルです。
このパイプラインを実行しての誠実な観察結果:
- コールド検索は拒否され、ウォーム検索は拒否されない。
/sch/i.htmlに直接ナビゲートすると、eBayのエラーページに到達しますが、同じセッション内でまずホームページを訪問するとエラーがクリアされ、検索は「Laptop for sale | eBay」のタイトルを持つポピュレートされたグリッドを返します。 - 短いポストナビゲーション待機が水分補給をカバー。 結果カードは最初の描画の後にロードされるため、
gotoの後に短いwait_for_timeoutを入れることで、セレクタにアクセス可能な状態になるのです。 .su-card-containerが安定したアンカー。 eBayはカードマークアップを回転させており、古いli.s-itemは何も返しません。.su-card-containerをアンカーにし、デザイン変更後に子フィールドセレクタを再確認してください。- データに一貫性を持たせるために
proxyCountryを固定。 リスティング、通貨、可用性は地域によって異なります。米国の住宅用接続を固定すると、出力はターゲットにしている地域と一貫性が保たれます。 - アイテムとブラウズページは直接レンダリングされる。 より重いゲーティングは検索エンドポイントにありますが、セッションがウォームになると、アイテム、ブラウズ、およびディールページはホームページの迂回なしでロードされます。
結論:あなたのeBayリスティングパイプラインのスケールアップ
このパイプラインは4つの動きに要約されます。1つのScrapeless Scraping Browserセッションに接続し、ホームページで温めます。同じ保持されたセッション内で検索エンドポイントにナビゲートし、リクエストが確立されたブラウジングコンテキストを継承するようにします。.su-card-containerにアンカーを持って結果グリッドを抽出します。その後、結果をページングし、リスティングを詳細ページに追跡します。一度温めたセッションを通じて行います。実際に必要なときだけクラウドブラウザに料金が発生します — Scrapelessの料金を参照して無料プランがカバーする内容を確認し、それ以外は通常のPythonのままです。
ここからは、同じウォームセッションパターンが大規模マーケットプレイスの構築に統合されます。ベストAmazonスクレーパーのまとめで大規模マーケットプレイスの比較を確認し、2026年のベストZillowスクレーパーでローカライズされた価格ツールの比較を行ってください。出荷前に:SCRAPELESS_API_KEYをエクスポートし、proxyCountry=USを固定し、/sch/を触る前にホームページでセッションを温め、ホストあたりの同時接続を≤3セッションに保ち、.su-card-containerにアンカーを持ち、欠損フィールドをnullableとして扱います。接続およびライブラリガイドはdocs.scrapeless.comで確認できます。
AI駆動データパイプラインを構築する準備はできましたか?
私たちのコミュニティに参加して、eBayやマーケットプレイスのデータパイプラインを構築している開発者とつながる無料プランを獲得してください:Discord · Telegram。
app.scrapeless.comにサインアップして無料のScraping Browserランタイムを取得し、上記のパターンをeBayのクエリやパイプラインが必要とする地域に適応させてください。
よくある質問
プロキシは必要ですか?
はい — 住宅用接続はeBayの運用を担っています。接続URLにproxyCountry=USを指定して米国の住宅用プロキシを固定してください。Scrapeless Scraping Browserは195カ国以上で住宅用プロキシを提供しているため、自分でIPを調達して回転させる必要はなく、出口アドレスはフラグ付けされたデータセンターIPではなく、普通の家庭用接続のように見えます。
なぜ検索エンドポイントが「アクセス拒否」を返すのか?
冷たい自動化されたナビゲーションが https://www.ebay.com/sch/i.html に到達すると、リクエストが確立されたブラウジングコンテキストなしで到着するため、eBayのエラーページに着地します。eBayは検索パスをアイテムおよびブラウズページよりも厳しく制限しています。解決策は、最初にセッションを温めることです:保持されているクラウドブラウザのセッションを1つ開き、eBayのホームページを読み込んでクッキーとナビゲーション状態を確立させ、その同じセッション内で検索URLにナビゲートします。そうすると、Laptop for sale | eBayというタイトルとともに情報が満たされたグリッドが読み込まれます。
eBayの再設計後にセレクタが一致しなくなった。どうやって修正すればいい?
eBayはそのDOMを回転させます。抽出を深い子要素パスではなく、結果カードラッパーの .su-card-container に固定し、再設計後の現在のマークアップに対してタイトル、価格、リンクセレクタを再確認してください。古い li.s-item セレクタは現在のレイアウトでは何も一致しないため、カードラッパーが安定したアンカーなのです。
尊重すべき同時実行の制限はありますか?
ホストごとに≤3つのクラウドブラウザセッションに保ってください。それ以上になると、少しのスループットと多くのレート制限や接続リセットとのトレードオフになります。すべてのリクエストを一度に発射するのではなく、制限された同時実行とキューを使用してください。
AIエージェントなしで実行できますか?
はい。上記のPythonパターンはそれ自体でエンドツーエンドです — PlaywrightはCDP経由でScrapeless Scraping Browserに接続し、あなたのコードがセッションを温め、ナビゲートし、抽出します。AIエージェントは上に重ねるオプションのレイヤーであり、必須ではありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



