Tony Wang6 分で読めますKohl's を2026年にスクレイピングする方法(API と Python)
2026年に Kohl's をスクレイピングする方法 — カテゴリとキャンペーンの商品グリッドをファセット付きで構造化 JSON として取得。DIY、ノーコード、構造化 API のいずれか。
2026年に Kohl's をスクレイピングする最も手早い方法は、kohls.com の描画済みページを自分でパースするのではなく、カテゴリまたはキャンペーンページの正規化された商品グリッドとファセットを JSON として返す構造化 API を呼び出すことです。Kohl's のカバレッジは閲覧であり検索ではありません。自由テキストの検索エンドポイントも、id による商品詳細の専用ルックアップもなく、商品グリッド自体もページ分割されていません。得られるのはページ1と、さらに絞り込むためのファセットのセットです。このガイドでは3つのアプローチすべてを取り上げ、それぞれが何を返し、DIY がどこで破綻するか、そして法律上の基本を解説します。
なぜ Kohl's をスクレイピングするのか?
Kohl's のカテゴリおよびキャンペーンデータは次のような用途を支えます。
- アソートメントリサーチ — あるカテゴリや選定されたキャンペーンがどのような商品構成を扱っているか、そしてその構成が時間とともにどう変化するかを把握できます。
- 価格と値下げの追跡 — カテゴリ内の商品の価格設定と値引きが、取得のたびにどう推移するかを観察できます。
- キャンペーンのモニタリング — Kohl's が選定されたランディングページ(セールイベントやブランドプッシュ)で何をマーチャンダイジングしているかを、サイトを手動で再訪することなく追跡できます。
- カテゴリ分類のマッピング — 返ってきたファセットを使い、URL を推測することなく隣接する、あるいはより狭いカテゴリやキャンペーンのスラッグを発見できます。
- 競合ベンチマーキング — カテゴリレベルのアソートメントと価格設定を、他のデパートやビッグボックス小売業者と比較できます。
Kohl's をスクレイピングするのは合法か?
選択肢1: Python で DIY する(そしてなぜ破綻するか)
Kohl's のカテゴリおよびキャンペーンページは、安定した公開 JSON エンドポイントではなく内部のストアフロント API から描画されるため、DIY のスクレイパーは描画済みページを取得してパースする必要があります。
import requests
from bs4 import BeautifulSoup
resp = requests.get(
"https://www.kohls.com/catalog/womens-dresses.jsp",
headers={"User-Agent": "Mozilla/5.0 (compatible; research-bot/1.0)"},
)
soup = BeautifulSoup(resp.text, "html.parser")
# The product grid, prices, and filter facets are hydrated from an internal
# API call, not laid out as stable, selectable markup
デモは動きますが、その後破綻します。
- グリッドは静的なリストではありません。 商品、価格、利用可能なファセットは内部 API からクライアント側でハイドレートされます。生の HTML 取得ではデータがまったく取得できないことが多く、セレクターベースのパーサーはリデザインのたびに静かに壊れます。
- フォールバックできる検索や商品単位のエンドポイントがありません。 Kohl's のストアフロントは、外部利用向けに文書化された検索 API も、安定した id による商品詳細パスも公開していないため、DIY のアプローチはカテゴリページがたまたま行っている内部呼び出しをリバースエンジニアリングし続けるしかありません。
- グリッドはそもそもページ1しか表示しません。 描画済みページを取得できるスクレイパーであっても、得られるのは商品1画面分だけです。さらに先へ進むには、文書化されていない変わりやすい内部呼び出しに対して「もっと見る」操作をシミュレートする必要があります。
- 公式の開発者 API がありません。 Kohl's には外部開発者向けのセルフサービス型公開 API プログラムがなく、プログラムによるアクセスを申請する公認の方法はありません。
- エッジでのアンチボット防御。 多くの大手小売業者と同様に、Kohl's のストアフロントは素朴な、大量の、または未認証の自動化トラフィックに対して反応するため、ブラウザベースのスクレイパーは防御の変化に合わせて継続的なメンテナンスが必要です。
選択肢2: ノーコードツール
汎用のノーコードスクレイパービルダーは、ポイント&クリックで Kohl's のカテゴリページを一回限り取得することはできますが、DIY と同じリバースエンジニアリングの脆さを引き継ぎます。安定したスキーマも、文書化されたファセットもなく、Kohl's がカテゴリページのグリッドをハイドレートする方法を変更しても適応しません。
選択肢3: 構造化された Kohl's API
繰り返し実行できるワークフローには、Crawlora の Kohl's API がカテゴリまたはキャンペーンページの商品グリッドとファセットを正規化された JSON として返し、ページのパースやボット防御のメンテナンスは不要です。カテゴリまたはキャンペーンのスラッグ(kohls.com のストアフロント URL から)を渡します。
curl "https://api.crawlora.net/api/v1/kohls/category?slug=womens-dresses" \
-H "x-api-key: $CRAWLORA_API_KEY"
Python では次のようになります。
import requests
h = {"x-api-key": "YOUR_API_KEY"}
base = "https://api.crawlora.net/api/v1/kohls"
result = requests.get(
f"{base}/category",
headers=h,
params={"slug": "womens-dresses"},
).json()["data"]
products = result["products"]
facets = result["facets"]
カテゴリのレスポンスは正規化された JSON です(実際のフィールドはドキュメントで確認してください)。
{
"code": 200,
"msg": "OK",
"data": {
"slug": "womens-dresses",
"title": "Women's Dresses",
"total": 1842,
"products": [
{
"id": "prod-4187562",
"title": "Nine West Sleeveless Fit & Flare Dress",
"brand": "Nine West",
"price": { "current": 44.99, "regular": 79.00, "sale": true },
"rating": { "average": 4.3, "count": 216 },
"image_url": "https://media.kohlsimg.com/is/image/kohls/4187562",
"url": "https://www.kohls.com/product/prd-4187562/nine-west-womens-sleeveless-fit-flare-dress.jsp"
}
],
"facets": [
{
"display_name": "Category",
"id": "campaign",
"options": [
{ "value": "womens-casual-dresses", "label": "Casual Dresses" },
{ "value": "womens-wedding-guest-dresses", "label": "Wedding Guest" }
]
},
{
"display_name": "Brand",
"id": "brand",
"options": [
{ "value": "nine-west", "label": "Nine West" },
{ "value": "apt-9", "label": "Apt. 9" }
]
}
]
}
}
グリッドはページ1のみなので、ページを進めようとする代わりに facets[].options[].value を次に呼び出す slug として使ってください。womens-casual-dresses のようなファセット値は、それ自体の商品グリッドとさらに絞り込まれたファセットを返します。取得ごとに id をキーとして商品1件につき1行を保存し、スケジュールを組んでスラッグを再実行することで price.current と sale の切り替わりを追跡してください。
収集できるもの
単一のエンドポイントから得られる公開のカテゴリおよびキャンペーンデータです。カテゴリまたはキャンペーンの商品グリッド(id、タイトル、ブランド、現在価格/通常価格、セールフラグ、評価、画像、url)のページ1分、加えて隣接する、あるいはより具体的なカテゴリやキャンペーンへ絞り込むためのスラッグ値を持つファセット(カテゴリ、ブランドなど)です。自由テキスト検索、id による商品詳細ルックアップ、ページ1を超えるページはありません。絞り込みはオフセットではなくファセット駆動のスラッグを通じて行われます。公開されているストアフロントデータのみです。
制約とよくある課題
- 検索エンドポイントがありません。 開始するには既知のカテゴリまたはキャンペーンのスラッグが必要です。この API を通じて Kohl's のカタログを自由テキストのキーワードでクエリする方法はありません。
- ページ分割されたグリッドがありません。
/kohls/categoryはページ1のみを返します。さらにページを要求するのではなく、返ってきたファセットを使ってより狭いカテゴリやキャンペーンのスラッグへ進むことで、より広いカバレッジを得てください。 - 専用の商品詳細ルックアップがありません。 商品について得られるものはすべて、カテゴリグリッド内のその行に由来します。追加フィールド付きで単一の商品を id で取得する別の呼び出しはありません。
- スラッグの発見はまだ実サイトから始まります。 カテゴリや選定されたキャンペーンの最初のスラッグは、実際の kohls.com ストアフロント URL から取得する必要があります。API はそこからファセットを介して絞り込みますが、何もない状態から完全な分類を列挙するわけではありません。
- 公開データのみです。 これは Kohl's がすでに公開しているストアフロントデータです。ログイン後のアカウント、注文、Kohl's Cash/ロイヤルティ情報に到達する手段では決してありません。
どこで使われるか
- アソートメントと値下げの追跡 — スケジュールを組んでカテゴリを取得し、
productsの新規アイテム、削除されたアイテム、price.current/saleの変化を差分比較します。 - キャンペーンのモニタリング — 選定されたキャンペーンのスラッグ(セールイベントやブランドプッシュ)を監視し、Kohl's が何をマーチャンダイジングしているか、いつ変わるかを把握します。
- タクソノミーのマッピング —
facetsを再帰的に辿り、サイトを手作業でブラウジングすることなく Kohl's のカテゴリおよびキャンペーンのスラッグの社内マップを構築します。
出典
収集を始める
まずは無料でお試しください: 任意の公開 URL を無料ウェブスクレイパーに通すか、アンチボットチェッカーでサイトがボットをブロックするかどうかを確認できます。サインアップ不要です。
カテゴリのエンドポイントをプレイグラウンドで試し、API ドキュメントでスキーマを確認し、料金をご覧ください。検索から詳細まで一貫したフローを持つ同じビッグボックス小売業者パターンについては、Target をスクレイピングする方法をご覧ください。最も近い総合小売の競合については、Walmart をスクレイピングする方法をご覧ください。あわせてウェブスクレイピング API の選び方とウェブスクレイピングは合法かもご覧ください。
よくある質問
Kohl's の API はページネーションに対応していますか?
いいえ。/kohls/category が返すのは商品グリッドのページ1のみです。さらにページを進める代わりに、返ってきたファセットを使ってより具体的なカテゴリまたはキャンペーンのスラッグへ絞り込んでください。
この API で Kohl's の商品を検索できますか?
直接はできません。Crawlora の Kohl's カバレッジはカテゴリ/キャンペーンの閲覧のみ(/kohls/category)で、自由テキストの検索エンドポイントはまだありません。
Kohl's に公式の公開 API はありますか?
いいえ。Kohl's には外部開発者向けのセルフサービス型公開 API プログラムはなく、カテゴリおよびキャンペーンページはサードパーティ向けに公開されていない内部の商品 API からレンダリングされています。Crawlora は Kohl's 自身の公開ストアフロントのレンダリング結果を読み取り、正規化された JSON として返します。