يبدأ أي مشروع لأبحاث السوق بسؤال واحد: أين توجد البيانات؟ الإجابة عادةً هي مواقع المنافسين، ومنصات المراجعات، ولوحات الوظائف، والأدلة التجارية — وكلها تقريباً محميّة باختبارات CAPTCHA تُوقف أدوات الجمع عند أول طلب. الحلّ عملي ومباشر: يتولّى CaptchaAI حلّ هذه الاختبارات آلياً عبر واجهة برمجية واحدة، فيبقى خط جمع البيانات مستمراً دون تدخّل يدوي. في هذا الدليل نبني خط جمع بيانات كاملاً بلغة Python، من اكتشاف نوع الحماية حتى تصدير النتائج إلى ملف CSV جاهز للتحليل.
مصادر بيانات أبحاث السوق وأنواع الحماية التي تعترضها
قبل كتابة أي سطر برمجي، من المفيد أن تعرف أين ستصطدم بالحماية. تختلف أنواع اختبارات CAPTCHA بحسب المصدر، ومعرفة النوع مسبقاً تساعدك على اختيار طريقة الحلّ المناسبة. الجدول التالي يلخّص أكثر المصادر شيوعاً في أبحاث السوق ونوع الحماية الغالب على كلٍّ منها:
| نوع المصدر | أمثلة | نوع الحماية الغالب |
|---|---|---|
| مواقع المراجعات | G2، Trustpilot، Yelp | reCAPTCHA v2/v3 |
| لوحات الوظائف | LinkedIn، Indeed | Cloudflare Challenge |
| الأدلة التجارية | YellowPages، Crunchbase | Turnstile، reCAPTCHA |
| وسائل التواصل الاجتماعي | Twitter/X، Reddit | أنواع متعددة |
| قواعد بيانات براءات الاختراع | USPTO، Google Patents | reCAPTCHA v2 |
| البيانات الحكومية | إيداعات SEC، بيانات التعداد | CAPTCHA صورية |
جميع هذه الأنواع — reCAPTCHA v2/v3 وCloudflare Turnstile وCloudflare Challenge والاختبارات الصورية — مدعومة ضمن CaptchaAI، لذا يمكن للجامع الواحد أن يغطّي مصادر متنوّعة دون الحاجة إلى أدوات منفصلة لكل موقع.
سيناريوهات واقعية لجمع بيانات السوق
يظهر عائد جمع البيانات بوضوح حين تربطه بقرار تجاري ملموس. فيما يلي أربع حالات شائعة يستفيد منها فرق المنتجات والتسويق:
مراقبة أسعار المنافسين
تتبّع أسعار المنافسين عبر منصات التجارة الإلكترونية، مع رصد تغيّرات الأسعار والعروض الترويجية ومستويات المخزون أولاً بأول.
تحليل انطباع العلامة التجارية
اجمع التقييمات والمراجعات من منصات المراجعات المختلفة، ثمّ جمّع مؤشرات الانطباع من مصادر متعددة في صورة واحدة قابلة للمقارنة.
تحليل سوق العمل
اجمع إعلانات الوظائف لفهم اتجاهات التوظيف، ونطاقات الرواتب، والطلب على المهارات في مجال عملك.
أبحاث براءات الاختراع
اجمع طلبات براءات الاختراع من قواعد البيانات العامة لتتبّع اتجاهات الابتكار ونشاط البحث والتطوير لدى المنافسين.
مثال من السوق الخليجي: تخيّل فريقاً في متجر إلكتروني سعودي يريد تسعير منتجاته أمام منافسين مثل noon وأمازون السعودية. يشغّل الفريق جامعاً يوميّاً يرصد أسعار مئة منتج مرجعي عبر المنصّتين؛ كثير من هذه الصفحات محميّ بـ reCAPTCHA أو Turnstile يتوقّف عندها أي سكربت بسيط. بإسناد الحلّ إلى CaptchaAI، يعمل الجامع دون انقطاع ويصدّر جدول أسعار محدّثاً كل صباح، فيتخذ الفريق قرار التسعير على بيانات اليوم لا بيانات الأمس. وتبقى القاعدة الذهبية: اجمع بيانات معروضة للعموم فقط، والتزم بشروط استخدام كل موقع واللوائح المحلية لحماية البيانات.
بناء خط جمع بيانات أبحاث السوق خطوة بخطوة
الفكرة الأساسية بسيطة: عند جلب كل صفحة، يفحص الكود محتواها بحثاً عن مفتاح الموقع (sitekey)؛ فإن وجد reCAPTCHA أو Turnstile، يرسل المعطيات إلى CaptchaAI عبر in.php، ثم يستطلع النتيجة دورياً من res.php حتى يعود التوكن، ويعيد إرسال الطلب مرفقاً به. الكلاس التالي يجمع هذا المنطق مع دوالّ لجمع المراجعات وملفات الشركات وتصديرها إلى CSV:
import requests
import time
import re
import csv
import os
API_KEY = os.environ["CAPTCHAAI_API_KEY"]
def solve_captcha(params):
params["key"] = API_KEY
resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
if not resp.text.startswith("OK|"):
raise Exception(f"Submit: {resp.text}")
task_id = resp.text.split("|")[1]
for _ in range(60):
time.sleep(5)
result = requests.get("https://ocr.captchaai.com/res.php", params={
"key": API_KEY, "action": "get", "id": task_id,
})
if result.text == "CAPCHA_NOT_READY":
continue
if result.text.startswith("OK|"):
return result.text.split("|", 1)[1]
raise Exception(f"Solve: {result.text}")
raise TimeoutError()
class MarketResearchCollector:
def __init__(self):
self.session = requests.Session()
self.session.headers["User-Agent"] = (
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 Chrome/120.0.0.0"
)
def fetch(self, url):
"""Fetch a page, solving CAPTCHAs as needed."""
resp = self.session.get(url)
# Detect reCAPTCHA
match = re.search(
r'data-sitekey=["\']([A-Za-z0-9_-]+)["\']', resp.text
)
if match:
token = solve_captcha({
"method": "userrecaptcha",
"googlekey": match.group(1),
"pageurl": url,
})
resp = self.session.post(url, data={
"g-recaptcha-response": token,
})
# Detect Turnstile
match = re.search(
r'data-sitekey=["\']([0-9x][A-Za-z0-9_-]+)["\']', resp.text
)
if match and "cf-turnstile" in resp.text:
token = solve_captcha({
"method": "turnstile",
"sitekey": match.group(1),
"pageurl": url,
})
resp = self.session.post(url, data={
"cf-turnstile-response": token,
})
return resp.text
def collect_reviews(self, urls):
"""Collect review data from multiple pages."""
reviews = []
for url in urls:
try:
html = self.fetch(url)
page_reviews = self._parse_reviews(html)
reviews.extend(page_reviews)
print(f" Collected {len(page_reviews)} reviews from {url}")
time.sleep(2) # Polite delay
except Exception as e:
print(f" Error on {url}: {e}")
return reviews
def collect_company_profiles(self, urls):
"""Collect company profile data."""
profiles = []
for url in urls:
try:
html = self.fetch(url)
profile = self._parse_profile(html)
if profile:
profiles.append(profile)
print(f" Collected: {profile.get('name', 'Unknown')}")
time.sleep(2)
except Exception as e:
print(f" Error on {url}: {e}")
return profiles
def _parse_reviews(self, html):
"""Extract review data from HTML."""
reviews = []
# Generic review extraction patterns
for match in re.finditer(
r'class="review-text"[^>]*>(.*?)</div>', html, re.DOTALL
):
reviews.append({
"text": match.group(1).strip()[:500],
})
return reviews
def _parse_profile(self, html):
"""Extract company profile from HTML."""
name = re.search(r'<h1[^>]*>(.*?)</h1>', html)
desc = re.search(
r'class="description"[^>]*>(.*?)</div>', html, re.DOTALL
)
return {
"name": name.group(1).strip() if name else None,
"description": desc.group(1).strip()[:300] if desc else None,
}
def export_csv(self, data, filename):
"""Export collected data to CSV."""
if not data:
return
keys = data[0].keys()
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.DictWriter(f, fieldnames=keys)
writer.writeheader()
writer.writerows(data)
print(f"Exported {len(data)} records to {filename}")
تشغيل الجامع
بعد تعريف الكلاس، يصبح الاستخدام مباشراً: أنشئ نسخة من الجامع، مرّر قوائم عناوين المراجعات وملفات الشركات، ثم صدّر كل مجموعة إلى ملف CSV مستقل:
collector = MarketResearchCollector()
# Collect competitor reviews
review_urls = [
"https://example-reviews.com/product/competitor-a",
"https://example-reviews.com/product/competitor-b",
"https://example-reviews.com/product/competitor-c",
]
reviews = collector.collect_reviews(review_urls)
collector.export_csv(reviews, "competitor_reviews.csv")
# Collect company profiles
profile_urls = [
"https://example-directory.com/company/alpha-corp",
"https://example-directory.com/company/beta-inc",
]
profiles = collector.collect_company_profiles(profile_urls)
collector.export_csv(profiles, "company_profiles.csv")
تذكّر أن مفتاح الـ API يُقرأ من متغيّر البيئة CAPTCHAAI_API_KEY، فلا تضع بيانات الاعتماد داخل الكود مباشرة.
توسيع نطاق الجمع دون انقطاع
حين ينتقل المشروع من عشرات الصفحات إلى آلافها، يصبح ضبط الإيقاع والبنية أهمّ من سرعة الكود نفسه. الإعدادات التالية تحافظ على استقرار الجمع وتقلّل احتمال الحظر:
| العامل | التوصية |
|---|---|
| المباعدة بين الطلبات | 2–5 ثوانٍ بين كل صفحة وأخرى |
| عدد الجامعات المتزامنة | 5–10 للنطاق المتوسط |
| تدوير الخوادم الوسيطة (Proxy) | ضروري لأكثر من 100 صفحة في الساعة |
| إزالة التكرار | حذف قائم على التجزئة (hash) قبل التخزين |
| الجدولة | تشغيل يومي أو أسبوعي لبيانات الاتجاهات |
التكلفة ونموذج التسعير القائم على الـ Threads
على عكس النماذج التي تحاسب على كل عملية حلّ على حدة، يعتمد CaptchaAI على تسعير قائم على الـ Threads: تدفع اشتراكاً شهرياً ثابتاً مقابل عدد من المسارات المتزامنة، مع عدد غير محدود من عمليات الحل لكل Thread طوال الشهر. هذا يجعل تكلفة أبحاث السوق قابلة للتنبّؤ بصرف النظر عن عدد الصفحات المجموعة:
- للمشاريع الصغيرة والتجارب: خطة BASIC بسعر 15 دولاراً شهرياً و5 Threads تكفي لعمليات جمع دورية محدودة.
- للفرق التي تجمع آلاف الصفحات يومياً: خطة ADVANCE بسعر 90 دولاراً شهرياً و50 Thread توفّر تزامناً أعلى ورصيد حلّ غير محدود لكل مسار.
وبما أن الحماية تظهر عادةً على جزء من الصفحات لا على كلّها، فإن عدداً معتدلاً من الـ Threads يكفي لتغطية معظم أحمال جمع البيانات. للاطّلاع على الأسعار المحدّثة راجع صفحة التسعير الرسمية على captchaai.com/pricing.
الأسئلة الشائعة
ما أنواع CAPTCHA التي أصادفها عند جمع بيانات أبحاث السوق؟
غالباً reCAPTCHA v2/v3 على مواقع المراجعات، وCloudflare Turnstile أو Cloudflare Challenge على الأدلة ولوحات الوظائف، إضافةً إلى الاختبارات الصورية على بعض البوابات الحكومية. الجامع في هذا الدليل يكتشف reCAPTCHA وTurnstile تلقائياً ويسند حلّهما إلى CaptchaAI.
كيف أتعامل مع المواقع التي تحظر أدوات الجمع بالكامل؟
اجمع بين CaptchaAI وتدوير الخوادم الوسيطة وأنماط طلب واقعية (مباعدة زمنية ورؤوس متصفّح طبيعية). لمزيد من التفاصيل راجع دليل الجمع الموثوق دون التعرّض للحظر.
هل يمكنني جدولة عملية الجمع لتعمل دورياً دون تدخّل؟
نعم. شغّل السكربت عبر مهمة مجدولة (cron أو مجدول النظام) يومياً أو أسبوعياً بحسب حاجتك لبيانات الاتجاهات، ودع الجامع يصدّر ملف CSV جديداً في كل تشغيل.
كيف أمنع تكرار البيانات عند الجمع من عدة مصادر؟
احسب قيمة تجزئة (hash) لكل سجلّ قبل التخزين، وتجاهل السجلّات التي سبق أن رأيت قيمتها. هذا يضمن ألّا تتكرّر المراجعة أو ملف الشركة نفسه عند وروده من أكثر من مصدر.
أي خطة من CaptchaAI تناسب حجم مشروعي؟
ابدأ بخطة BASIC (15 دولاراً شهرياً، 5 Threads) للتجارب الأولى، وانتقل إلى ADVANCE (90 دولاراً شهرياً، 50 Thread) عندما يزداد التزامن المطلوب. جميع الخطط تشمل عدداً غير محدود من عمليات الحل لكل Thread.