ما هو DrissionPage ولماذا يهم مستخدمي البروكسي؟
DrissionPage هو إطار عمل Python مفتوح المصدر يجمع بين بساطة requests وقوة التحكم في Chromium عبر بروتوكول CDP (Chrome DevTools Protocol). بالنسبة لمطوري الكشط (scraping) الذين يستخدمون بروكسي سكني مثل drissionpage proxy، يوفر هذا الإطار ميزة فريدة: يمكنك البدء في وضع HTTP الخفيف، ثم التبديل إلى وضع المتصفح الكامل عند الحاجة لتشغيل JavaScript — دون فقدان ملفات تعريف الارتباط (cookies) أو حالة الجلسة.
هذا يعني توفيرًا كبيرًا في التكلفة. تشغيل متصفح Chromium كامل يستهلك حوالي 200–400 ميجابايت من الذاكرة لكل مثيل، بينما وضع HTTP يستهلك أقل من 20 ميجابايت. في عمليات الكشط واسعة النطاق التي تتضمن آلاف الطلبات، يقلل DrissionPage تكاليف البنية التحتية بنسبة قد تصل إلى 90% مقابل تشغيل Selenium أو Playwright لكل طلب.
تنبيه قانوني وأخلاقي: هذا الدليل مخصص للوصول إلى البيانات العامة المشروعة فقط. تأكد من الالتزام بـ GDPR في الاتحاد الأوروبي و CFAA في الولايات المتحدة. احترم ملف robots.txt وشروط الخدمة، وفضل واجهات API الرسمية عند توفرها.نموذج DrissionPage: SessionPage و ChromiumPage و WebPage
يتكون DrissionPage من ثلاثة أنواع رئيسية للصفحات، وكلها تشارك نفس الواجهة البرمجية في معظم العمليات:
| النوع | الوصف | استهلاك الموارد | الاستخدام الأمثل |
|---|---|---|---|
SessionPage | وضع HTTP يعتمد على urllib3 — يشبه requests | منخفض جدًا (~20MB) | صفحات HTML ثابتة، واجهات API، JSON |
ChromiumPage | تحكم كامل في Chromium عبر CDP | مرتفع (~200–400MB) | صفحات JavaScript الديناميكية، تفاعل مع DOM |
WebPage | يجمع النوعين مع تبديل سلس وحالة مشتركة | متغير حسب الوضع النشط | الحالات المختلطة التي تتطلب كلا الوضعين |
الفكرة الجوهرية: لماذا تشغل متصفحًا كاملًا لجلب صفحة ثابتة؟ مع drissionpage web scraping، تبدأ في وضع HTTP السريع، وإذا واجهت صفحة تتطلب تشغيل JavaScript، تنتقل إلى وضع المتصفح مع الاحتفاظ بنفس ملفات تعريف الارتباط ورؤوس الجلسة. هذا النهج يقلل التكلفة ويزيد الإنتاجية بشكل كبير.
الواجهة البرمجية الأصلية: ele() و eles() و ChromiumOptions و listen
تحديد العناصر بـ ele() و eles()
يستخدم DrissionPage صيغة موحدة لتحديد العناصر تشبه CSS selectors لكنها أكثر مرونة:
from DrissionPage import WebPage
page = WebPage()
page.get('https://example.com')
# تحديد بالسمة
title = page.ele('@class=product-title')
# تحديد بالوسم
inputs = page.eles('tag:input')
# تحديد بـ XPath
price = page.ele('xpath://span[@class="price"]')
# تحديد مركب
button = page.ele('tag:button@@text()=شراء')
الصيغة @class=... تبحث عن عنصر بسمة class محددة، وtag:input تبحث بالوسم، وxpath://... تستخدم XPath القياسي. كما يدعم @@ للجمع بين شروط متعددة.
إعداد ChromiumOptions
لإعداد المتصفح، تستخدم ChromiumOptions لتكوين جميع جوانب جلسة Chromium:
from DrissionPage import ChromiumOptions
co = ChromiumOptions()
co.headless(True)
co.set_argument('--no-sandbox')
co.set_argument('--disable-gpu')
co.set_user_agent('Mozilla/5.0 (Windows NT 10.0; Win64; x64)...')
co.set_proxy('http://gate.proxyhat.com:8080')
التقاط طلبات XHR/JSON الخلفية بـ listen
من أقوى ميزات drissionpage chromium هي القدرة على التقاط طلبات الشبكة الخلفية (XHR/Fetch) التي تقوم بها الصفحة تلقائيًا. هذا يكشف عن واجهات API مخفية:
from DrissionPage import ChromiumPage
page = ChromiumPage()
page.listen.start('api/products') # مراقبة الطلبات التي تطابق النمط
page.get('https://example.com/shop')
for packet in page.listen.steps(count=5):
print(packet.url)
print(packet.response.body) # جسم الاستجابة JSON
إعداد البروكسي في DrissionPage
تكوين drissionpage proxy يختلف حسب الوضع. لـ SessionPage، تستخدم set_proxies() مباشرة. لـ ChromiumPage، تمرر البروكسي عبر ChromiumOptions.set_proxy().
البروكسي في SessionPage (وضع HTTP)
from DrissionPage import SessionPage
page = SessionPage()
page.set.proxies({
'http': 'http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080',
'https': 'http://user-country-US-session-abc123:pass@gate.proxyhat.com:8080',
})
page.get('https://httpbin.org/ip')
print(page.json)
البروكسي في ChromiumPage (وضع المتصفح)
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_proxy('http://user-country-DE-session-xyz789:pass@gate.proxyhat.com:8080')
co.headless(True)
page = ChromiumPage(co)
page.get('https://httpbin.org/ip')
print(page.ele('tag:body').text)
لماذا البروكسي السكني تحديدًا؟ الأهداف الصعبة مثل منصات التجارة الإلكترونية الكبرى وشبكات التواصل الاجتماعي تستخدم أنظمة مكافحة البوتات التي تكشف عناوين IP الخاصة بمراكز البيانات بسرعة. البروكسي السكني يوفر عناوين IP من مزودي خدمة إنترنت حقيقيين، مما يجعل الطلبات تبدو كأنها من مستخدمين عاديين. حسب دراسات الصناعة، يمكن أن تصل نسبة حظر بروكسي مراكز البيانات إلى 40–60% على المنصات المحمية، بينما يبقى معدل نجاح البروكسي السكني فوق 95%.
مثال عملي: WebPage يبدأ بـ HTTP ثم ينتقل إلى Chromium
هذا مثال كامل قابل للتشغيل يوضح القوة الحقيقية لـ DrissionPage: نبدأ في وضع HTTP عبر بروكسي سكني أمريكي بجلسة ثابتة، نجمع البيانات الأولية، ثم ننتقل إلى وضع المتصفح لصفحة تتطلب JavaScript:
from DrissionPage import WebPage
import json
# بناء اسم المستخدم مع استهداف جغرافي وجلسة ثابتة
country = 'US'
session_id = 'abc123'
username = f'user-country-{country}-session-{session_id}'
password = 'pass'
proxy_url = f'http://{username}:{password}@gate.proxyhat.com:8080'
# إنشاء WebPage في وضع HTTP
page = WebPage(mode='s') # 's' = SessionPage
page.set.proxies({
'http': proxy_url,
'https': proxy_url,
})
# الخطوة 1: جلب صفحة ثابتة بوضع HTTP
page.get('https://httpbin.org/ip')
print('وضع HTTP — عنوان IP:', page.json['origin'])
# حفظ ملفات تعريف الارتباط
cookies = page.cookies(as_dict=True)
# الخطوة 2: التبديل إلى وضع المتصفح للصفحة الديناميكية
page.change_mode() # ينتقل إلى ChromiumPage تلقائيًا
# البروكسي مُطبق على المتصفح أيضًا
page.get('https://quotes.toscrape.com/js/')
# التقاط عناصر بعد تشغيل JavaScript
quotes = page.eles('@class=quote')
for q in quotes[:5]:
text = q.ele('@class=text').text
author = q.ele('@class=author').text
print(f'{author}: {text[:50]}...')
page.close()
لاحظ كيف أن change_mode() يحتفظ تلقائيًا بملفات تعريف الارتباط والحالة بين الوضعين. هذا يلغي الحاجة لإعادة المصادقة أو إعادة إعداد الجلسة.
أنماط الإنتاج: تثبيت الجلسة، إعادة المحاولة، التقاط الحزم، التزامن
تثبيت البروكسي لكل جلسة (Sticky Sessions)
عند الكشط المتسلسل لموقع واحد، تحتاج إلى الحفاظ على نفس عنوان IP طوال الجلسة لتجنب اكتشاف النظام. استخدم علم session- في اسم المستخدم:
import uuid
def build_proxy(country='US', session=None):
session = session or str(uuid.uuid4())[:8]
username = f'user-country-{country}-session-{session}'
return f'http://{username}:pass@gate.proxyhat.com:8080'
# كل جلسة تحصل على IP ثابت
session_a = build_proxy(session='sess-a001')
session_b = build_proxy(session='sess-b002')
إعادة المحاولة مع تبديل البروكسي
import time
def fetch_with_retry(page, url, max_retries=3):
for attempt in range(max_retries):
try:
resp = page.get(url, timeout=15)
if resp.status == 200:
return resp
except Exception as e:
print(f'محاولة {attempt+1} فشلت: {e}')
# تبديل الجلسة للحصول على IP جديد
new_proxy = build_proxy(session=f'retry-{attempt}')
page.set.proxies({'http': new_proxy, 'https': new_proxy})
time.sleep(2)
return None
اكتشاف واجهات API المخفية عبر listen
كثير من المواقع الحديثة تحمل بياناتها عبر طلبات XHR خلفية. بدلًا من تحليل HTML المعقد، يمكنك التقاط استدعاءات API مباشرة:
from DrissionPage import ChromiumPage, ChromiumOptions
co = ChromiumOptions()
co.set_proxy('http://user-country-GB-session-api001:pass@gate.proxyhat.com:8080')
co.headless(True)
page = ChromiumPage(co)
page.listen.start('/api/') # مراقبة جميع طلبات API
page.get('https://example.com/dashboard')
api_endpoints = []
for packet in page.listen.steps(count=20, timeout=10):
if packet.response.status == 200:
api_endpoints.append({
'url': packet.url,
'method': packet.method,
'body': packet.response.body[:500],
})
print(f'اكتشف {len(api_endpoints)} نقطة API')
for ep in api_endpoints:
print(json.dumps(ep, indent=2))
حدود التزامن
عند تشغيل عدة مثيلات Chromium معًا، راقب الموارد. كل مثيل Chromium يستهلك حوالي 300 ميجابايت من الذاكرة. على خادم بـ 8 جيجابايت، لا تتجاوز 20–25 جلسة متصفح متزامنة. للوضع HTTP فقط، يمكنك تشغيل مئات الجلسات المتزامنة بسهولة.
| الوضع | الذاكرة لكل مثيل | الحد العملي للتزامن (8GB RAM) | سرعة الطلب |
|---|---|---|---|
| SessionPage (HTTP) | ~20MB | 200–500 | 100–500 req/s |
| ChromiumPage | ~300MB | 20–25 | 5–15 req/s |
| WebPage (مختلط) | متغير | حسب الوضع النشط | متغير |
متى لا تنتقل إلى المتصفح؟
الانتقال إلى وضع Chromium ليس دائمًا الحل الأفضل. إليك الحالات التي يكفي فيها وضع HTTP:
- الصفحات الثابتة: إذا كان HTML يحتوي على البيانات مباشرة، لا حاجة لتشغيل JavaScript.
- واجهات API المكتشفة: إذا وجدت نقطة API عبر
listenسابقًا، استدعها مباشرة بـ SessionPage. - ملفات JSON/XML: استجابات API الخام لا تتطلب متصفحًا.
- الكشط واسع النطاق: آلاف الطلبات في الدقيقة — المتصفح سيكون عنق الزجاجة.
القاعدة العملية: ابدأ دائمًا بـ SessionPage. إذا أعطاك كود HTML فارغًا أو نصًا يشير إلى تفعيل JavaScript، انتقل إلى ChromiumPage. يمكنك معاينة مواقع البروكسي المتاحة لاختيار الموقع الأمثل لهدفك.
الاعتبارات الأخلاقية والقانونية
قبل البدء في أي عملية كشط، ضع في اعتبارك ما يلي:
- احترم robots.txt: تحقق من
https://target.com/robots.txtقبل الكشط. - معدل الطلبات: حافظ على معدل معقول (مثل 1–2 طلب/ثانية لكل IP) لتجنب إرهاق الخوادم.
- البيانات الشخصية: تجنب جمع البيانات الشخصية دون أساس قانوني، وتأكد من التوافق مع GDPR.
- شروط الخدمة: اقرأ شروط استخدام الموقع — بعض الموارد تمنع الكشط الآلي صراحة.
- فضل API الرسمي: إذا وفر الموقع واجهة API، استخدمها بدلًا من الكشط.
لمزيد من التفاصيل حول إعداد البروكسي، راجع وثائق ProxyHat الرسمية.
نقاط رئيسية
- DrissionPage يجمع HTTP والمتصفح في أداة واحدة مع حالة مشتركة — يوفر حتى 90% من تكاليف التشغيل.
- استخدم
SessionPageللصفحات الثابتة وChromiumPageللصفحات الديناميكية، وWebPageللحالات المختلطة.- البروكسي السكني عبر
gate.proxyhat.com:8080ضروري للأهداف المحمية بأنظمة مكافحة البوتات.listen.start()يكشف عن واجهات API المخفية — استخدمه لاكتشاف نقاط النهاية ثم استدعائها مباشرة بـ HTTP.- ثبّت الجلسة بـ
session-لتجنب تبديل IP غير المرغوب، وطبق إعادة المحاولة مع تبديل البروكسي.- التزم بـ robots.txt و GDPR و CFAA — الكشط الأخلاقي مستدام على المدى الطويل.
جرّب ProxyHat اليوم — ابدأ بـ خطط الأسعار المناسبة، أو استكشف حالة استخدام كشط الويب و تتبع نتائج البحث للمزيد من السيناريوهات العملية.






