بايثون للمبتدئين: كيفية قيادة الويب

رحلة إلى أتمتة الويب البسيطة



صورة


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



الحل: استخدم Python لإرسال المهام المكتملة تلقائيًا! من الناحية المثالية ، يمكنني حفظ المهمة ، وكتابة بضعة مفاتيح ، وتحميل عملي في ثوانٍ. بدا الأمر جيدًا جدًا لدرجة يصعب تصديقه في البداية ، ولكن بعد ذلك اكتشفت السيلينيوم ، وهي أداة يمكن استخدامها مع Python للتنقل عبر الويب.



صورة


في كل مرة نكرر فيها إجراءات شاقة على الإنترنت بنفس التسلسل من الخطوات ، فهذه فرصة رائعة لكتابة برنامج لأتمتة العملية. مع Selenium و Python ، نحتاج فقط إلى كتابة البرنامج النصي مرة واحدة ، وبعد ذلك يمكننا تشغيله عدة مرات كما نريد وإنقاذ أنفسنا من تكرار المهام المتكررة (وفي حالتي ، يتم استبعاد إمكانية إرسال الوظيفة إلى المكان الخطأ)!



هنا ، سأستعرض حلًا قمت بتطويره لتقديم واجباتي تلقائيًا (وبشكل صحيح). على طول الطريق ، سنغطي أساسيات استخدام Python و selenium للتحكم الآلي في الويب. بينما يعمل هذا البرنامج (أستخدمه كل يوم!) ، فهو فردي تمامًا ، لذلك لن تتمكن من نسخ ولصق الرمز لتطبيقك. ومع ذلك ، يمكن تطبيق الطرق العامة هنا على عدد غير محدود من المواقف. (إذا كنت ترغب في رؤية الرمز الكامل ، فهو متاح على GitHub ).



نهج



قبل أن نصل إلى الجزء الممتع من الأتمتة ، نحتاج إلى معرفة الهيكل العام لحلنا. يعد بدء الترميز بدون خطة طريقة رائعة لإضاعة ساعات العمل والإحباط. أريد أن أكتب برنامجًا لإرسال الواجبات الدراسية المكتملة إلى المكان الصحيح في Canvas ( "نظام إدارة التعلم في جامعتي " ). أولاً ، أحتاج إلى طريقة لإخبار البرنامج باسم الوظيفة المطلوب إرساله والصف. اتبعت نهجًا بسيطًا وأنشأت مجلدًا لتخزين المهام المكتملة مع المجلدات الفرعية لكل فصل. في المجلدات الفرعية ، قمت بوضع مستند نهائي مسمى لوظيفة معينة. يمكن للبرنامج معرفة اسم الفئة حسب المجلد واسم المهمة باسم المستند.

هنا مثال حيث يكون اسم الفئة هو EECS491 والمهمة هي المهمة 3 - الإخراج في نماذج الرسومات الكبيرة. "



صورة



هيكل الملف (يسار) وتعيين كامل (يمين).



الجزء الأول من البرنامج هو حلقة تتنقل عبر المجلدات للعثور على الوظيفة والفئة التي نخزنها في مجموعة Python:



# os for file management
import os
# Build tuple of (class, file) to turn in
submission_dir = 'completed_assignments'
dir_list = list(os.listdir(submission_dir))
for directory in dir_list:
    file_list = list(os.listdir(os.path.join(submission_dir, 
directory)))
    if len(file_list) != 0:
        file_tup = (directory, file_list[0])
    
print(file_tup)


('EECS491'، 'Assignment 3 - Inference in Big Graphical Models.txt').



يتولى هذا الأمر إدارة الملفات ويعرف البرنامج الآن الفصل والواجب المطلوب تضمينهما . الخطوة التالية هي استخدام السيلينيوم للانتقال إلى صفحة الويب الصحيحة وتحميل المهمة.



التحكم في الويب باستخدام السيلينيوم



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



import selenium
# Using Chrome to access web
driver = webdriver.Chrome()
# Open the website
driver.get('https://canvas.case.edu')


عندما نفتح صفحة الويب Canvas ، نواجه العقبة الأولى - مربع تسجيل الدخول! للتغلب على ذلك ، سنحتاج إلى إدخال المعرف وكلمة المرور والضغط على زر تسجيل الدخول.



صورة



تخيل أن برنامج تشغيل الويب هو شخص لم يسبق له أن شاهد صفحة ويب من قبل: نحن بحاجة إلى تحديد مكان النقر بالضبط ، والطباعة ، والأزرار التي يجب النقر عليها. هناك عدة طرق لإخبار برنامج تشغيل الويب الخاص بنا بالعناصر التي يجب العثور عليها ، وكلها تستخدم المحددات. المحدد هو معرف فريد لعنصر على صفحة ويب. للعثور على محدد لعنصر معين ، قل حقل "معرّف CWRU" ، نحتاج إلى إلقاء نظرة على رمز صفحة الويب. في Chrome ، يمكن القيام بذلك عن طريق الضغط على Ctrl + Shift + I أو عن طريق النقر بزر الماوس الأيمن على أي عنصر واختيار View Code. يفتح هذاأدوات مطوري Chrome ، تطبيق مفيد للغاية يعرض HTML الأساسي لأي صفحة ويب .



للعثور على محدد حقل "معرّف CWRU" ، قمت بالنقر بزر الماوس الأيمن في الحقل ، والنقر فوق عرض الرمز ، ورأيت ما يلي في أدوات المطورين. يتوافق الخط المميز مع عنصر id_box (يسمى هذا السطر علامة HTML).



صورة



قد يبدو هذا HTML ساحقًا ، ولكن يمكننا تجاهل معظم المعلومات والتركيز على الأجزاء id = "username"و name = "username". (تُعرف هذه السمات بسمات علامات HTML).

لتحديد حقل idباستخدام برنامج تشغيل الويب الخاص بنا ، يمكننا استخدام السمة idأو nameالتي وجدناها في أدوات المطورين. تحتوي برامج تشغيل الويب من Selenium على العديد من الطرق المختلفة لتحديد العناصر على صفحة الويب ، وغالبًا ما تكون هناك عدة طرق لتحديد العنصر نفسه:



# Select the id box
id_box = driver.find_element_by_name('username')
# Equivalent Outcome! 
id_box = driver.find_element_by_id('username')


يمكن لبرنامجنا الآن الوصول إليه id_box، ويمكننا التفاعل معه بطرق مختلفة ، مثل إدخال المفاتيح أو الضغط (إذا حددنا زرًا).



# Send id information
id_box.send_keys('my_username')


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



# Find password box
pass_box = driver.find_element_by_name('password')
# Send password
pass_box.send_keys('my_password')
# Find login button
login_button = driver.find_element_by_name('submit')
# Click login
login_button.click()


بمجرد تسجيل الدخول ، يتم الترحيب بنا بشريط الأدوات المخيف قليلاً:



صورة



نحتاج مرة أخرى إلى التنقل عبر البرنامج من خلال صفحة الويب ، وتحديد العناصر الدقيقة للنقر عليها والمعلومات للدخول. في هذه الحالة ، أخبر البرنامج بتحديد الدورات من القائمة الموجودة على اليسار ، ثم الفصل المناسب للمهمة التي أحتاج إلى اجتيازها:



# Find and click on list of courses
courses_button = driver.find_element_by_id('global_nav_courses_link')
courses_button.click()
# Get the name of the folder
folder = file_tup[0]
    
# Class to select depends on folder
if folder == 'EECS491':
    class_select = driver.find_element_by_link_text('Artificial Intelligence: Probabilistic Graphical Models (100/10039)')
elif folder == 'EECS531':
    class_select = driver.find_element_by_link_text('Computer Vision (100/10040)')
# Click on the specific class
class_select.click()


يعثر البرنامج على الفصل الصحيح باستخدام اسم المجلد الذي حفظناه في الخطوة الأولى. في هذه الحالة ، أستخدم طريقة التحديد find_element_by_link_textللعثور على فئة معينة. إن "نص الرابط" لعنصر ما هو مجرد محدد آخر يمكننا العثور عليه من خلال النظر إلى الصفحة:



صورة



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

نستخدم نفس العملية للتحقق من صفحة - اختيار عنصر - التفاعل مع عنصر للذهاب من خلال بضع شاشات أخرى. أخيرًا ، نصل إلى صفحة إرسال الوظيفة:



صورة



عند هذه النقطة ، كان بإمكاني رؤية خط النهاية ، لكن في البداية حيرتني هذه الشاشة. كان بإمكاني النقر على حقل "تحديد ملف" بسهولة تامة ، ولكن كيف كان من المفترض أن أختار الملف الذي أريد تحميله؟ يبدو أن الجواب بسيط للغاية! نجد الحقل Choose Fileباستخدام محدد ونستخدم طريقة send_keysلتمرير مسار الملف الدقيق (المسمى file_locationفي الرمز أدناه) إلى الكتلة:



# Choose File button
choose_file = driver.find_element_by_name('attachments[0][uploaded_data]')
# Complete path of the file
file_location = os.path.join(submission_dir, folder, file_name)
# Send the file location to the button
choose_file.send_keys(file_location)


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



صورة



الآن نختار الزر "إرسال مهمة" ، انقر ، ويتم إرسال مهمتنا!



# Locate submit button and click
submit_assignment = driver.find_element_by_id('submit_file_button')
submit_assignent.click()


صورة


تنظيف



تعد إدارة الملفات دائمًا خطوة حاسمة ، وأريد التأكد من أنني لا أعيد الإرسال أو أفقد وظائف قديمة. اكتشفت أن أفضل حل هو حفظ الملف ليتم وضعه في مجلد completed_assignmentsونقل الملفات إلى المجلد submitted_assignmentsبمجرد تنزيلها. يستخدم الجزء الأخير من التعليمات البرمجية الوحدة النمطية os لنقل المهمة المكتملة إلى الموقع الصحيح.



# Location of files after submission
submitted_file_location = os.path.join(submitted_dir, submitted_file_name)
# Rename essentially copies and pastes files
os.rename(file_location, submitted_file_location)


يتم تجميع جميع التعليمات البرمجية المصدر في برنامج نصي واحد يمكنني تشغيله من سطر الأوامر. للحد من إمكانية حدوث أخطاء ، أقوم بتقديم وظيفة واحدة فقط في كل مرة ، وهذا ليس بالأمر الكبير نظرًا لأن الأمر يستغرق حوالي 5 ثوانٍ لبدء البرنامج!



هذا ما يبدو عليه عند تشغيل البرنامج:



صورة



يمنحني البرنامج الفرصة للتأكد من أن هذه هي المهمة الصحيحة قبل التحميل. بعد انتهاء البرنامج ، أحصل على الإخراج التالي:



صورة



أثناء تشغيل البرنامج ، يمكنني مشاهدة Python قيد التشغيل بالنسبة لي:



صورة



الاستنتاجات



تعد تقنيات الأتمتة في Python رائعة للعديد من المهام ، سواء العامة أو في مجال علوم البيانات. على سبيل المثال ، يمكننا استخدام Selenium لتنزيل ملفات البيانات الجديدة تلقائيًا كل يوم (بافتراض أن موقع الويب لا يحتوي على واجهة برمجة تطبيقات ). في حين أن البرمجة النصية قد تبدو مملة للوهلة الأولى ، فإن الميزة هي أنه يمكننا أن نجبر الكمبيوتر على تكرار هذا التسلسل عدة مرات كما نريد بنفس الطريقة بالضبط. لن يفقد البرنامج تركيزه أبدًا وسيذهب إلى Twitter. سيتبع الخطوات بالضبط في تسلسل مثالي (ستعمل الخوارزمية بشكل جيد حتى يتغير الموقع).



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



من حيث عائد الاستثمار ، يوفر لي هذا البرنامج حوالي 30 ثانية لكل مهمة ويستغرق ساعتين للكتابة. لذلك إذا استخدمته لإكمال 240 مهمة ، سأحصل على زيادة في الوقت المناسب! ومع ذلك ، فإن مردود هذا البرنامج يكمن في تطوير حل رائع للمشكلة ويعلم الكثير في هذه العملية. على الرغم من أن وقتي كان يمكن أن يتم إنفاقه بكفاءة أكبر في إكمال المهام بدلاً من معرفة كيفية تسليمها تلقائيًا ، إلا أنني استمتعت بالتحدي تمامًا. هناك أشياء قليلة مرضية مثل حل المشكلات ، وتبين أن Python أداة جيدة جدًا لذلك. ...



صورة



تعرف على تفاصيل كيفية الحصول على مهنة رفيعة المستوى من الصفر أو المستوى الأعلى في المهارات والراتب من خلال الحصول على دورات SkillFactory المدفوعة عبر الإنترنت:











All Articles