قیمت نهایی یک محصول تنها بخشی از اطلاعات مورد نیاز برای یک لیست کوتاه کاربردی است. واحد پول، موجودی و تعداد نظرات میتوانند تعیین کنند که کدام کالاها ارزش بررسی دارند. این آموزش نشان میدهد که چگونه محصولات SHEIN را در قالب JSON یا CSV استخراج (Scrape) کنید و سپس نتایج را به یک جدول کوچک از محصولات موجود در انبار با قیمت زیر ۲۰ دلار و امتیاز حداقل ۴.۵ تبدیل کنید.
ابزار مورد استفاده 2scraper/shein-scraper است، یک پروژه پایتونی با لایسنس MIT. مثال زیر از دادههای نمونه همراه آن استفاده میکند تا بتوانید مرحله فیلتر کردن را بدون ارسال درخواست زنده (Live Request) امتحان کنید. این رکوردها مربوط به ۳۰ سپتامبر ۲۰۲۶ هستند؛ آنها قیمتهای فعلی یا نتایج یک تست جدید نیستند.
چگونه محصولات SHEIN را در یک لیست کوتاه اقتصادی استخراج کنیم
از موتور Playwright برای جمعآوری نتایج جستجوی کوچک از us.shein.com استفاده کنید. رکوردها را به صورت JSON ذخیره کنید، متادیتای اجرای برنامه را بررسی کنید و محصولات را بر اساس واحد پول، موجودی، قیمت و امتیاز فیلتر کنید. آن انتخاب را به CSV صادر کنید. با آن به عنوان یک تصویر لحظهای (Snapshot) از محصولات جمعآوری شده برخورد کنید، نه یک کاتالوگ کامل یا موجودی انواع کالا.
- پایتون ۳.۹ یا جدیدتر را نصب کرده و مخزن (Repository) را کلون کنید.
- وابستگیهای Playwright و مرورگر Chromium را نصب کنید.
- هرگونه اعتبارنامه (Credentials) را در
.envپیکربندی کنید. - یک جستجو را با محدودیت نتایج کوچک اجرا کنید.
- کد خروج (Exit Code) و فایل متادیتای همراه آن را بررسی کنید.
- رکوردهای JSON را فیلتر کرده و لیست کوتاه را در CSV بنویسید.
یک بار نصب کنید، یک جستجوی کوچک جمعآوری کنید
این مخزن استفاده از Playwright را توصیه میکند. از یک محیط مجازی (Virtual Environment) مجزا برای آن استفاده کنید: مجموعه وابستگیهای Playwright، Selenium و Puppeteer پروژه نباید با هم نصب شوند.
این دستورات راهاندازی از فایل README برداشته شدهاند و از یک شل سازگار با Bash مانند لینوکس، macOS یا WSL استفاده میکنند:
git clone https://github.com/2scraper/shein-scraper.git
cd shein-scraper
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements-playwright.txt
playwright install chromium
cp .env.example .envفایل .env شامل TWOCAPTCHA_KEY برای حل کپچا، SHEIN_CDP_ENDPOINT برای پروفایل مرورگر از راه دور، و SHEIN_PROXY برای پروکسی اختیاری است. فقط مقادیری را که استفاده میکنید اضافه کنید. اعتبارنامهها را از دستورات، اسکرینشاتها و فایلهای منتشر شده دور نگه دارید.
یک مرورگر محلی میتواند بدون کلید کپچا شروع به کار کند، اما این به معنای دریافت دادههای محصول نیست: SHEIN ممکن است آن را به چالش بکشد یا محدودیت نرخ (Rate-limit) اعمال کند. برای استفاده منظم، README استفاده از پروفایل 2Captcha Scraping Browser API به همراه یک کلید حلکننده را توصیه میکند. دسترسی به مرورگر و حل کپچا سرویسهای جداگانهای هستند.
برای یک جستجوی کوچک، اجرا کنید:
python3 playwright_scraper.py --query "linen shirt" --max-results 20این کوئری یک ورودی نمونه است، نه ادعایی مبنی بر اینکه برای این مقاله تست شده است. هنگامی که ردیفها نوشته میشوند، فایلهای پیشفرض shein_results.json و shein_results.json.meta.json هستند. فایل دوم اجرای برنامه را توصیف میکند، از جمله وضعیت آن و دلیل توقف.
برای درخواست مستقیم CSV، از گزینههای خروجی مستند شده استفاده کنید:
python3 playwright_scraper.py --query "linen shirt" --max-results 20 --format csv --out linen-shirts.csvاین یک اجرای جمعآوری دیگر است، نه تبدیل فایل JSON قبلی. برای تبدیل و فیلتر آفلاین، از مثال پایتون در ادامه مطلب استفاده کنید.
هر ورودی دقیقاً چه چیزی را برمیگرداند
| ورودی دادهها از کجا میآیند خروجی مفید | ||
--query "linen shirt" | دادههای جاسازی شده در لیست جستجو | شناسه محصول، عناوین، قیمتها، تخفیفها، امتیازات و پرچمهای موجودی در صورت وجود |
--category "Women Jeans-c-1934.html" | دادههای جاسازی شده در لیست دستهبندی | همان فیلدهای سطح محصول برای آن دستهبندی |
--url با آدرس صفحه محصول | دادههای ساختاریافته JSON-LD صفحه | هویت محصول و قیمت؛ سایر فیلدها ممکن است وجود نداشته باشند |
برای گردش کار «جستجو به محصول»، با لیست شروع کنید و یک product_url بازگشتی را بردارید. زمانی که میخواهید آن صفحه محصول خاص را بررسی کنید، آن آدرس را به --url پاس دهید. اجرای لیست به طور خودکار هر کارت محصول را باز نمیکند و یک موجودی کامل از انواع کالا نمیسازد.
سه گروه فیلد برای لیست کوتاه اهمیت دارند:
price،currency،original_priceوdiscount_pctقیمت و تخفیف نمایش داده شده را توصیف میکنند.ratingوreview_countمیانگین امتیاز و تعداد نظرات آن را توصیف میکنند. اینها متن نظرات فردی نیستند.in_stockیک پرچم در سطح محصول است. این ثابت نمیکند که هر سایز یا رنگی موجود است.
فایل README فیلد sku را به عنوان goods_id در SHEIN شناسایی میکند که بین رنگها و سایزهای یک محصول مشترک است. در یک صفحه محصول با انواع مختلف قیمتگذاری شده، price_source: "json_ld_min_variant" به این معنی است که تجزیهکننده (Parser) کمترین قیمت موجود را انتخاب کرده است. آن عدد را به عنوان قیمت تمام انواع کالا ارائه ندهید.
بازار و منبع قیمت را قابل مشاهده نگه دارید
این پیادهسازی us.shein.com را هدف قرار میدهد. سایر سایتهای منطقهای تست نشدهاند، بنابراین جایگزینی دامنه راه مستند شدهای برای تغییر بازار نیست. رکوردهای نمونه از USD استفاده میکنند؛ اسکریپت فیلتر زیر صراحتاً آن واحد پول را حفظ میکند.
لیستها از window.gbRawData خوانده میشوند که دادههای محصول جاسازی شده در صفحه است. صفحات محصول از JSON-LD سایت schema.org خوانده میشوند. فیلد price_source این تمایز را حفظ میکند. این فیلد زمانی مفید است که به نظر میرسد قیمت لیست و قیمت صفحه محصول با هم همخوانی ندارند.
مقادیر مفقود نیز معنای خاص خود را دارند. امتیاز مفقود به معنای بررسی صفر ستاره نیست و پرچم موجودی ناشناخته، موجودی تایید شده نیست. لیست کوتاه به جای حدس زدن، آن رکوردها را حذف میکند.
چرا مرورگر میتواند قبل از بازگرداندن محصولات متوقف شود
این پروژه دادههای محصول رندر شده با جاوا اسکریپت، لیستهای با اسکرول بینهایت و درگاه ریسک SHEIN را مدیریت میکند. یک درخواست HTML ساده کل این گردش کار را پوشش نمیدهد.
فایل README دو پاسخ درگاه را متمایز میکند:
| پاسخ رفتار مستند شده | |
/risk/challenge | اسکرپر سعی میکند چکباکس را بزند، سپس در صورت پیکربندی میتواند یک شبکه تصویر یا پازل توالی آیکون را به 2Captcha ارسال کند. |
/risk/action/limit | این یک محدودیت نرخ است که پازلی برای حل کردن ندارد. اجرایی بدون ردیف با کد 3 خارج میشود. |
شبکههای تصویری از GridTask استفاده میکنند؛ توالی آیکونها از CoordinatesTask استفاده میکنند. حالت پیشفرض --solve-captcha روی when-blocked است. --max-solves به طور پیشفرض 8 است و تلاشهای حل پولی در هر اجرا را محدود میکند؛ 0 از حلهای پولی جلوگیری میکند. این سقف شامل هزینههای مرورگر از راه دور یا پروکسی نمیشود.
حل یک چالش تضمینی برای کارکرد همیشگی ندارد. تست ۳۰ سپتامبر در README موفقیت را برای سه پروفایل از پنج پروفایل مرورگر تازه ایالات متحده گزارش کرد. آن تست تاریخی کوچک، وعده قابلیت اطمینان نیست. راهنمای کامل نگهدارندگان تنظیمات گستردهتر و مرجع گزینهها را ارائه میدهد.
قبل از اعتماد به فایل، اجرای برنامه را بررسی کنید
نسخه مستند شده فعلی مخزن 0.2.0 به تاریخ ۱۶ اکتبر ۲۰۲۶ است. کدهای خروج آن، یک اجرای کامل را از دادههای ناقص متمایز میکند:
| کد خروج معنا برای دادههای جمعآوری شده | |
0 | اجرا کامل شد. محدودیت نتایج درخواستی همچنان میتواند آن را فقط به یک انتخاب محدود کند. |
6 | برخی ردیفها نوشته شدهاند، اما اجرا ناقص است. stop_reason را بررسی کنید. |
3 | مسدود شده یا محدودیت نرخ اعمال شده، بدون هیچ ردیفی. |
4 | صفحه بارگذاری شد اما هیچ محصولی نداشت. |
5 | محتوا به دست نیامد یا لیستی که مشخص بود حاوی محصول است، قابل تجزیه نبود. |
یک اجرای با صفر ردیف معمولاً خروجی قبلی را حفظ میکند تا اینکه آن را بازنویسی کند. این مفید است، اما یک فایل موجود ممکن است متعلق به یک اجرای قبلی باشد. قبل از استفاده از آن به عنوان داده تازه، وضعیت خروج آخرین دستور و مقادیر scraped_at رکوردها را بررسی کنید.
همچنین README میگوید که جمعآوری فراتر از تقریباً ۲۰ محصول اول لیست تایید نشده است. افزایش --max-results ثابت نمیکند که شما کل دستهبندی را جمعآوری کردهاید.
ساخت یک لیست کوتاه CSV از نمونه همراه
در اینجا فیلدهای انتخاب شده از یک رکورد در sample_output.json، بدون تغییر آورده شده است:
{
"sku": "499485260",
"brand": "jotten",
"price": 8.55,
"currency": "USD",
"price_source": "embedded_json",
"scraped_at": "2026-09-30T12:56:49Z",
"original_price": 13.79,
"discount_pct": 38.0,
"rating": 4.8,
"review_count": 143,
"in_stock": true
}فایل همراه شامل سه رکورد لباس است. آنها مرحله پردازش را نشان میدهند؛ آنها نتایج کوئری linen shirt بالا نیستند.
این کد را به عنوان shortlist.py در داخل مخزن ذخیره کنید. این کد فقط از کتابخانه استاندارد پایتون و فیلدهای موجود در نمونه استفاده میکند:
import csv
import json
import sys
from pathlib import Path
source = Path(sys.argv[1] if len(sys.argv) > 1 else "sample_output.json")
rows = json.loads(source.read_text(encoding="utf-8"))
selected = [
row for row in rows
if row.get("currency") == "USD"
and row.get("in_stock") is True
and isinstance(row.get("price"), (int, float))
and 0 <= row["price"] < 20
and isinstance(row.get("rating"), (int, float))
and row["rating"] >= 4.5
]
selected.sort(key=lambda row: row["price"])
fields = ["sku", "title", "price", "currency", "original_price",
"discount_pct", "rating", "review_count", "product_url"]
def csv_value(value):
if isinstance(value, str) and value.startswith(("=", "+", "-", "@", "\t", "\r", "\n")):
return "'" + value
return value
with Path("budget_shortlist.csv").open("w", encoding="utf-8", newline="") as file:
writer = csv.DictWriter(file, fieldnames=fields)
writer.writeheader()
writer.writerows({key: csv_value(row.get(key)) for key in fields} for row in selected)
print(f"Saved {len(selected)} products to budget_shortlist.csv")آن را روی نمونه مخزن اجرا کنید:
python3 shortlist.py sample_output.jsonهر سه رکورد همراه این شرایط را دارا هستند. به ترتیب صعودی قیمت، فایل CSV شامل SKUهای 499485260، 458057728 و 430743850 با قیمتهای ۸.۵۵ دلار، ۱۳.۰۳ دلار و ۱۷.۵۱ دلار است. اینها محاسبات قابل تکرار از نمونه ارائه شده هستند، نه پیشنهادهای زنده.
تصویری از نمونه همراه پس از فیلتر کردن و مرتبسازی؛ این اسکرینشات از یک اجرای اسکرپینگ زنده نیست.
پس از بررسی وضعیت و تازگی یک اجرای زنده، به جای آن JSON آن را پردازش کنید:
python3 shortlist.py shein_results.jsonاسکریپت هر بار فایل budget_shortlist.csv را بازنویسی میکند. تعداد نظرات را برای زمینه (Context) حفظ میکند اما حداقل تعداد را تحمیل نمیکند. امتیاز ۴.۸ از چند نظر و همان امتیاز از نظرات بسیار، شایسته تفسیرهای متفاوتی هستند.
سوالاتی که باید قبل از گسترش گردش کار حل شوند
آیا این میتواند تمام محصولات SHEIN را جمعآوری کند؟
این مخزن پوشش کامل کاتالوگ را تضمین نمیکند. با محدوده کوچک مستند شده شروع کنید، متادیتای اجرای ناقص را بررسی کنید و رفتار اسکرول تایید نشده را در نظر داشته باشید.
آیا میتوانم هر سایز و رنگی را صادر کنم؟
خروجی یک ردیف به ازای هر محصول است، نه یک ردیف به ازای هر نوع کالا. حداقل قیمت نوع کالا در صفحه محصول زمینه مفیدی است، اما برای گزارش موجودی سایز به سایز کافی نیست.
آیا میتوانم این را به یک ردیاب قیمت SHEIN در پایتون تبدیل کنم؟
مخزن شامل diff_runs.py برای مقایسه اجراهای سازگار و کامل است. جستجو و بازار یکسانی را حفظ کنید؛ مفقود شدن یک محصول از یک انتخاب محدود شده، مدرکی بر حذف آن توسط SHEIN نیست.
آیا این به یک API رسمی محصول SHEIN نیاز دارد؟
گردش کار مرورگر مستند شده، دادههای جاسازی شده در صفحات SHEIN را میخواند. این کار نیازی به دسترسی به یک API رسمی محصول جداگانه ندارد و این مقاله هیچ ادعایی در مورد در دسترس بودن چنین APIهایی برای شرکای خاص نمیکند.
هزینه یک اجرای جمعآوری چقدر است؟
هیچ قیمت ثابتی برای هر اجرا توسط این مثال تعیین نشده است. تعداد حلهای کپچا، استفاده از مرورگر از راه دور و استفاده از پروکسی اختیاری ورودیهای جداگانهای هستند؛ قبل از یک اجرای پولی، قیمتهای فعلی سرویسها را بررسی کنید.
از این گردش کار فقط در جاهایی استفاده کنید که اجازه دارید و مطابق با شرایط سایت، robots.txt و الزامات حفاظت از دادهها باشد. نرخ درخواستها را ملایم نگه دارید و در صورت رد دسترسی، متوقف شوید. این مثال مربوط به اطلاعات محصول است و نیازی به حسابهای مشتری یا دادههای شخصی ندارد.
خروجی مفید در اینجا یک لیست کوتاه کوچک و قابل ردیابی است: هر قیمت دارای واحد پول است، هر رکورد دارای زمان جمعآوری است و فیلدهای مفقود قابل مشاهده باقی میمانند. با نمونه همراه شروع کنید، سپس تصمیم بگیرید که آیا بازار مستند شده و محدوده سطح محصول اسکرپر با وظیفه شما مطابقت دارد یا خیر.
یادداشت ایجاد: این مقاله با استفاده از هوش مصنوعی مولد از مستندات پروژه و دادههای نمونه همراه تهیه شده است. مثال فیلتر آفلاین با آن نمونه مطابقت داده شد. هیچ اسکرپینگ زنده SHEIN برای این مقاله انجام نشده است.

دیدگاهها و نقدها
دیدگاه خود را درباره این تحلیل با دیگر خوانندگان به اشتراک بگذارید.
ارسال دیدگاه جدید
هنوز دیدگاهی برای این مقاله ثبت نشده است.
نخستین نفری باشید که دیدگاه یا نقد خود را درباره این موضوع مینویسد.