2026年のShein大規模スクレイピングで知っておくべきAPI vs HTMLのトレードオフ
2026年のShein大規模スクレイピング(Sheinスクレイピング2026)を実装する際、最初に直面する判断は「レンダリング済みHTMLを解析するか、Sheinの内部JSON APIを直接叩くか」です。SheinはReactベースのSPAであり、商品ページのHTMLにはすでにproductIntroDataやgbProductDetailDataというJSON blobが埋め込まれていますが、商品一覧や検索結果はXHRリクエストで動的にロードされます。
結論から言うと、内部APIエンドポイントを直接呼ぶ方が圧倒的に効率的です。Sheinの商品詳細は/api/productInfo系のエンドポイント(実際にはshein.com/h5-product-api/...やshein.com/p-api/...といったパス)からJSONを返し、一覧ページはgoods_idとcat_idパラメータ付きのカテゴリフィードエンドポイントで取得できます。HTMLパースはフォールバック手段として残しておくべきです。
ただし、どちらのアプローチでもSheinの強力なアンチボットスタックを突破する必要があります。以下に、技術的な背景から実装までを順を追って解説します。
Sheinのアンチボットスタック:Akamai Bot Managerとsmdeviceid
SheinはAkamai Bot Managerを中核とした多層防御を採用しています。以下の要素を理解しておきましょう。
_abck Cookieとbm_sz
Akamaiのボット検出は_abckというCookieに依存します。このCookieは、ブラウザがJavaScriptで生成するsensor_dataというテレメトリ情報をAkamaiのサーバーに送信することで「有効化」されます。_abckの値が-2で終わる場合は「未検証」、-1で終わる場合は「ブロック」、-0または数字のみで終わる場合は「通過」を意味します。
bm_szはセッション管理用の補助Cookieで、リクエスト頻度とデバイスフィンガープリントをトラッキングします。
smdeviceidデバイストークン
Sheinは独自のsmdeviceidというデバイス識別トークンも発行しています。これはCookieおよびリクエストヘッダーに含まれ、デバイス固有の識別子として機能します。複数リクエストで同一のsmdeviceidを使い回すと、ボットとしてフラグされる可能性が高まります。
なぜheadless Chromeだけでは不十分なのか
PuppeteerやPlaywrightでheadless Chromeを回しても、Akamaiのsensor_data検査に合格するのは難しくなっています。2026年時点では、TLSフィンガープリント(JA3/JA4)、HTTP/2のSETTINGSフレーム順序、navigatorプロパティの整合性などが検査され、標準のheadless Chromeはこれらの多くで「ボット」と判定されます。
そのため、curl_cffiのようなTLS指紋偽装ライブラリと、回転型レジデンシャルプロキシの組み合わせが現実的なアプローチとなります。
データの所在:productIntroData、SKU/inventoryフィールド、カテゴリフィード
Sheinの商品ページ(例:shein.com/xxxx-p-123456.html)を開くと、HTML内に以下のようなJSON blobが埋め込まれています。
- productIntroData:商品基本情報(タイトル、画像URL、色バリエーション、サイズ展開)
- gbProductDetailData:価格情報、SKUごとの在庫、割引情報
内部APIを直接叩く場合は、商品一覧エンドポイントにcat_id(カテゴリID)とpageパラメータを渡します。各商品にはgoods_idが割り当てられており、これを使って商品詳細エンドポイントを呼び出します。
取得可能な主なフィールド
| フィールド | 説明 | 取得元 |
|---|---|---|
goods_id | 商品の一意ID | 一覧API / HTML |
retailPrice | 定価(ローカル通貨) | gbProductDetailData |
salePrice | セール価格 | gbProductDetailData |
stock / inventory | SKUごとの在庫数 | gbProductDetailData |
cat_id | カテゴリID | 一覧API |
colorImageUrl | 色バリエーション画像 | productIntroData |
レート制限とジオターゲティングが必須な理由
SheinはIPあたりのリクエスト数に厳しい制限を設けており、短時間に大量リクエストを送るとHTTP 412(Precondition Failed)や403が返されます。実測ベースで、同一IPあたり約30〜50リクエスト/分を超えるとAkamaiのチャレンジが発動します。
さらに重要なのは、Sheinはアクセス元の国に応じて通貨・価格・在庫をローカライズしている点です。米国からのアクセスで見える価格とドイツからのアクセスで見える価格は異なり、一部商品は地域限定で在庫切れになることもあります。そのため、ジオターゲティング付きの回転型レジデンシャルプロキシが必須です。
ProxyHatではユーザー名に-country-USや-country-DEを指定するだけで、指定国のIPからリクエストを送出できます。
Python実装例:curl_cffi + ProxyHatでShein商品データを取得
以下は、curl_cffiを使ってChrome のTLS指紋を偽装し、ProxyHatのレジデンシャルプロキシ経由でSheinの内部APIを呼び出す例です。
from curl_cffi import requests as cffi_requests
import json
# ProxyHat接続設定(米国IP)
proxy_url = "http://user-country-US:yourpassword@gate.proxyhat.com:8080"
# Shein商品詳細API(例:goods_id=12345678)
api_url = "https://www.shein.com/h5-product-api/products/index"
params = {
"goods_id": "12345678",
"country": "US",
"currency": "USD",
"lang": "en"
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "en-US,en;q=0.9",
"Referer": "https://www.shein.com/",
}
response = cffi_requests.get(
api_url,
params=params,
headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome131",
timeout=30
)
data = response.json()
# 価格・在庫を抽出
product = data.get("info", {}).get("products", {})
print(json.dumps({
"goods_id": product.get("goods_id"),
"retailPrice": product.get("retailPrice", {}).get("amount"),
"salePrice": product.get("salePrice", {}).get("amount"),
"stock": product.get("stock"),
}, indent=2, ensure_ascii=False))
出力例(truncated):
{
"goods_id": "12345678",
"retailPrice": "29.99",
"salePrice": "12.99",
"stock": 1843
}
</code></p>
<p>この例では<code>impersonate="chrome131"</code>を指定することで、Chrome 131のTLS指紋とHTTP/2設定を再現しています。ProxyHatの<code>gate.proxyhat.com:8080</code>経由で米国レジデンシャルIPを使用しているため、Shein側は通常の米国ユーザーとして認識します。</p>
<h2>ページネーション、スティッキーセッション、412リトライロジック</h2>
<h3>ページネーション処理</h3>
<p>カテゴリ一覧を取得する場合は、<code>page</code>パラメータをインクリメントしながらループします。1ページあたり通常40件の商品が返されます。全カタログを対象とする場合は、カテゴリツリーAPIからすべての<code>cat_id</code>を取得し、各カテゴリごとにページネーションを回します。</p>
<h3>スティッキーセッションで通貨の一貫性を保つ</h3>
<p>同じ商品の複数SKUを取得する間は、同じIPを使い続ける必要があります。そうしないと、途中で通貨や価格が切り替わってしまうからです。ProxyHatでは<code>-session-</code>フラグでスティッキーセッションを維持できます。</p>
<pre><code># スティッキーセッション(同一IPを5〜10分間維持)
proxy_url = "http://user-country-DE-session-mySheinRun01:yourpassword@gate.proxyhat.com:8080"
412/_abckリフレッシュロジック
HTTP 412が返された場合は、_abckCookieが無効化されたことを意味します。以下のようなバックオフ戦略を実装します。
import time
import random
def fetch_with_retry(url, params, max_retries=5):
for attempt in range(max_retries):
try:
resp = cffi_requests.get(
url, params=params, headers=headers,
proxies={"http": proxy_url, "https": proxy_url},
impersonate="chrome131", timeout=30
)
if resp.status_code == 200:
return resp.json()
elif resp.status_code == 412:
# _abck再取得のため待機+新セッション
wait = (2 ** attempt) + random.uniform(0, 2)
print(f"412 received, backing off {wait:.1f}s")
time.sleep(wait)
# 新しいセッションIDでIP切替
new_session = f"shein-{attempt}-{int(time.time())}"
proxy_url_new = f"http://user-country-US-session-{new_session}:yourpassword@gate.proxyhat.com:8080"
continue
else:
print(f"Status {resp.status_code}, retrying...")
time.sleep(3)
except Exception as e:
print(f"Error: {e}, retrying...")
time.sleep(5)
return None
Node.js / curlでの簡易確認
curlで素早くエンドポイントの挙動を確認したい場合は、以下のようにProxyHatプロキシを指定します。
curl -x "http://user-country-US:yourpassword@gate.proxyhat.com:8080" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)" \
-H "Accept: application/json" \
-H "Referer: https://www.shein.com/" \
"https://www.shein.com/h5-product-api/products/index?goods_id=12345678&country=US¤cy=USD&lang=en"
倫理と利用規約:公開データのみ、CFAA/GDPRの注意点
Sheinのスクレイピングを行う際は、以下の原則を守ってください。
- 公開商品データのみを取得:価格、在庫、商品名、画像URLなど、ログイン不要で閲覧可能な情報のみを対象とする。
- チェックアウトやアカウント機能にはアクセスしない:購入プロセスの自動化やユーザーアカウントへのアクセスは規約違反であり、CFAA(Computer Fraud and Abuse Act)違反のリスクがある。
- 個人情報(PII)を収集しない:レビューの投稿者名やユーザーIDなどはGDPR対象の可能性がある。
- robots.txtを尊重:Sheinのrobots.txtでDisallowされているパスは回避する。
- リクエスト頻度を合理的に保つ:サーバーに過度な負荷をかけないレート(1IPあたり30リクエスト/分以下)を維持する。
なお、Sheinはアフィリエイトプログラムを提供しており、商品フィードの公式APIアクセスが可能な場合があります。大規模な価格比較やマーケット分析を行う場合は、Shein Affiliate Program経由で公式フィードを利用する方が法的リスクが低く、データ品質も安定します。スクレイピングは公式フィードではカバーできない隙間を埋める手段として位置づけるべきです。
ProxyHatのセットアップと関連リソース
Sheinスクレイピングに必要なレジデンシャルプロキシは、ProxyHatの料金プランから選択できます。ジオターゲティング対応のレジデンシャルプロキシで、米国・ドイツ・日本など100以上のロケーションからアクセス可能です。
詳細な設定手順はProxyHat公式ドキュメントを参照してください。また、WebスクレイピングのユースケースやSERPトラッキングのページも参考になります。利用可能なロケーション一覧はプロキシロケーションページで確認できます。
主要なポイント(Key Takeaways)
- 内部API優先:HTMLパースより
goods_id/cat_idパラメータ付きのJSONエンドポイントを直接叩く方が効率的。- Akamai Bot Manager対策:
_abckCookieとsensor_dataテレメトリを理解し、curl_cffiでTLS指紋を偽装する。- ジオターゲティング必須:Sheinは国ごとに価格・通貨・在庫をローカライズするため、
-country-US/-country-DE付きのレジデンシャルプロキシが必要。- スティッキーセッション:通貨一貫性のために
-session-フラグで同一IPを維持する。- 412リトライ:指数バックオフ+新セッションIDでIP切替を行い、成功率を最大化する。
- 倫理的スクレイピング:公開データのみ、公式アフィリエイトフィードの利用も検討する。
FAQ
2026年のShein大規模スクレイピングとは何ですか?
2026年のShein大規模スクレイピングとは、Sheinのカタログ、価格、在庫データを体系的かつ大量に取得する技術的プロセスを指します。SheinはReactベースのSPAであり、内部APIエンドポイントからJSON形式で商品データを取得するアプローチが主流です。ただし、Akamai Bot Managerによる高度なボット検知が導入されているため、TLS指紋偽装と回転型レジデンシャルプロキシの組み合わせが不可欠です。
なぜSheinスクレイピングでプロキシユーザーが注意すべきなのですか?
Sheinはアクセス元IPの国に応じて通貨、価格、在庫状況をローカライズしているため、データ収集の目的地域に応じたジオターゲティングが必要です。さらに、同一IPあたり約30〜50リクエスト/分を超えるとAkamaiのチャレンジが発動し、HTTP 412や403が返されます。回転型レジデンシャルプロキシを使うことで、IPあたりのリクエスト負荷を分散し、ブロックを回避できます。
Sheinスクレイピングに最適なプロキシタイプは何ですか?
レジデンシャルプロキシが最適です。SheinのアンチボットシステムはIPレピュテーションを検査するため、データセンタープロキシは高確率でブロックされます。レジデンシャルプロキシは実際のISPに割り当てられたIPを使用するため、正規ユーザーとして認識されやすくなります。さらに、-country-USや-country-DEでジオターゲティングを行い、-session-でスティッキーセッションを維持することで、通貨一貫性と成功率の両立が可能です。
Sheinスクレイピングでブロックを回避するにはどうすればよいですか?
主な対策は以下の通りです:(1)curl_cffi等でChromeのTLS指紋を偽装する、(2)レジデンシャルプロキシでIPを回転させ1IPあたり30リクエスト/分以下に抑える、(3)適切なUser-Agent、Accept-Language、Refererヘッダーを設定する、(4)HTTP 412が返された場合は指数バックオフで待機し新しいセッションIDでIPを切り替える、(5)smdeviceidを適切に管理し同一トークンの使い回しを避ける。
Sheinスクレイピングは合法ですか?
公開されている商品データ(価格、在庫、商品名)の収集は一般的に合法ですが、利用規約やCFAA、GDPRの制約を受けます。チェックアウト機能の自動化やアカウントへの不正アクセスは明確に違法です。また、個人情報(レビュー投稿者名など)の収集はGDPRに抵触する可能性があります。大規模な商用利用を予定する場合は、Sheinの公式アフィリエイトフィードの利用を優先的に検討すべきです。






