https://github.com/ultrafunkamsterdam/undetected-chromedriver
يعمل تصحيح Selenium Chromedriver المحسّن الذي لا يؤدي إلى تشغيل خدمات مكافحة الروبوتات مثل Distill Network / Imperva / DataDome / Botprotect.io على تنزيل برنامج التشغيل الثنائي تلقائيًا وتصحيحه.
pip install undetected-chromedriver
أو، إذا كنت تشعر بالمغامرة، قم بالتثبيت مباشرة عبر github
pip install git+https://www.github.com/ultrafunkamsterdam/undetected-chromedriver@master # replace @master with @branchname for other branches
سأضع حدودًا على أداة تعقب المشكلة. لقد تم إساءة استخدامه لفترة طويلة جدًا.
أي أخبار جيدة؟
نعم، لقد فتحت المناقشات التي لم يتم اكتشافها والتي أعتقد أنها ستساعدنا بشكل أفضل على المدى الطويل.
هذه الحزمة لا تفعل ذلك، وأكرر أنها لا تخفي عنوان IP الخاص بك، لذلك عند التشغيل من مركز بيانات (حتى الأصغر منها)، هناك احتمالات كبيرة أنك لن تمر! وأيضًا، إذا كانت سمعة الملكية الفكرية لديك في المنزل منخفضة، فلن تنجح!
تشغيل التعليمات البرمجية التالية من المنزل ومن مركز البيانات.
import undetected_chromedriver as uc
driver = uc . Chrome ( headless = True , use_subprocess = False )
driver . get ( 'https://nowsecure.nl' )
driver . save_screenshot ( 'nowsecure.png' )
تحديث كبير! كن حذرًا لأنه -من المحتمل- أن يكسر التعليمات البرمجية الخاصة بك.
أعدنا كتابة آلية مكافحة الاكتشاف بدلاً من إزالة المتغيرات وإعادة تسميتها، فنحن نحتفظ بها فقط، ولكن نمنع حقنها في المقام الأول. وهذا سيبقينا في مأمن من الكشف على الأقل في المستقبل القريب.
أعد كتابة تسمية الملف، لمنع أن ينتهي الأمر بـ 1000 ملف من {randomstring}_chromedriver.exe بدلاً من ذلك يُسمى فقط undetected_chromedriver.exe
تمت إزالة التنظيف من ملفات التوافق وملفات v2 ومجلد الاختبارات
تمت إضافة طريقة WebElement.click_safe()، والتي يمكنك تجربتها في حالة اكتشافك بعد النقر فوق الرابط. هذا ليس مضمونا للعمل.
تمت إضافة WebElement.children(self, tag=None, recursive=False) للحصول على/العثور على العقد الفرعية بسهولة. مثال:
body = driver.find_element('tag name', 'body')
# get the 6th child (any tag) of body, and grab all img's within (recursive).
images = body.children()[6].children('img', True)
srcs = list(map(lambda _:_.attrs.get('src'), images))
تمت إضافة example.py حيث يمكنني توجيه الأشخاص إليه عند طرح أسئلة سخيفة (لا، إنه في الواقع رائع جدًا، يجب على الجميع رؤيته)
إضافة دعم لمنصة لامدا
إضافة دعم لـ x86_32
تمت إضافة دعم لإعداد تقارير الأنظمة مثل linux2
بعض إعادة الهيكلة
أصبح use_subprocess الآن افتراضيًا على True. الكثير من الأشخاص لا يفهمون المعالجة المتعددة والاسم == ' main ، وبعد الاختبار، يبدو أنه لم يعد يحدث فرقًا في chrome 104+
تمت إضافة no_sandbox، والذي يكون الإعداد الافتراضي هو True، وهذا بدون الشريط المزعج "أنت تستخدم سطر أوامر غير آمن ...".
تحديث صورة دوكر. يمكنك الآن إدخال vnc أو rdp في الحاوية الخاصة بك لرؤية نافذة المتصفح الفعلية
وبطبيعة الحال، يعمل الوضع "العادي" كذلك
might
هذا الإصدار إلى كسر التعليمات البرمجية الخاصة بك، قم باختباره قبل التحديث!
وأضاف منطق جديد لمكافحة الكشف!
أصبح الإصدار 2 هو الوحدة الرئيسية، لذا لم تعد هناك حاجة إلى إشارات إلى الإصدار 2 بعد الآن. هذا يعني أنه يمكنك الآن ببساطة استخدام:
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' )
من أجل التوافق مع الإصدارات السابقة، لا تتم إزالة الإصدار 2، ولكن يتم تسميته بالوحدة الرئيسية.
تم إصلاح مشكلة "شاشة الترحيب" في أنظمة التشغيل التي لا تعمل بنظام Windows. بالنسبة لأولئك المتذمرين الذين ❤ يرحبون بالشاشات ويزودون Google بالمزيد من البيانات، استخدم Chrome(suppress_welcome=False).
تم استبدال executable_path
في المُنشئ لصالح browser_executable_path
الذي لا ينبغي استخدامه إلا إذا كنت في حالة الحافة (نعم، أنت كذلك) ولا يمكنك إضافة مجلد تثبيت Chrome المخصص إلى متغير بيئة PATH الخاص بك، أو لديك جيش من المتصفحات/الإصدارات المختلفة ويؤدي البحث التلقائي إلى إرجاع المتصفح الخطأ
تم نقل "v1" (؟) إلى _compat في الوقت الحالي.
إصدارات التبعية الثابتة
تمت إزالة المعالجة المخصصة لـ ChromeOptions، لذا فهو متوافق مع webdriver.chromium.options.ChromiumOptions
.
تمت إزالة Chrome.get() fu واستعادته إلى الأصل "تقريبًا":
with
الحاجة إلى البيانات بعد الآن، على الرغم من أنها ستظل تعمل من أجل التوافق مع الإصدارات السابقة.نجاح الاختبار حتى الآن: 100%
فقط أذكر ذلك مرة أخرى، نظرًا لأن بعض الأشخاص يجدون صعوبة في القراءة: مقطوعة الرأس لا تزال قيد التقدم. إثارة القضايا لا داعي لها
تغيير سلوك إنشاء العملية ليتم فصلها بالكامل
تم تغيير طريقة .get(url) لاستخدام مدير السياق دائمًا
تم تغيير طريقة .get(url) لاستخدام cdp تحت الغطاء.
.. العبارة with
ليست ضرورية بعد الآن ..
ما يجب القيام به: العمل على عدم التزامن والسيلينيوم 4
كلما واجهت المخيف
from session not created: This version of ChromeDriver only supports Chrome version 96 # or what ever version
الحل بسيط:
import undetected_chromedriver as uc
driver = uc . Chrome ( version_main = 95 )
يوليو 2021: مشغول حاليًا بتنفيذ السيلينيوم 4 لمحرك الكروم الذي لم يتم اكتشافه
الأخبار العاجلة: رقم 255
لمنع شد الشعر وإثارة المشكلات بشكل غير ضروري، يرجى الانتباه إلى الملاحظة المهمة الموجودة في نهاية هذه الوثيقة.
حرفيا، هذا هو كل ما عليك القيام به. يتم تضمين الإعدادات ويتم العثور على الملف القابل للتنفيذ في متصفحك تلقائيًا. وهذا أيضًا هو المقتطف الذي أوصي باستخدامه في حالة مواجهة مشكلة.
import undetected_chromedriver as uc
driver = uc . Chrome ()
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
حرفيا، هذا هو كل ما عليك القيام به. في حالة عدم وجود مجلد محدد، يتم إنشاء ملف تعريف جديد. لن تتم إزالة بيانات dirs المحددة بهذه الطريقة تلقائيًا عند الخروج.
import undetected_chromedriver as uc
options = uc . ChromeOptions ()
# setting profile
options . user_data_dir = "c: \ temp \ profile"
# use specific (older) version
driver = uc . Chrome (
options = options , version_main = 94
) # version_main allows to specify your chrome version instead of following chrome global version
driver . get ( 'https://nowsecure.nl' ) # my own test test site with max anti-bot protection
حرفيا، هذا هو كل ما عليك القيام به. يمكنك الآن الاستماع والاشتراك في بروتوكول أدوات التطوير منخفض المستوى. لقد اكتشفت مؤخرًا أن هذا أيضًا قيد التخطيط للإصدار المستقبلي لبرنامج chromedriver الرسمي. ومع ذلك قمت بتنفيذ بلدي في الوقت الراهن. منذ أن كنت في حاجة إليها بنفسي للتحقيق.