مراجعة Botasaurus: برنامج تشغيل بحجم 4 ميغابايت، وتثبيت بحجم 122 ميغابايت، ورقم 0.08 مللي ثانية لا ينبغي الاقتباس منه

آخر تحديث في August 14, 2026
مراجعة Botasaurus: برنامج تشغيل بحجم 4 ميغابايت، وتثبيت بحجم 122 ميغابايت، ورقم 0.08 مللي ثانية لا ينبغي الاقتباس منه
ملخص AI
Botasaurus هو إطار عمل Python لاستخراج بيانات الويب من Omkar Cloud، ويقدّم نفسه كحزمة شاملة لبناء أدوات الزحف. تكتب دالة عادية، ثم تضيف عليها الزخرفة @browser أو @request أو @task، ويتولى الإطار ربطها ببرنامج تشغيل للمتصفح، وعميل HTTP شبيه بالمتصفح، والتخزين المؤقت، والتشغيل المتوازي، وإخراج النتائج بعدة صيغ. وهو في الحقيقة حزمة meta-package، وهذه هي النقطة المهمة: فالأمر مع pip install botasaurus لا يعني تثبيت مكتبة واحدة فقط في بيئتك، بل بناء مجموعة صغيرة من الحزم الأصلية مع شجرة واسعة من الاعتماديات المتداخلة. وقد اتضح أن هذه الحقيقة التقنية هي أكثر ما أمكنني قياسه بإنصاف.

Botasaurus هو إطار عمل بلغة Python لاستخراج بيانات الويب من Omkar Cloud، ويقدّم نفسه كحزمة شاملة لبناء أدوات الزحف. تكتب دالة عادية، ثم تضيف عليها الزخرفة @browser أو @request أو @task، ويتولى الإطار ربطها ببرنامج تشغيل للمتصفح، وعميل HTTP شبيه بالمتصفح، والتخزين المؤقت، والتشغيل المتوازي، وإخراج النتائج بعدة صيغ. وهو في الحقيقة حزمة meta-package، وهذه هي النقطة المهمة: فالأمر مع pip install botasaurus لا يعني تثبيت مكتبة واحدة فقط في بيئتك، بل بناء مجموعة صغيرة من الحزم الأصلية مع شجرة واسعة من الاعتماديات المتداخلة. وقد اتضح أن هذه الحقيقة التقنية هي أكثر ما أمكنني قياسه بإنصاف.

Botasaurus يروّج لنفسه من زاوية تجاوز أنظمة الكشف، وهذه بالضبط الزاوية التي لا تتناولها هذه المراجعة. لقد جردت الإطار من حيث: ما الذي يتم تثبيته، وما الذي يتم استيراده، وما الدوال المتاحة، وما الحجم الذي يستهلكه، وتحت أي ترخيص يُطرح — بدلًا من اختباره ضد أي نظام حماية حي. كل أرقام البصمة والاستيراد الواردة أدناه جاءت من pip، ومن python -c "import ..."، ومن فحص الأصناف بعد بنائها دون أن أطلب منها جلب أي صفحة؛ لم يتم تشغيل متصفح لإنتاج أي من هذه النتائج. لاحقًا شغّلت المتصفح فعلًا، لكن فقط على صفحات أنشأتها وخدمتها بنفسي على 127.0.0.1، لأرى ما الذي يعلنه برنامج التشغيل عن نفسه وهل يستطيع سحب المحتوى من صفحة تبني نفسها بالـ JavaScript. لم يكن هناك أي موقع حي، ولم يُتصل بأي خدمة مضادة للروبوتات، ولم يتم التعامل مع أي CAPTCHA. لذلك فإن الفعالية أمام المواقع الحقيقية خارج نطاق هذه المراجعة عمدًا، وأفضّل أن أقول ذلك بوضوح بدل أن أوحي بأنني أجريت اختبارًا لم أقم به.

ومع وضع هذا الحد الفاصل، فإن الخلاصة الأساسية هنا هي قصة بصمة واستهلاك، وهي قصة هادئة نسبيًا. التثبيت النظيف ينتج دليل site-packages بحجم 122.3 ميغابايت عبر 44 حزمة، على جهاز يبلغ فيه برنامج التشغيل في قلب المنظومة نحو 4 ميغابايت. الإطار ليس كبيرًا لأن برنامج التشغيل كبير؛ بل لأنه يفهم "الشامل" على أنه جلب numpy وlxml وgevent واثنتي عشرة حزمة أخرى لإنجاز مهمة جلب HTML. والنصف الثاني من النتيجة هو رقم ستراه يُستشهد به على أنه ميزة، لكنه لا يستحق الثقة: إذ إن import botasaurus يسجّل 0.08 مللي ثانية، وهو رقم يبدو خفيفًا للغاية، لكنه في الواقع مجرد باب أمامي فارغ.

ما هو Botasaurus فعلًا

Botasaurus — omkarcloud/botasaurus على GitHub، وكان يمتلك 5,561 نجمة و486 فورك و58 مشكلة مفتوحة عندما سحبت البيانات الوصفية في 14 يوليو 2026 — هو إطار عمل Python، وليس مكتبة أحادية الغرض. النسخ التي اختبرتها كانت botasaurus 4.0.97 للحزمة meta-package وbotasaurus-driver 4.0.92 للمحرّك تحتها. الحزمة الرئيسية تعلن requires-python >=3.7 (أما برنامج التشغيل فـ >=3.5)، وتصنيفات PyPI لا تدّعي إلا الدعم حتى 3.11. وقد ثُبتت بنجاح واجتازت اختبار استيراد أولي على Python 3.14.2 على جهازي. وهذا دليل على هذا التثبيت تحديدًا، لا ضمان توافق مع كل ميزة.

من المفيد تثبيت تصنيف الفئة التي ينتمي إليها، لأن ذلك يحدد ما الذي يعنيه "جيد" هنا. Botasaurus يقع في طرف الإطار البرمجي من الطيف، في المنطقة نفسها تقريبًا مع Scrapy وCrawlee — أي أنك تتبنى هيكله، وزخارفه، واتفاقياته، وهو يتولى طبقات التنفيذ التحتية. وهذا يختلف عن برنامج تشغيل متخصص مثل nodriver، الذي يوفّر اتصال Chrome DevTools Protocol ثم يتركك تكمل ما تريد. Botasaurus يجمع برنامج تشغيل (وهو botasaurus-driver) لكنه يلفّه داخل منظومة تشغيل مهام، وطبقة تخزين مؤقت، ومُسلسلات إخراج، وعميل طلبات. أنت لا تشتري برنامج تشغيل فقط؛ أنت تشتري سير عمل محدد الرأي بداخله برنامج تشغيل.

الزخارف الثلاثة هي التصميم كاملًا في صورة مختصرة، وكل نقاط الدخول الثلاث حقيقية — وقد تأكدت أن botasaurus.browser.browser وbotasaurus.request.request وbotasaurus.task.task كلها موجودة ويمكن استيرادها. @browser يشغّل دالتك فوق برنامج التشغيل المهيأ للتصفح. و@request يشغّلها فوق عميل HTTP خفيف صُمم ليبدو وكأنه متصفح. و@task هو الغلاف العام لكل ما لا يندرج بوضوح تحت الفئتين الأوليين. أضف الزخرفة، ويتكفل Botasaurus بالبنية المحيطة: تنفيذ متوازٍ، وإعادة استخدام برنامج التشغيل، وتخزين النتائج مؤقتًا، وكتابة JSON وCSV وExcel وHTML. الفكرة متماسكة. والسؤال الحقيقي هو: هل تريد كل هذا الإطار حول أداة الزحف؟ وهذه مسألة ذوق أكثر من كونها عيبًا.

الخلاصة، والحد الذي أقف عنده

Botasaurus كفء، متماسك الشكل، ويقوم بما يُفترض بالإطارات البرمجية أن تقوم به: يجعل الحالة الشائعة قصيرة. نموذج الزخارف نظيف. ترخيص MIT سخي فعلًا. والتثبيت يتم دون دراما. لو كنت أقيّم سهولة استخدام واجهة البرمجة وحدها، فسوف يحصل على تقييم جيد.

لكن ما أعود إليه دائمًا هو أن العنوان الأبرز في عرض الإطار نفسه — تجاوز الكشف — هو الشيء الوحيد الذي لا يمكن لمراجعة مسؤولة أن تتحدث عنه من دون توجيهه إلى دفاعات إنتاجية خاصة بأحدهم. صحيح أن برنامج التشغيل يضم واجهات تحمل صراحة علامة anti-detection: وهي دوال أثبت وجودها لكنني لم أختبر سلوكها ضد أي هدف. هذا هو كل ما سأقوله عنها. لم أوجهه إلى موقع محمي، ولم أقس نسبة نجاح، ولم أعكس آلية عمله، ولن أُوحي بأي من ذلك بصياغة الكلام. الدوال موجودة داخل الصنف. وما تفعله في العالم الحقيقي مراجعة أخرى غير هذه.

ما يلي هو جرد للقدرات، والتثبيت، واستهلاك الموارد، والترخيص، ثم ما يفعله برنامج التشغيل على صفحة أتحكم بها — وهو ادعاء أضيق مما تفعله معظم المراجعات لهذا النوع من الأدوات، وهذه الضيق هو المقصود.

ما الذي يعلنه عن نفسه

Measured results chart: Default browser disclosures by stack

هناك سؤال يمكن الإجابة عنه من دون الاقتراب من أي نظام حماية حقيقي: عندما يقود Botasaurus متصفحًا، ما الذي يفصح عنه ذلك المتصفح للصفحة التي يزورها؟ لقد أنشأت صفحة تقرأ الأمور الواضحة — navigator.webdriver، وسلسلة user-agent، والمنصة، واللغات، وعدد الإضافات والأجهزة، وشكل window.chrome, وما تقوله Permissions API، وأبعاد النافذة والشاشة — ثم خدمتها على 127.0.0.1، ووجهت إليها أربع حِزم: Botasaurus وnodriver وPlaywright وPuppeteer بوصفها أدوات مقارنة. الأربع كلها كانت تقود نفس نسخة Chrome (Chrome for Testing 151.0.7922.10)، لذلك ما يختلف هنا هو المكتبة لا المتصفح. جرى الاختبار في headless وheaded، ثلاث مرات لكل حالة. وكل قيمة أدناه بقيت ثابتة عبر المرات الثلاث.

الحزمةالوضعnavigator.webdriverرمز User-Agentnavigator.languages
Botasaurus 4.0.92headlessfalseHeadlessChrome/151.0.0.0["en-US"]
Botasaurus 4.0.92headedfalseChrome/151.0.0.0["en-US"]
nodriver 0.50.3headless / headedfalseHeadlessChrome/151 / Chrome/151["en-US"]
Playwright 1.56.0headless / headedtrueHeadlessChrome/151 / Chrome/151["en-US","en"]
Puppeteer 24.16.0headless / headedtrueHeadlessChrome/151 / Chrome/151["en-US"]

الاختلافات تعتمد على أداة المقارنة التي تختارها. أمام Puppeteer العادي، غيّر Botasaurus قيمة navigator.webdriver؛ قائمة اللغات وأبعاد النافذة ذات الصفر تطابقت، بينما اختلف user-agent فقط في تنسيق رقم الإصدار. وأمام Playwright العادي، شملت الفروقات الملحوظة أيضًا قائمة اللغات وأبعاد النافذة. وأمام nodriver، تطابق المتغير المنطقي واللغات، مع اختلاف في تنسيق user-agent فقط في الحقول المعروضة هنا. هذه ملاحظات عن الإعلانات الافتراضية، وليست درجة لتجاوز الكشف.

هناك تفصيلان يجعلان الأمر أكثر إثارة من مجرد قيمة false. الأول هو كيف تصل هذه القيمة. في كل الحِزم الأربع، لا تزال الخاصية هي getter الأصلية التابعة للمتصفح على Navigator.prototype — أي function get webdriver() { [native code] } — وليست خاصية مضافة على الكائن نفسه، ولا دالة مستبدلة. إذن Botasaurus لا يعيد كتابة الخاصية بعد تحميل الصفحة؛ بل تُحسم القيمة عند بدء المتصفح، وتبقى الخاصية نفسها غير ممسوسة.

والتفصيل الثاني هو ما يضع سقفًا على التسويق. في وضع headless، لا يزال user-agent في Botasaurus يعلن HeadlessChrome/151.0.0.0 — وهو نفس ما يعلنه Puppeteer العادي، ونفس ما يعلنه Playwright العادي. وإذا شُغّل في الوضع المرئي headed يتحول إلى Chrome/151.0.0.0، مرة أخرى بصورة مماثلة تمامًا. منشئ Driver يقبل الوسيط user_agent، لذا يمكن تغييره عبر وسيط إعداد واحد، لكن الإعداد الافتراضي لا يخفي العبارة الأشهر في عالم أتمتة المتصفح.

تقريبًا كل شيء آخر كان متطابقًا عبر الحِزم الأربع، ومن المهم قول ذلك بوضوح لأنه يضيق القصة — كل خاصية أدناه جاءت بالقيمة نفسها في Botasaurus وnodriver وPlaywright وPuppeteer:

الخاصيةالقيمة المتطابقة في الحِزم الأربع
platformMacIntel
vendorGoogle Inc.
الإضافاتخمسة
أنواع MIMEاثنان
pdfViewerEnabledtrue
الأنوية المنطقيةاثنتا عشرة
ذاكرة الجهاز المبلّغ عنها16 GB
نقاط اللمسصفر
window.chromeموجود، مع app/csi/loadTimes وبدون runtime
سلسلة WebGL rendererمتطابقة عبر الجميع

اللغز القديم الذي تتعارض فيه Permissions API مع Notification.permission لم يظهر هنا إطلاقًا — فجميعها أبلغت default وprompt بشكل متسق. كما فتشت في document وwindow بحثًا عن بقايا على نمط cdc_ المعروفة من سلاسل WebDriver القديمة: ولم أجد شيئًا في أي منها.

هناك أمر أخير يستحق أن تعرفه قبل النشر: رغم حجمه الذي يبلغ 122 ميغابايت، فإن Botasaurus لا يضم متصفحًا ولا يحمّله. الدالة find_chrome_executable() تشير إلى أي Chrome موجود أصلًا على جهازك — وعلى جهازي كان /Applications/Google Chrome.app بالإصدار 150.0.7871.187 — وهذا هو الإصدار الذي يعلنه user-agent بعد ذلك. أسطولك يعلن نسخة Chrome الموجودة فعلًا على أسطولك، وهو افتراضي غير متشدد بشكل مفاجئ بالنسبة لإطار محدد الرأي إلى هذا الحد.

لِنقل ما هذا وما ليس هذا. هذه سجلّ لما يفصح عنه stack آلي عندما لا يُطلب منه أن يخفي شيئًا — وهو مفيد إذا كنت على الجانب المدافع، ومفيد إذا أردت أن تعرف ما الذي تبثه أدواتك أنت. لكنه ليس قياسًا لما إذا كان لأي من ذلك أثر لدى خدمة بعينها. لم أختبر ذلك، ولا ينبغي قراءة أي صف أعلاه على أنه يوحي بنتيجة.

قراءة أكثر تسامحًا لهذا الاختبار المحلي

إعلان الهوية شيء، وإرجاع HTML الصحيح شيء آخر. لقد شغّلت Botasaurus على نفس fixture الثلاثي المحتوى الذي يستخدمه بقية هذا المستودع المعياري، حتى تتطابق الأرقام مع كل أداة أخرى جرى قياسها هنا. الصفحة تحمل ثلاثة أشياء: A، رابطًا ثابتًا علامته حرفية داخل البايتات المرسلة؛ وB، عقدة يُنشئها سكربت inline أثناء التحليل، حيث تُجمَّع علامتها ورابطها من أجزاء فرعية بحيث لا تظهر إلا عند تنفيذ JavaScript؛ وC، عقدة تُحقن بعد 800 مللي ثانية من حدث التحميل، وتُجمَّع بالطريقة نفسها. الفئة C هي العدائية هنا — فقراءة تُؤخذ عند حدث التحميل لا يمكنها رؤيتها.

الحزمةالقراءة الافتراضيةمع انتظار صريح
Botasaurus 4.0.922 من 3 (A + B، ويفوّت C)3 من 3
nodriver 0.50.32 من 33 من 3
Playwright 1.56.02 من 33 من 3
Puppeteer 24.16.02 من 33 من 3

Botasaurus ينتهي حيث تنتهي الأدوات الثقيلة الأخرى. driver.get() ثم driver.page_html مباشرةً تمنحك لقطة عند التحميل: فهي تنفذ JavaScript بشكل صحيح — والفئة B دليل على ذلك، لأنها لا توجد أصلًا في البايتات المرسلة — لكنها مع تأخير 800 مللي ثانية تفوّت الفئة C. أضف driver.wait_for_element("#delayed-injected") وستحصل على الثلاثة جميعًا. وكانت النتيجة ثابتة عبر ثلاث تكرارات وثلاث تشغيلات منفصلة للمجموعة كاملة، من دون أي نتائج متذبذبة.

والجزء المثير يظهر عندما تمسح تأخير الحقن لتعرف عند أي نقطة تتوقف القراءة الافتراضية لكل حزمة:

وقت حقن الفئة C بعدBotasaurusnodriverPlaywrightPuppeteer
0 msموجودموجودموجودموجود
100 msموجود
200 msموجود
300 msموجود
400 ms فأكثر

كل الحِزم الأخرى تفقد الفئة C بمجرد أن يأتي الحقن بعد 100 مللي ثانية أو أكثر من التحميل. أما Botasaurus فلا يزال يلتقطها عند 300 مللي ثانية، ولا يتوقف إلا عند 400. هذا هو الإطار البرمجي وهو يفعل ما تفعله الأطر البرمجية: wait_for_complete_page_load=True هو الافتراضي، لذا فإن get() يعود متأخرًا بدرجة ملحوظة عن حدث التحميل الخام. وبشكل ملموس، تكلف قراءة Botasaurus الافتراضية نحو 401–431 مللي ثانية من زمن الجدار، بينما تكلف nodriver نحو 119–129 مللي ثانية وPuppeteer نحو 125–171 مللي ثانية.

في هذا الـ fixture المحلي ذي الحقن المؤخر، كانت المقايضة تقريبًا 250 مللي ثانية لكل تنقل مقابل لقطة افتراضية متأخرة. وهذا التكوين التقط محتوى حُقن حتى 300 مللي ثانية بعد التحميل في هذه التجارب؛ لكنه لا يثبت أن Botasaurus أكثر دقة عبر كل المواقع. إذا كنت تكتب أدوات زحف سريعة من دون شروط انتظار صريحة، فقد يساعد هذا الهامش على تفادي فوات عنصر متأخر. أما عند أحجام تنقل كبيرة، أو عندما تكون قد وضعت أصلًا شرط انتظار دقيقًا، فالأمر مجرد تكلفة إضافية.

ومزيد من الأرقام على مستوى السرعة. تشغيل المتصفح وضع Botasaurus تقريبًا على مستوى nodriver وPuppeteer، وبعيدًا عن Playwright:

الحزمةإطلاق المتصفح عبر التشغيلات
Botasaurus 4.0.92986–1151 ms
nodriver 0.50.3910–1583 ms
Puppeteer 24.16.0969–1008 ms
Playwright 1.56.0282–365 ms

كما أن wait_for_element() لا يضيف كلفة تُذكر حتى تأخير 300 مللي ثانية — لأن get() كان قد تجاوز زمن الحقن أصلًا — ثم يقفز إلى نحو 1.42 ثانية عند 400–800 مللي ثانية، وإلى 2.43 ثانية عند 1500 مللي ثانية.

سؤال 122 ميغابايت: ماذا تثبت الحزمة meta-package فعلًا

Measured results chart: Heaviest installed dependencies

هذا هو الحساب، لأنه أكثر شيء مفيد أستطيع أن أقدمه لك. تثبيت نظيف عبر pip install botasaurus في بيئة افتراضية جديدة أنتج شجرة site-packages بحجم 122.3 ميغابايت تمتد عبر 44 حزمة dist-info. إذا استبعدت pip نفسه (10.9 ميغابايت، وهو حمل البيئة الافتراضية لا شيء طلبه Botasaurus)، فستصل إلى نحو 111 ميغابايت من الإطار واعتمادياته. برنامج التشغيل نفسه — المكون الذي يقوم بالفعل بأتمتة المتصفح — لا يتجاوز حوالي 4 ميغابايت من ذلك. إذًا ما يقرب من 107 ميغابايت هو كل ما قررته الحزمة meta-package أنك تحتاجه.

إلى أين يذهب هذا الحجم؟ خمس اعتمادات متداخلة هي الأثقل وحدها تمثل معظم الكتلة (كل صف هنا هو مدخل install_footprint.heaviest_deps_mb في artifacts/raw/runs/resource_baseline.run1.json؛ أما الإجمالي فهو إضافتي لا حقلًا داخل الملف):

الحزمةالحجم على القرص
numpy30.9 MB
lxml19.2 MB
botasaurus_requests12.6 MB
gevent11.3 MB
pygments8.4 MB
الحزم الخمس معًا82.4 MB (30.9 + 19.2 + 12.6 + 11.3 + 8.4)

كون numpy هو أكبر عنصر منفرد هو ما جعلني أرفع حاجبي — إنها مكتبة جبر خطي داخل أداة مهمتها جلب صفحات الويب وتحليلها. هذا ليس خطأ بالمعنى الحرفي؛ فالأطر تجمع الاعتماديات النافعة، ويبدو أن شيئًا في الشجرة يحتاج إلى حسابات المصفوفات. لكنه كثير من العتاد لمهمة بهذه البساطة.

ولأجل القياس، فإن البرنامج المتخصص nodriver يستهلك نحو 17.2 ميغابايت عبر 6 حزم على الجهاز نفسه — أي إنه أخف بحوالي 7x. (هذا الرقم ليس من هذه الحزمة: بل من install_footprint.site_packages_total_mb في ملف artifacts/raw/runs/resource_baseline.run1.json الخاص بـ nodriver، وقد قيس في تشغيل منفصل متدرج على نفس الجهاز، و122.3 ÷ 17.2 = 7.1.) لا هذا الرقم ولا ذاك عيبٌ بحد ذاته، وهذه ليست مقارنة لقدرات؛ إنها ببساطة تكلفة ميكانيكية مختلفة بين إطار شامل و برنامج تشغيل مخصص. وفي الحاويات، فإن بصمة site-packages تدخل ضمن طبقة التطبيق. لكنها ليست الحجم الكامل للصورة، وهذه التجربة لم تقس زمن البناء أو زمن النشر البارد.

وهناك تفصيل إضافي في البصمة: أثناء الفحص، أول استخدام لـ from botasaurus.request import request أدى إلى تنزيل لمرة واحدة بحجم يقارب 12.8 ميغابايت. لكن التشغيل الملتقط لم يحدد الصنف والوجهة بما يكفي لاعتبار هذا الرقم زيادة مستقرة في حجم التثبيت. ما يثبته ذلك هو أن هذا المسار البرمجي قد يحتاج إلى وصول شبكي عند أول استخدام، وهو شيء يستحق اختباره في صورتك الخاصة قبل نشره في بيئة معزولة عن الشبكة.

رقم الاستيراد الذي يخدعك

زمن استيراد البداية الباردة هو المكان الذي يخطئ فيه من يقرأ الأرقام قراءة سطحية. عند القياس عبر سبع عمليات فرعية جديدة، كان import botasaurus على المستوى الأعلى يسجّل قيمة وسطية مقدارها 0.08 مللي ثانية. إذا اقتبست ذلك منفصلًا، فسيبدو وكأنه أخف إطار في الفئة.

لكنه ليس كذلك. إنه سريع لأن الموجود في الأعلى تقريبًا لا شيء. حزمة botasaurus في المستوى الأعلى لا تعرض __version__ ولا شبه أي أسماء عامة، والاستيراد نفسه يكاد لا يقوم بأي عمل لأنه لا يحتوي تقريبًا على شيء. الرقم الذي يهم فعلًا لأداة CLI أو لبداية باردة في serverless هو استيراد المحرك: from botasaurus_driver import Driver يستغرق نحو 135 مللي ثانية، مع ثبات ضمن بضع مللي ثانية عبر التشغيلات. وهذه هي الكلفة الثابتة الحقيقية التي تدفعها قبل جلب أي صفحة. وبعد استيراد وحدة البرنامج، تبقى الذاكرة المقيمة عند نحو 29–30 ميغابايت — مرة أخرى قبل وجود أي عملية Chrome. وإذا شغّلت متصفحًا فعليًا فسيرتفع ذلك كثيرًا؛ لكنني لم أقس الذاكرة مع متصفح يعمل، لذا لن أضع رقمًا عليها.

والدرس هنا صغير لكنه مهم: كون import botasaurus شبه فوري هو صفة للحزمة العليا الفارغة، لا للإطار الرخيص. إذا كنت تحسب بداية باردة، فاقس الاستيراد الذي ستعتمد عليه فعلًا.

شكل واجهة البرمجة: 99 دالة خلف باب أمامي شبه فارغ

System diagram: API shape: behind a near-empty front door

صنف Driver الخاص بالمحرّك يوفّر 99 دالة عامة — واجهة واسعة تغطي التنقل، والاستعلام عن العناصر، والكوكيز والتخزين المحلي، وحركات الفأرة ولوحة المفاتيح، ولقطات الشاشة، وإدارة الألسنة، وتمرير CDP، ورفع الملفات. ويقبل المُنشئ 18 وسيطًا، وهي خريطة معقولة لسطح الإعداد القابل للضبط: headless، وproxy، وprofile، وtiny_profile، وblock_images، وblock_images_and_css، وwait_for_complete_page_load، وchrome_executable_path، وextensions، وarguments، وuser_agent، وwindow_size، وlang، وعددًا آخر. باعتباره API وقت الإنشاء، فهو يغطي عناصر التحكم المعتادة الخاصة بغلاف المتصفح.

المفاجأة في البنية تقع في المستوى الأعلى، وهي غير مؤذية لكنها حقيقية. import botasaurus يمنحك مساحة أسماء شبه فارغة — لا __version__، ولا أسماء عامة تقريبًا في المستوى الأعلى. كل ما ستستخدمه فعليًا يوجد في وحدات فرعية: from botasaurus.browser import browser, Driver، وfrom botasaurus.request import request، وfrom botasaurus.task import task. إذا ذهبت تبحث عن botasaurus.__version__ لتسجيل النسخة التي تعمل بها فلن تجده؛ عليك أن تلجأ إلى importlib.metadata بدلًا من ذلك. لا شيء في هذا يكسر الوظائف. لكنه ليس التنظيم الذي يتوقعه معظم مطوري Python تلقائيًا، ومعرفته تنقذك من خمس دقائق من الحيرة في اليوم الأول.

وأمر توثيقي واحد حول الدوال التي أشرت إليها سابقًا يستحق أن يقال هنا، ويبقى داخل حدود ما فحصته: من بين الدوال المسماة بما يشير إلى تجاوز الكشف، توجد دالتان فقط تحملان أي docstring داخل الكود. أما البقية فتعرف نفسها بالاسم فقط، بينما يوجد الشرح التفصيلي لكل دالة في موقع التوثيق الخارجي لا داخل المصدر المثبت. هذه ملاحظة عن موضع التوثيق، وليست حكمًا على الجودة — فالكثير من المكتبات الجيدة تحتفظ بنصوصها التوضيحية خارج الكود — لكن إذا كانت عادتك هي "قراءة المصدر لفهم الدالة"، فغالبية هذه الواجهة لن تخبرك إلا باسمها ولا شيء أكثر.

الترخيص: MIT حتى آخر طبقة في برنامج التشغيل

كل من الحزمة الرئيسية وbotasaurus-driver يعلنان MIT، مع تصنيف License :: OSI Approved :: MIT License القياسي. MIT ترخيص متساهل: لا التزام بالاستحداث المشترك، ولا شرط لفتح كودك، ولا احتكاك كبير أمام الاستخدام التجاري. وهذه نقطة فارقة حقيقية وغير بسيطة مقارنةً بـ nodriver، وهو برنامج التشغيل المجاور في مجال التخفّي، والذي يُشحن تحت AGPL-3.0 — وهو ترخيص copyleft يجعل بند الاستخدام عبر الشبكة كثيرًا من الأقسام القانونية غير مرتاحة. إذا كان الترخيص عاملًا حاسمًا لديك، فموقف Botasaurus القائم على MIT يعد نقطة إيجابية حقيقية في رصيده.

لكن هناك ملاحظة مرتبطة بشكل الحزمة meta-package مرة أخرى. هذا الترخيص المتساهل MIT ينطبق على الحِزم الأصلية التي تنشرها Omkar Cloud. لكنه لا يضمن تلقائيًا ما يقرب من 40 حزمة متداخلة يسحبها التثبيت، ولكل منها ترخيصها الخاص. لقد تحققت من MIT على مستوى الحزمة العليا في الحِزم التي تنشرها Omkar Cloud؛ لكنني لم أراجع ترخيص كل اعتماد داخل الشجرة. بالنسبة لمشروع هواية، نادرًا ما يهم هذا الفرق. أما بالنسبة لاعتماد شامل داخل شركة تهتم بقائمة مكونات برمجياتها، فشجرة الأربعين حزمة شيء ينبغي تمريره عبر ماسح التراخيص الخاص بك قبل الالتزام — ليس لأنني وجدت مشكلة، بل لأنني لم أفحصها، والحزمة meta-package تحديدًا هي المكان الذي قد تختبئ فيه رخصة غير متوقعة.

المزايا والعيوب

المزايا:

  • تصميم نظيف بثلاث زخارف (@browser / @request / @task)، مع تأكيد وجود نقاط الدخول الثلاث — الإطار يجعل الحالة الشائعة قصيرة.
  • ترخيص MIT في كل من الحزمة الرئيسية وبرنامج التشغيل، وهو فرق حقيقي مقارنةً بـ AGPL-3.0 في برنامج تشغيل مشابه. ترخيص متساهل ومناسب تجاريًا، ومن دون copyleft.
  • سطح برنامج تشغيل واسع: 99 دالة عامة ومُنشئ من 18 وسيطًا يغطيان احتياجات أتمتة المتصفح المعتادة.
  • ثبُت واجتاز اختبارات الاستيراد الأولية على Python 3.14.2 و3.12.13، أي أبعد من قائمة التصنيفات المعلنة (التي تتوقف عند 3.11)؛ لكن التوافق التشغيلي الكامل لم يُثبت.
  • أوسع نافذة افتراضية لقراءة المحتوى بين كل الحِزم التي قستها: ما زال يلتقط محتوى يُحقن بعد 300 مللي ثانية من التحميل، بينما تفقده nodriver وPlaywright وPuppeteer عند 100 مللي ثانية. هنا wait_for_complete_page_load=True يقوم بعمل حقيقي.
  • يعرض navigator.webdriver كـ false افتراضيًا، بينما تعرضه أدوات التحكم القياسية كـ true، ومن دون ترقيع الخاصية — فالمعرّف يظل getter الأصلي الخاص بالمتصفح.
  • البطاريات مدمجة عمدًا — التخزين المؤقت، والتشغيل المتوازي، وإعادة استخدام برنامج التشغيل، ومخرجات JSON/CSV/Excel/HTML كلها جزء من الإطار وليست إضافات جانبية.

العيوب:

  • ثقيل على القرص: 122.3 ميغابايت عبر 44 حزمة، أي نحو 7x أضخم من برنامج تشغيل مركّز، بسبب اعتماديات مثل numpy (30.9 ميغابايت) وlxml (19.2 ميغابايت) لا بسبب برنامج التشغيل نفسه الذي يقارب 4 ميغابايت.
  • رقم 0.08 مللي ثانية في استيراد المستوى الأعلى مضلل؛ فاستيراد المحرك الذي تعتمد عليه فعليًا يقارب 135 مللي ثانية، والذاكرة بعد الاستيراد نحو 29–30 ميغابايت قبل أي متصفح.
  • نافذة القراءة الافتراضية الأوسع ليست مجانية: 401–431 مللي ثانية لكل تنقل/قراءة مقابل 119–129 مللي ثانية لبرنامج تشغيل خفيف على نفس الصفحة ونفس Chrome.
  • تشغيل headless لا يزال يعلن HeadlessChrome في user-agent افتراضيًا، تمامًا مثل أدوات التحكم القياسية؛ معامل user_agent موجود في المنشئ لكن لا أحد يضبطه لك.
  • رغم حجمه البالغ 122 ميغابايت، لا يضم متصفحًا؛ بل يقود أي Chrome موجود على الجهاز المضيف، لذا فإن الإصدار الذي يعلن عنه هو الإصدار المثبت أصلًا في أسطولك.
  • أول استخدام لـ @request أدى إلى تنزيل لمرة واحدة بحجم يقارب 12.8 ميغابايت في هذه التجربة؛ لكن الصنف والوجهة لم يُلتقطا بما يكفي لاعتبار ذلك زيادة مستقرة في البصمة.
  • الحزمة العليا شبه فارغة ولا تعرض __version__؛ النسخة الفعلية وواجهة البرمجة الفعلية تعيشان في مكان أقل وضوحًا.
  • معظم الدوال المسماة على نمط تجاوز الكشف لا تحمل docstring داخل الكود، لذا فقراءة المصدر تعطيك أسماءً لا سلوكًا.

وخارج ما تغطيه هذه الأرقام، وبالتالي لم يُختبر هنا: كل ما يتعلق بفعالية تجاوز الروبوتات في العالم الحقيقي (وهو خارج النطاق عمدًا)، والذاكرة لكل صفحة، والتعامل مع البروكسي والملفات الشخصية، والإنتاجية على نطاق واسع، وأي منصة غير macOS arm64. وقد أُنتجت أرقام البصمة والاستيراد من دون تشغيل متصفح أصلًا؛ أما أرقام القراءة والكشف فأتت من متصفحات تحدثت فقط مع fixture على 127.0.0.1.

لمن يناسب، ومن الأفضل أن يتجاوزه

Botasaurus مناسب إذا كنت تريد إطارًا كاملًا بدل قطعة منفردة. إذا كنت تبدأ مشروع زحف من ملف فارغ، وتفضل اعتماد بنية جاهزة بدل تجميعها بنفسك — زخارف لنقاط الدخول، وتخزين مؤقت وتشغيل متوازي مُدارين، ومخرجات مدمجة — فهذا خيار متماسك ومبرمج تحت ترخيص MIT. MIT متساهل، لكن نموذج الاستخدام والتوزيع لديك يستحق دائمًا مراجعة الامتثال المعتادة. والفرق التي تفكر أصلًا بعقلية Scrapy أو Crawlee ستجد هذا الإطار مألوفًا في التصور.

تجاوزه، أو على الأقل فكّر مرتين، إذا كانت بيئة النشر لديك حساسة للحجم. تثبيت بحجم 122 ميغابايت مع numpy وgevent ضمن الشجرة كثيرٌ إذا كان احتياجك الحقيقي هو "قُد متصفحًا واسحب بعض الحقول". برنامج تشغيل مركّز يمنحك الأتمتة بجزء من الوزن، لكنك ستكتب طبقة التنفيذ المحيطة بنفسك. وتجاوزه بالكامل إذا كنت تريد حكمًا على فعالية تجاوز الكشف، لأن ذلك هو الشيء الوحيد الذي تعمّدت ألا أختبره — وستكون عندها تثق في ادعاء تسويقي لم أؤكده ولم أنفه.

البدائل، ومكان Thunderbit هنا

الإطار الصادق أولًا: Botasaurus مجاني، ومتاح تحت MIT، ويُستضاف ذاتيًا. أنت تدير الأسطول، وتدير التحديثات، وتمتلك شجرة الاعتماديات كاملة — وهي 44 حزمة كلها — بما فيها التصحيحات، والالتزام بالترخيص، وما قد تقرر numpy فعله في إصدار قادم. ولكثير من الفرق، هذا النوع من الملكية هو بالضبط ما يريدونه، ولا توجد خدمة مُدارة تتفوق على "إطار موجود لديك أصلًا" من حيث التكلفة الخام.

في عالم المصادر المفتوحة، تكون المقارنات المفيدة بحسب الشكل. إذا كنت في طرف الإطار مع Botasaurus، فـ Scrapy وCrawlee هما النظيران الواضحان للمقارنة — ناضجان، محددان في آرائهما، ولكل منهما اتفاقياته الخاصة. وإذا كنت تريد Markdown جاهزًا للـ LLM من صفحة بدل إطار لتنظيم الزاحف، فـ Crawl4AI وTrafilatura الموجه نحو المحتوى يستهدفان هذه المهمة تحديدًا. وإذا أحببت زاوية Python وanti-detect لكنك تريد شيئًا أخف من حزمة meta-package، فـ Scrapling يستحق النظر، وإذا كانت لغة مُجمّعة مطروحة، فمكتبة Go Colly تتنازل عن تنفيذ JavaScript مقابل السرعة والبصمة الصغيرة. أي خيار يقود متصفحًا، بما في ذلك Botasaurus، يرث ملف التكلفة الذي توضحه مقارنة Playwright وPuppeteer لدينا — فالمتصفحات الحقيقية ليست رخيصة التشغيل، وهذا جزء من سبب وزن الأطر التي فوقها.

أما حين تدخل API مُدارة، فأنت في نقطة مختلفة من نفس السلسلة. Botasaurus هو طبقة المطور ذاتية الاستضافة؛ وThunderbit تبيع الطبقة المُدارة، الموجهة إلى المطورين أنفسهم. الـ Open API تتكون من نقطتي نهاية. POST /distill (بكلفة 1 credit) يعيد الصفحة بصيغة Markdown نظيفة جاهزة للـ LLM، مع معالجة العرض وتجاوز الروبوتات من جهة الخادم، بحيث لا تحتاج إلى توفير متصفح أو شجرة اعتماديات إطلاقًا. وPOST /extract (20 credit) يعيد JSON منظمًا وفق JSON Schema التي تحددها، مع renderMode مضبوطًا على none أو basic أو full بحسب مقدار المتصفح الذي تحتاجه الصفحة فعلًا. وكلتاهما لهما نسخ batch حتى مئة رابط دفعة واحدة. وهناك خادم MCP للوكلاء ومساعدي البرمجة — وأداة thunderbit_suggest_fields مجانية وتخبرك بما تكشفه الصفحة قبل أن تدفع شيئًا — إضافة إلى CLI عبر npx @thunderbit/thunderbit-cli للأتمتة عبر cron وCI. ولغير المطورين الذين يفضلون عدم لمس أي من ذلك، فإن إضافة Chrome تشغّل المحرك نفسه كأداة no-code، بينما تغطي الشروحات على قناة Thunderbit على YouTube سير العمل الشائعة.

والفرق الحقيقي هنا ليس أي الأداة أفضل، بل أين تقع المسؤولية. Botasaurus يترك إطار العمل، وأسطول المتصفح، والاعتماديات، والبنية التحتية، والصيانة على جانبك من الخط من دون رسوم مورّد لكل طلب؛ لكن الحوسبة، والنطاق الترددي، والبروكسيات، والتشغيل كلها لا تزال تكلف مالًا. أما الـ API المُدارة فتأخذ عنك مسؤولية العرض والبنية المتوافقة مع الـ schema، وتفرض تكلفة لكل استدعاء — ويمكنك مقارنة ذلك بإعداد ذاتي الاستضافة عبر صفحة الأسعار.

جرّب Thunderbit لاستخراج بيانات الويب

الحكم النهائي

Botasaurus مرشح معقول إذا كنت تريد إطار Python شاملًا وتقبل بصمته من الاعتماديات. تصميم الزخارف الثلاثية نظيف، وواجهة برنامج التشغيل واسعة، وقد اجتاز اختبارات التثبيت/الاستيراد الأولية على إصدارات Python أحدث مما تدّعيه تصنيفات الحزمة. وعلى الـ fixture المحلي الخاص بي، التقطت اللقطة الافتراضية أيضًا محتوى حُقن بعد 300 مللي ثانية من التحميل، بينما فوتته الحِزم الأخرى المختبرة عند 100 مللي ثانية؛ وهذه نتيجة على fixture محدد، وليست ترتيبًا عامًا.

لكن يجب أن تُسعّر الادعاءات بشكل صحيح. إنه تثبيت بحجم 122 ميغابايت يضم 44 حزمة، بينما لا يتجاوز برنامج التشغيل حوالي 4 ميغابايت، والباقي numpy وlxml وgevent وشركاؤها — أي تقريبًا 7x برنامج تشغيل مركّز، وهذا الوزن ينعكس في صورة الحاوية وزمن النشر البارد. رقم 0.08 مللي ثانية لاستيراد المستوى الأعلى هو باب أمامي فارغ، وليس إطارًا خفيفًا؛ أما استيراد المحرك بحوالي 135 مللي ثانية فهو الرقم الذي ستدفعه فعلًا. ونافذة القراءة الافتراضية المتسامحة هذه تكلف نحو 250 مللي ثانية في كل تنقل. وعلى سؤال الكشف الافتراضي الذي استطعت الإجابة عنه فعلًا، كانت الصورة أضيق مما يوحي به التسويق: هناك متغير منطقي واحد يختلف عن Puppeteer القياسي، وuser-agent في headless ما زال يقول HeadlessChrome، وكل خاصية أخرى قستها كانت متطابقة عبر الحِزم الأربع. أما عرض anti-detection الذي يبيع الأداة فهو الشيء الوحيد الذي لا تقيّمه هذه المراجعة — لقد أكدت فقط أن تلك الدوال موجودة، وشغّلت برنامج التشغيل على صفحة في جهازي، ثم توقفت عند ذلك عمدًا. اعرف البصمة، وتجاهل رقم الاستيراد المُجامل، وتعامل مع تسويق التخفي على أنه سؤال مفتوح، وسيظل Botasaurus إطارًا عادلًا يقوم بما يفترض بالإطارات القيام به. أما إذا كنت تتوقع برنامج تشغيل خفيفًا كريشة، فسيُفاجئك وقت docker build.

جرّب Thunderbit لاستخراج بيانات الويب Get Started Free

الأسئلة الشائعة

هل Botasaurus مجاني، وما هو ترخيصه؟ نعم، إنه مجاني وتحت ترخيص MIT — كل من الحزمة meta-package botasaurus ومحرك botasaurus-driver يحملان تصنيف MIT المعتمد من OSI. MIT ترخيص متساهل، لذا لا يوجد التزام copyleft وهو مناسب للاستخدام التجاري، وهذا يختلف بوضوح عن برامج تشغيل مشابهة موجهة لتجاوز الكشف وتُطرح تحت AGPL-3.0. لكن هناك ملاحظة: MIT يغطي الحزم التي تنشرها Omkar Cloud نفسها، ولا يغطي تلقائيًا نحو 40 اعتمادًا متداخلًا يسحبها التثبيت، لذا شغّل فحص التراخيص الخاص بك قبل اعتماد الشجرة كاملة داخل شركة.

ما حجم تثبيت Botasaurus، ولماذا يبدو import botasaurus فوريًا رغم ذلك؟ تثبيت نظيف عبر pip install botasaurus أنتج شجرة site-packages بحجم 122.3 ميغابايت عبر 44 حزمة على جهازي. برنامج التشغيل نفسه لا يتجاوز نحو 4 ميغابايت — والوزن يأتي من الحزمة meta-package التي تسحب شجرة اعتماديات واسعة، تتصدرها numpy (30.9 ميغابايت)، وlxml (19.2 ميغابايت)، وbotasaurus_requests (12.6 ميغابايت)، وgevent (11.3 ميغابايت)، وpygments (8.4 ميغابايت). وهذا يقارب 7x بصمة برنامج تشغيل مركّز مثل nodriver على الجهاز نفسه. لا شيء هنا عيب؛ إنه ثمن "البطاريات المدمجة"، ويهمك أكثر ما يهم في حجم صورة الحاوية. أما زمن الاستيراد فهو المكان الذي يختبئ فيه هذا الوزن: import botasaurus يقاس بحوالي 0.08 مللي ثانية، لكن فقط لأن الحزمة العليا شبه فارغة — لا __version__، ولا أسماء عامة تقريبًا، لذا فإن استيرادها لا يفعل شيئًا تقريبًا. الاستيراد الذي يكلفك فعلًا هو المحرك: from botasaurus_driver import Driver بحوالي 135 مللي ثانية، مع ذاكرة مقيمة بنحو 29–30 ميغابايت بعد هذا الاستيراد وقبل تشغيل أي متصفح. إذا كنت تقيس بداية باردة في serverless، فقِس استيراد المحرك، لا الاستيراد الفارغ في الأعلى.

ماذا يكشف Botasaurus عن نفسه، وهل تم اختباره ضد أنظمة anti-bot حقيقية؟ النصف الأول تم قياسه؛ أما النصف الثاني فتم تجاهله عمدًا. على صفحة خدمتها من 127.0.0.1، وباستخدام نفس نسخة Chrome التي استخدمتها أدوات المقارنة: تعود قيمة navigator.webdriver إلى false، بينما يُظهرها Playwright وPuppeteer القياسيان كـ true. هذه القيمة تُضبط عند إطلاق المتصفح، لا عبر ترقيع الخاصية — فالمعرّف لا يزال getter الأصلي الخاص بـ Chrome. بخلاف هذه القيمة المنطقية، تطابق معظم الأشياء أدوات المقارنة تمامًا: نفس سلسلة المنصة، وخمس إضافات، و12 نواة، وذاكرة جهاز معروضة 16 GB، ونفس شكل window.chrome, ولا تعارض في Permissions API، ولا بقايا على نمط cdc_ في document أو window. وتشغيل headless لا يزال يعلن HeadlessChrome/151.0.0.0 في user-agent، تمامًا مثل الأداتين القياسيتين — ومع أن منشئ Driver يقبل user_agent، فلا شيء يضبطه لك افتراضيًا. أما عن الفعالية، فلم أوجه البرنامج إلى موقع حي، ولم أتصل بأي خدمة anti-bot، ولم أتعامل مع أي CAPTCHA. ويضم البرنامج بالفعل مجموعة من الدوال المسماة على نمط تجاوز الكشف، وقد أثبت وجودها، لكنني لم أستدعها، ولم أختبر سلوكها ضد أي هدف، ولم أقس نسبة نجاح، ولم أصف آلية عمل. الجدول أعلاه يخبرك بما تعلنه الحزمة عن نفسها، ولا يخبرك بشيء عن من يراقب ذلك أو ماذا يفعل حياله.

هل يتعامل Botasaurus مع المحتوى الذي يعتمد على JavaScript بشكل صحيح؟ نعم، وموضعه الافتراضي أكثر تسامحًا من معظم الأدوات. على fixture يحتوي ثلاث فئات من المحتوى، كانت driver.get() مع driver.page_html تعطي 2 من 3 عند تأخير حقن قدره 800 مللي ثانية — أي أنه ينفذ JavaScript بشكل صحيح، لكنه يقرأ قبل وصول المحتوى المتأخر جدًا — بينما أعطت driver.wait_for_element() نتيجة 3 من 3. والجزء المميز هو المكان الذي تتوقف عنده القراءة الافتراضية: Botasaurus ما زال يلتقط محتوى يُحقن بعد 300 مللي ثانية من التحميل، بينما تفقده nodriver وPlaywright وPuppeteer عند 100 مللي ثانية. وهذا بسبب wait_for_complete_page_load=True في المُنشئ، ويكلف نحو 250 مللي ثانية لكل تنقل.

كيف أستورد Botasaurus وأستخدمه بعد تثبيته؟ ليس بالطريقة التي قد تتوقعها. مساحة الأسماء العليا botasaurus شبه فارغة، لذا فإن API الحقيقية تعيش في الوحدات الفرعية: from botasaurus.browser import browser, Driver، وfrom botasaurus.request import request، وfrom botasaurus.task import task. تضيف زخرفة @browser أو @request أو @task إلى دالة عادية، ويتكفل الإطار ببرنامج التشغيل المحيط، والتخزين المؤقت، والإخراج. وبما أنه لا توجد botasaurus.__version__، فاستخدم importlib.metadata إذا كنت تحتاج إلى تسجيل النسخة التي تعمل بها.

Ke
Ke
المدير التقني في Thunderbit | عالم بيانات أول وخبير في تعلّم الآلة بخبرة تقارب عقدًا من الزمن في تعلّم الآلة وعلم البيانات، كيه شين خريج جامعة كولومبيا وكان سابقًا عالم بيانات أول في Walmart Labs. وبفضل خبرته العميقة المعترف بها من قبل الأقران في Python وR وJava والإحصاء، يشارك رؤى مجرّبة حول نقل خوارزميات الذكاء الاصطناعي المعقدة من النظرية إلى بنية جاهزة للإنتاج.
Topics
أدوات استخراج البيانات من الويبAI Web Scraper
فهرس المحتويات
Thunderbit · وكيل بيانات الويب بالذكاء الاصطناعي

استخرج البيانات من أي صفحة في بنقرة واحدة

موثوق لدى أكثر من 250,000 مستخدم
تتوفر خطة مجانية
من صفحة ويب إلى جدول بيانات
صف ما تحتاجه — ويقوم وكيل Thunderbit بالذكاء الاصطناعي باستخراجه وتصديره إلى Excel أو Google Sheets أو Airtable أو Notion. ابدأ مجانًا.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week