لماذا يستحق Etsy الاستخراج — وما الذي يمنعك؟
إذا كنت تبيع منتجات حسب الطلب (Print-on-Demand) على Etsy أو تخطط لذلك، فأنت تعرف أن النيش المناسب يُحدد الفارق بين متجر يدرّ أرباحًا ومتجر يغرق في الضوضاء. لكن اكتشاف هذا النيش يدويًا — تصفح مئات صفحات البحث، نسخ الأسعار يدويًا، حساب عدد البائعين — مُستهلك للوقت بشكل لا يُصدق. الحل؟ استخراج بيانات Etsy (scrape Etsy) بشكل منهجي لأبحاث النيش.
Etsy سوق ضخم: أكثر من 7 ملايين بائع ومئات الملايين من القوائم. البيانات متاحة علنيًا — أسعار القوائم، أعداد المبيعات التقريبية، التقييمات، مصطلحات البحث الرائجة — لكن الموقع يحمي نفسه بـ Cloudflare وحدود معدل صارمة. هذا الدليل يُغطي كل ما تحتاجه: بنية الموقع، التحديات التقنية، أنماط الاستخراج، أمثلة كود عملية، والاعتبارات الأخلاقية.
بنية Etsy: نقاط الدخول الأربعة
قبل كتابة أي كود، يجب أن تفهم كيف يُنظّم Etsy بياناته. هناك أربعة أنواع رئيسية من الصفحات التي تهمك:
1. صفحات البحث
الرابط: https://www.etsy.com/search?q=QUERY&ref=search_bar
كل صفحة نتائج تعرض حتى 48 بطاقة منتج (listing card). كل بطاقة تحتوي على:
- عنوان القائمة (listing title)
- السعر
- تقييم نجومي + عدد المراجعات
- شارة "Bestseller" أو "Star Seller" إن وُجدت
- صورة مصغّرة
- رابط للصفحة التفصيلية
محددات CSS مفيدة:
.v2-listing-card— بطاقة المنتج الكاملة.v2-listing-card__info .v2-listing-card__price— السعر.v2-listing-card__info .v2-listing-card__title— العنوانa.listing-link— الرابط التفصيلي (يحتوي على معرّف القائمة)
2. صفحات تفاصيل القائمة (Listing Detail)
الرابط: https://www.etsy.com/listing/LISTING_ID/SLUG
هنا تجد البيانات الأغنى:
- الوصف الكامل
- خيارات المتغيرات (Variants) وأسعارها
- تكلفة الشحن
- عدد المفضلات (Favorites)
- اسم المتجر ورابطه
- قسم المراجعات
XPath للسعر: //div[contains(@class,'buy-box__price')]/span[contains(text(),'$')]
3. صفحات المتاجر (Shop Pages)
الرابط: https://www.etsy.com/shop/SHOP_NAME
كل صفحة متجر تعرض:
- شارة المبيعات: "X Sales" — هذا تقدير تقريبي يعرضه Etsy
- عدد القوائم النشطة
- تقييم المتجر الإجمالي
- سنة الانضمام
- الموقع الجغرافي
XPath لعدد المبيعات: //span[contains(text(),'Sales')]/preceding-sibling::span
4. شجرة الفئات (Category Trees)
Etsy يكشف فئاته عبر https://www.etsy.com/c/CATEGORY_SLUG. يمكنك البدء من الفئات الرئيسية والنزول عبر الفئات الفرعية. ملف https://www.etsy.com/sitemap.xml يُدرج روابط الفئات أيضًا.
الحواجز التقنية: Cloudflare وحدود المعدل
Etsy يستخدم Cloudflare كطبقة حماية أولى. هذا يعني:
- تحديات JavaScript (JS Challenges) عند الطلبات عالية التردد من نفس IP
- حظر IP بعد عدد معين من الطلبات المتتالية (حوالي 80-120 طلب من نفس IP في جلسة قصيرة)
- تحديات CAPTCHA (Turnstile) عند سلوك مشبوه
بالإضافة إلى ذلك، يفرض Etsy حدود معدل داخلية:
- حوالي 200 طلب/دقيقة من IP واحد قبل التقييد
- تخفيض تدريجي للسرعة (Rate Throttling) — استجابات أبطأ فأبطأ
- كتل كاملة (403 Forbidden) بعد تجاوز الحد
لماذا البروكسيات السكنية هي الخيار الصحيح
بروكسيات مراكز البيانات (Datacenter Proxies) تُكتشف بسهولة لأن نطاقات IP الخاصة بمزودي الاستضافة معروفة. البروكسيات السكنية تستخدم عناوين IP حقيقية مرتبطة بمزودي إنترنت حقيقيين — مما يجعل طلباتك تبدو كأنها من مستخدمين عاديين.
| نوع البروكسيات | النجاح ضد Cloudflare | السرعة | التكلفة | الملاءمة لـ Etsy |
|---|---|---|---|---|
| بروكسيات مراكز البيانات | ضعيف — تُحظر بسرعة | سريعة جدًا | منخفضة | غير مناسبة |
| بروكسيات سكنية دوّارة | ممتاز — IP حقيقي لكل طلب | متوسطة | متوسطة-عالية | الأفضل |
| بروكسيات سكنية ثابتة | جيد — لكن IP واحد يُستنفد | متوسطة | عالية | جيد للجلسات الطويلة |
| بروكسيات موبايل | ممتاز — أعلى موثوقية | متوسطة-بطيئة | عالية جدًا | مبالغة لمعظم الحالات |
بالنسبة لأغلب فرق أبحاث النيش على Etsy، البروكسيات السكنية الدوّارة مع دوران لكل طلب (per-request rotation) هي الخيار الأمثل من حيث التوازن بين التكلفة والموثوقية.
أنماط استخراج بيانات Etsy لأبحاث النيش
الهدف ليس جمع بيانات عشوائيًا — بل الإجابة عن أسئلة محددة:
اكتشاف اتجاهات البحث (Trending Search Terms)
Etsy يعرض مقترحات البحث في نقطتين:
- شريط البحث — الإكمال التلقائي (Autocomplete) عند الكتابة
- صفحة نتائج البحث — قسم "Related searches" في الأسفل
يمكنك استخراج الإكمال التلقائي عبر طلبات GET بسيطة:
curl -x http://user-country-US:PASSWORD@gate.proxyhat.com:8080 \
"https://www.etsy.com/api/v3/ajax/member/search-suggestions?query=custom+t+shirt" \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
هذا يعيد قائمة باقتراحات البحث ذات الصلة — مثالي لاكتشاف كلمات مفتاحية طويلة (long-tail keywords).
عدد البائعين لكل نيش
ابحث عن مصطلح نيش، ثم احسب عدد القوائم الفريدة عبر الصفحات. إذا كان هناك 10,000+ قائمة، النيش مُشبع. إذا كان أقل من 500، قد تكون هناك فرصة.
متوسط نقاط السعر
استخرج الأسعار من بطاقات المنتجات في نتائج البحث، ثم احسب المتوسط والوسيط والانحراف المعياري. هذا يُخبرك بما يدفعه المشتري بالفعل — وليس ما يطلبه البائعون الجدد.
مثال بايثون: من البحث إلى تفاصيل القائمة
هذا السكربت يوضح الدفق الكامل: البحث → استخراج بطاقات القوائم → زيارة صفحات التفاصيل مع دوران البروكسيات السكنية.
import requests
from bs4 import BeautifulSoup
import re
import time
import random
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
PROXIES = {"http": PROXY_URL, "https": PROXY_URL}
HEADERS = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Accept": "text/html,application/xhtml+xml",
}
def fetch_search_results(query, page=1):
"""استخراج صفحة نتائج بحث Etsy"""
url = f"https://www.etsy.com/search?q={query}&page={page}"
resp = requests.get(url, headers=HEADERS, proxies=PROXIES, timeout=30)
resp.raise_for_status()
return resp.text
def parse_listing_cards(html):
"""تحليل بطاقات القوائم من صفحة البحث"""
soup = BeautifulSoup(html, "html.parser")
listings = []
cards = soup.select(".v2-listing-card")
for card in cards:
link_tag = card.select_one("a.listing-link")
title_tag = card.select_one(".v2-listing-card__title")
price_tag = card.select_one(".v2-listing-card__price .currency-value")
if link_tag and title_tag:
listing_id = re.search(r"/listing/(\d+)", link_tag.get("href", ""))
listings.append({
"listing_id": listing_id.group(1) if listing_id else None,
"title": title_tag.get_text(strip=True),
"price": price_tag.get_text(strip=True) if price_tag else None,
"url": f"https://www.etsy.com{link_tag['href'].split('?')[0]}" if link_tag.get('href') else None,
})
return listings
# الخطوة 1: جلب نتائج البحث
html = fetch_search_results("custom+t+shirt+funny")
listings = parse_listing_cards(html)
print(f"Found {len(listings)} listings")
for l in listings[:5]:
print(f" {l['listing_id']}: {l['title'][:60]} — {l['price']}")
الآن ننتقل إلى صفحات التفاصيل مع دوران IP لكل طلب عبر ProxyHat:
def fetch_listing_detail(listing_id, session_id=None):
"""جلب صفحة تفاصيل القائمة مع بروكسي سكني دوّار"""
# دوران IP لكل طلب عبر تغيير اسم المستخدم
# إذا أردت جلسة لاصقة (sticky session)، أضف session flag
username = "user-country-US"
if session_id:
username = f"user-country-US-session-{session_id}"
proxy_url = f"http://{username}:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
url = f"https://www.etsy.com/listing/{listing_id}"
resp = requests.get(url, headers=HEADERS, proxies=proxies, timeout=30)
resp.raise_for_status()
return resp.text
def parse_listing_detail(html):
"""تحليل صفحة تفاصيل القائمة"""
soup = BeautifulSoup(html, "html.parser")
result = {}
# الوصف
desc_tag = soup.select_one("#description-text")
result["description"] = desc_tag.get_text(strip=True)[:500] if desc_tag else None
# المفضلات
fav_tag = soup.select_one("[data-favorites-count]")
result["favorites"] = fav_tag.get("data-favorites-count") if fav_tag else None
# اسم المتجر
shop_tag = soup.select_one("a.shop-name")
result["shop_name"] = shop_tag.get_text(strip=True) if shop_tag else None
return result
# الخطوة 2: جلب تفاصيل كل قائمة مع دوران IP
for listing in listings[:10]:
if not listing["listing_id"]:
continue
detail_html = fetch_listing_detail(listing["listing_id"])
detail = parse_listing_detail(detail_html)
listing.update(detail)
print(f" {listing['listing_id']}: favs={detail.get('favorites')}, shop={detail.get('shop_name')}")
time.sleep(random.uniform(2, 5)) # تأخير عشوائي بين الطلبات
تحليلات المتاجر: المبيعات والقوائم والتقييمات
Etsy يكشف بيانات متجر قيّمة لأبحاث المنافسين. شارة "X Sales" على صفحة المتجر تعطي تقديرًا تقريبيًا لإجمالي المبيعات.
def fetch_shop_data(shop_name):
"""استخراج بيانات متجر Etsy"""
# استخدام جلسة لاصقة (sticky session) للتنقل داخل المتجر
proxy_url = "http://user-country-US-session-shop1:PASSWORD@gate.proxyhat.com:8080"
proxies = {"http": proxy_url, "https": proxy_url}
url = f"https://www.etsy.com/shop/{shop_name}"
resp = requests.get(url, headers=HEADERS, proxies=proxies, timeout=30)
resp.raise_for_status()
soup = BeautifulSoup(resp.text, "html.parser")
data = {"shop_name": shop_name}
# عدد المبيعات التقريبي
sales_tag = soup.select_one("span[data-sales]")
if not sales_tag:
# طريقة بديلة — البحث في النص</pre></code>
<p>لنكمل السكربت:</p>
<pre><code> sales_text = None
for span in soup.find_all("span"):
if "Sales" in span.get_text():
sales_text = span.get_text(strip=True)
break
data["sales_text"] = sales_text # مثال: "2,431 Sales"
data["sales_count"] = int(re.sub(r"[^0-9]", "", sales_text)) if sales_text else 0
# عدد القوائم النشطة
listings_count = soup.select_one(".wt-text-caption .wt-text-brick")
data["active_listings_text"] = listings_count.get_text(strip=True) if listings_count else None
# تقييم المتجر
rating_tag = soup.select_one("[data-rating]")
data["rating"] = rating_tag.get("data-rating") if rating_tag else None
# عدد المراجعات
reviews_tag = soup.select_one(".wt-text-caption a[href*='reviews']")
data["review_count_text"] = reviews_tag.get_text(strip=True) if reviews_tag else None
return data
# مثال: تحليل عدة متاجر
shops = ["CoolTeesDesign", "VintageVibesCo", "PrintMagicShop"]
for shop in shops:
data = fetch_shop_data(shop)
print(f"{data['shop_name']}: {data['sales_text']} | Rating: {data['rating']} | {data.get('review_count_text', 'N/A')}")
time.sleep(random.uniform(3, 6))
# مثال مُخرجات:
# CoolTeesDesign: 2,431 Sales | Rating: 4.8 | 1,204 reviews
# VintageVibesCo: 890 Sales | Rating: 4.9 | 412 reviews
بناء مصفوفة تنافسية
بعد جمع بيانات المتاجر، صنّفها في جدول:
| المقياس | نيش منخفض المنافسة | نيش متوسط | نيش مُشبع |
|---|---|---|---|
| عدد القوائم في البحث | < 500 | 500 – 5,000 | > 5,000 |
| متوسط المبيعات/متجر | < 100 | 100 – 2,000 | > 2,000 |
| متوسط السعر | أقل من $15 | $15 – $35 | > $35 |
| نسبة المتاجر Star Seller | < 10% | 10% – 30% | > 30% |
استراتيجيات دوران IP والجلسات اللاصقة
Etsy حساس بشكل خاص للطلبات المتتالية من نفس IP. إليك أفضل الممارسات:
دوران لكل طلب (Per-Request Rotation)
استخدم هذا عند استخراج صفحات البحث. كل طلب يحصل على IP سكني جديد. مع ProxyHat، يتم ذلك تلقائيًا عند استخدام اسم المستخدم الأساسي بدون علامة جلسة:
# دوران تلقائي — كل طلب = IP جديد
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
جلسات لاصقة (Sticky Sessions)
عند تصفح متجر كامل أو جمع مراجعات قائمة واحدة، تحتاج أن يبقى الطلب من نفس IP. أضف علامة جلسة:
# جلسة لاصقة — نفس IP لمدة تصل إلى 30 دقيقة
PROXY_URL = "http://user-country-US-session-abc123:PASSWORD@gate.proxyhat.com:8080"
الاستهداف الجغرافي
Etsy يعرض نتائج مختلفة بناءً على الموقع. إذا كنت تستهدف السوق الأمريكي:
PROXY_URL = "http://user-country-US:PASSWORD@gate.proxyhat.com:8080"
للسوق الألماني:
PROXY_URL = "http://user-country-DE:PASSWORD@gate.proxyhat.com:8080"
تأخيرات بين الطلبات
حتى مع بروكسي سكني دوّار، أضف تأخيرات عشوائية:
- بين صفحات البحث: 2-4 ثوانٍ
- بين صفحات التفاصيل: 3-6 ثوانٍ
- بين المتاجر: 5-10 ثوانٍ
الاعتبارات الأخلاقية: البائعون على Etsy أعمال صغيرة
هذا القسم مهم. بائعو Etsy هم في الغالب أعمال صغيرة وأفراد يصنعون منتجاتهم بيدهم. عند استخراج بيانات Etsy:
افعل ✓
- استخرج البيانات لأبحاث السوق والنيش — فهم ما يبيع، بكم، ولمن
- احترم
robots.txt— راجعhttps://www.etsy.com/robots.txtقبل البدء - استخدم البيانات لبناء منتجات أصلية ومبتكرة تخدم جمهورك
- حدد معدل طلباتك — لا تُغرق الموقع
- التزم بـ GDPR وCCPA إذا كنت تتعامل مع بيانات شخصية
لا تفعل ✗
- لا تنسخ تصاميم الآخرين — استخراج البيانات لا يمنحك حقًا في سرقة الإبداع
- لا تعيد نشر وصف المنتجات كاملة — هذا محتوى محمي بحقوق الطبع
- لا تستخرج بيانات شخصية للبائعين أو المشترين
- لا تُشبّع خوادم Etsy بطلبات غير ضرورية
القاعدة الذهبية: استخدم البيانات المستخرجة لفهم السوق، لا لاستنساخ منتجات الآخرين. النيش الناجح يأتي من الإضافة والابتكار، لا من النسخ.
نصائح متقدمة لأبحاث النيش على Etsy
تتبع الاتجاهات الموسمية
استخرج نفس الاستعلامات كل أسبوعين وسجّل التغييرات في عدد القوائم والأسعار. هذا يكشف الاتجاهات الموسمية (مثل: تيشيرات عيد الأب في مايو).
تحليل الفجوات السعرية
إذا كان متوسط سعر النيش $25 لكن الوسيط $18، هناك فرصة لمنتجات premium في الفجوة بينهما.
مراقبة معدل التقييمات
نيش بمتوسط تقييم 4.5 أو أقل يشير إلى عدم رضا العملاء — فرصة للدخول بمنتج أفضل.
استخراج مصطلحات البحث ذات الذيل الطويل
مصطلحات مثل "custom t shirt funny" مُشبعة. لكن "custom t shirt funny cat dad" قد تكون فرصة. استخرج اقتراحات البحث بشكل متكرر وابحث عن الكلمات ذات البحث المنخفض والمنافسة المحدودة.
النقاط الرئيسية
- Etsy يحمي نفسه بـ Cloudflare وحدود معدل داخلية — البروكسيات السكنية ضرورية للاستخراج المستدام
- ابدأ بصفحات البحث لتحديد حجم النيش، ثم انتقل لصفحات التفاصيل والمتاجر للتحليل العميق
- استخدم دوران IP لكل طلب لصفحات البحث، وجلسات لاصقة لتصفح المتاجر
- شارة "X Sales" على صفحات المتاجر تعطي تقديرًا تقريبيًا لحجم مبيعات المنافس
- استهدف الجغرافيا المناسبة — نتائج البحث تختلف حسب الموقع
- أضف تأخيرات عشوائية (2-6 ثوانٍ) حتى مع البروكسيات السكنية
- استخدم البيانات للابتكار، لا للنسخ — بائعو Etsy أعمال صغيرة تستحق الاحترام
- تحقق من
robots.txtوالتزم بحدود المعدل
جاهز لبدء أبحاث النيش على Etsy؟ احصل على بروكسيات سكنية من ProxyHat وابدأ استخراج البيانات بثقة. أو تعرّف على المزيد عن حالات استخدام استخراج الويب وتتبع نتائج محركات البحث.






