استخراج البيانات من مواقع الويب باستخدام BeautifulSoup وSelenium: دليل شامل

  • تُعد مكتبتا BeautifulSoup و Requests مثاليتين لاستخراج البيانات الثابتة من صفحات HTML التي تم عرضها مسبقًا من الخادم.
  • تتيح لك Selenium تحميل JavaScript، والتعامل مع الإطارات المضمنة (iframes)، ومحاكاة إجراءات المستخدم على الصفحات الديناميكية.
  • إن الجمع بين Selenium للعرض و BeautifulSoup للتحليل يوفر المرونة والدقة.
  • الأخلاق، واحترام ملف robots.txt، والإدارة الجيدة للأخطاء هي عناصر أساسية في أي مشروع استخراج بيانات.

استخراج البيانات من مواقع الويب باستخدام BeautifulSoup وSelenium

عندما يسألك مديرك مراقبة أسعار المنافسين، وتحليل التقييمات، أو جمع البيانات من مئات الصفحاتلم يعد النسخ واللصق اليدوي خيارًا متاحًا. أنت بحاجة إلى طريقة لأتمتة استخراج المعلومات دون أن تُرهق نفسك أو تُضيّع ساعات في مهام متكررة.

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

ما هو استخراج البيانات من مواقع الويب، ومتى يكون استخدامه منطقياً؟

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

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

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

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

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

الجوانب القانونية والأخلاقية: ما لا ينبغي تجاهله

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

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

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

هناك عنصر أساسي واحد يجب عليك النظر إليه دائمًا تقريبًا: الملف ملف robots.txtستجده في جذر النطاق، شيء من هذا القبيل https://www.ejemplo.com/robots.txtهناك، يُحدد المالك المسارات التي لا يرغب في أن يتم الزحف إليها أو فهرستها، على سبيل المثال من خلال توجيهات مثل رفض لإغلاق الطرق أو تأخير الزحف لضمان الحد الأدنى من التأخير بين الطلبات.

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

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

كيفية تحميل صفحة الويب فعلياً: HTML، CSS، JavaScript، و iframes

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

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

ومن الأمثلة النموذجية على ذلك أنظمة التعليقات مثل هاردقد لا يحتوي كود HTML الأصلي على سطر واحد من التعليقات، ولكن قد يحتوي DOM النهائي الذي تم إنشاؤه بواسطة المتصفح على سطر واحد. تم إنشاء الإطار المضمن (iframe) بواسطة جافا سكريبت حيث يتم تحميل سلسلة العمليات بأكملها. إذا حاولتَ إجراء عملية استخراج بيانات ثابتة من تلك الصفحة، فسينتهي بك الأمر بملف HTML "معطل".

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

استخراج البيانات الثابتة باستخدام Requests و BeautifulSoup

عندما يكون المحتوى الذي تحتاجه موجودًا بالفعل في ملف HTML الأولي (مثل المنتجات النموذجية، والأخبار، والجداول البسيطة، والقوائم الثابتة)، فإن الطريقة الأكثر فعالية عادةً ما تكون استخدام تُستخدم الطلبات لإجراء طلب HTTP، وBeautifulSoup لتحليل HTMLإنه الزوج الكلاسيكي للكشط الخفيف والسريع.

العملية الأساسية بسيطة: أولاً، ترسل طلبًا باستخدام requests.get(url) وتقوم بتحليل الاستجابة. ومع وجود الشيء في يدك، يمكنك النظر رمز الحالة مع status_code، أو المحتوى النصي مع text، أو المحتوى الثنائي مع contentبالإضافة إلى فحص العناوين وعناوين URL النهائية لفهم ما يعيده الخادم بشكل أفضل.

بمجرد حصولك على كود HTML، تقوم بتمريره إلى BeautifulSoup، عادةً باستخدام شيء كهذا: BeautifulSoup(html, "html.parser")يقوم المحلل اللغوي بتقسيم النص إلى بنية شجرية أكثر ملاءمة للبحث عن العلامات والخصائص والمحتوى المتداخل.

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

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

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

استخراج البيانات الديناميكي باستخدام Selenium: جافا سكريبت، وإطارات iframe، وإجراءات المستخدم

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

هنا تبرز قوة السيلينيوم. صُمم السيلينيوم في الأصل لـ أتمتة الاختبارات الوظيفية لتطبيقات الويبلكن قدرتها على التعامل مع المتصفح - فتح الصفحات، والنقر، وملء المدخلات، وانتظار تحميل المحتوى - تجعلها أداة قوية للغاية للاستخراج الديناميكي للبيانات.

يُعدّ WebDriver جوهر Selenium، وهو مكوّن يتحكّم في المتصفح المُختار (Chrome، Firefox، وغيرها). لاستخدامه، أنت بحاجة إلى برنامج تشغيل خاص بالمتصفح (geckodriver لمتصفح Firefox، وchromedriver لمتصفح Chrome، وما إلى ذلك)، والتي يجب أن تكون في مسار يمكن الوصول إليه من نظامك، وعادة ما يتم تضمينها في متغير بيئة PATH.

يتم تثبيت بايثون الأساسي باستخدام أمر مشابه لما يلي: pip تثبيت السيلينيومومن ثم، في البرنامج النصي الخاص بك، تقوم بإنشاء نسخة من WebDriver، على سبيل المثال باستخدام webdriver.Firefox() أو webdriver.Chrome()والآن يمكنك البدء في التصفح، وفتح عناوين المواقع الإلكترونية، أو التفاعل مع الصفحة كما لو كنت مستخدمًا حقيقيًا.

أما بالنسبة لنوع المتصفح، فيمكنك استخدام متصفح كامل بواجهة رسومية أو متصفح في وضع الاستعداد. بلا رأسنظرياً، توجد بدائل مثل PhantomJS، ولكن عملياً أبلغ العديد من الأشخاص عن عدم توافق وسلوك غريب، لذا يُفضل عادةً استخدام... استخدم متصفح Chrome أو Firefox في الوضع الحقيقي أو الوضع بدون واجهة رسومية لتقليل المفاجآت.

بمجرد تحميل الصفحة، يتيح لك Selenium تحديد موقع العناصر باستخدام مجموعة واسعة من المحددات: عن طريق المعرف أو الاسم أو الفئة أو محدد CSS أو XPathيمكنك استدعاء طرق مثل find_element أو find_elements ومن هناك، قم بتنفيذ إجراءات مثل النقر أو إرسال المفاتيح أو استرداد النص المرئي لكل عقدة.

اجمع بين Selenium و BeautifulSoup لتحقيق أقصى استفادة منهما

عادةً ما تكون التركيبة الأكثر فعالية للمواقع المعقدة هي التالية: يتولى Selenium تحميل الصفحة، وتنفيذ JavaScript، وإعداد DOM النهائي؛ ثم يأتي BeautifulSoup لتحليل HTML المعروض واستخراج البيانات. مع كل ما يوفره من سهولة في وظائف البحث.

النمط العام بسيط. أولاً، تقوم بتهيئة WebDriver، ثم تقوم بتحميل عنوان URL باستخدام driver.get() وإذا لزم الأمر، تنتظر ظهور عناصر رئيسية معينة باستخدام عمليات انتظار صريحة. وعندما تتأكد من تحميل المحتوى، تحصل على HTML النهائي مع driver.page_source.

تقوم بتمرير كود HTML هذا إلى BeautifulSoup، تمامًا كما تفعل في عملية استخراج البيانات الثابتة، للتكرار. الجداول، والقوائم، والمقالات، والصفوف، أو أي كتلة ذات بنية متكررةيتيح لك هذا الاستفادة من قوة محددات Selenium للوصول إلى الجزء الصحيح من الصفحة، ثم مرونة BeautifulSoup لاستخراج البيانات بشكل نظيف.

في الصفحات التي تستخدم الإطارات المضمنة (iframes)، مثل تعليقات Disqus، غالبًا ما يتعين عليك قم بتغيير السياق إلى الإطار المضمن المحدد قبل استخراج المحتوى، يمكنك باستخدام Selenium تحديد موقع الإطار المضمن (iframe) - على سبيل المثال، الإطار المعلق من الحاوية التي تحمل المعرف disqus_thread -، واستخدام switch_to.frame، وبمجرد الدخول، انتظر حتى يتم تحميل عناصر مثل عداد التعليقات أو كتل النصوص.

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

بمجرد ظهور جدول الأسماء، يمكنك استرجاع driver.page_source، قم بتمريره إلى BeautifulSoupتبحث عن الجدول المقابل (على سبيل المثال، الجدول الرابع في الصفحة) وتستخرج جميع الخلايا منه. تقوم بتنظيف النص، واستبدال الأحرف غير المألوفة، وإزالة التكرارات، وحفظ كل اسم جديد في قائمة.

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

حالات استخدام عملية مع BeautifulSoup وSelenium وواجهات برمجة التطبيقات

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

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

في مجال التجارة الإلكترونية، يُعدّ استخراج البيانات من موقع إلكتروني لشركة طيران أو موقع لمقارنة الرحلات الجوية مثالًا كلاسيكيًا على ذلك. احصل على الأسعار والجداول الزمنية ومطارات المغادرة والوصولقيود الأمتعة وغيرها من التفاصيل المفيدة. هنا تجدون كلاً من Requests و BeautifulSoup إذا كان HTML ثابتًا، مثل Selenium إذا ظهرت النتائج بعد التفاعل مع النماذج والمحددات الديناميكية.

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

إذا كنت بحاجة إلى تجاوز النصوص الفردية وتريد القدرة على التعامل مع كميات كبيرة من البياناتإليكم Scrapy، إطار عمل متخصص في استخراج البيانات يُسهّل عليكم العمل من خلال قوائم انتظار الطلبات، وإدارة برامج الزحف، والبرمجيات الوسيطة، وخطوط المعالجة. ولا يزال Selenium مفيدًا في حالات محددة؛ ما عليكم سوى دمجه في برامج الزحف التي تتطلب تنفيذ جافا سكريبت.

في جميع هذه الحالات، تظل الأخلاق والقانون ساريين: من الضروري احترام ملف robots.txt، والحد من وتيرة الطلبات، لا تدخل المناطق الخاصة أو تتحايل على الإجراءات الأمنية. واستخدم البيانات بمسؤولية، خاصة إذا كنت ستستغلها تجارياً.

إدارة الأخطاء، وبيئات العمل، وأفضل الممارسات

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

بالنسبة للمشاريع الاحترافية على أنظمة Linux أو macOS، يُنصح عادةً بإنشاء مجلد خاص بالمشروع، وربطه بـ بيئة افتراضية باستخدام venvقم بتفعيله وقم بتثبيت التبعيات الضرورية فقط بداخله: requests، beautifulsoup4، selenium، jupyter إذا كنت ستستخدم دفاتر الملاحظات، إلخ. سيجعل هذا من السهل جدًا إعادة إنتاج البيئة، أو تحديث الحزم، أو نقل المشروع إلى جهاز آخر.

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

في عملك اليومي، ستضطر إلى التعامل مع الاستثناءات. فعندما تفشل الطلبات، أو عندما لا يظهر عنصر Selenium في الوقت المحدد، أو عندما لا يتمكن BeautifulSoup من العثور على العقدة التي توقعتها، سيُصدر بايثون استثناءات. الاستثناءات التي، إذا لم يتم التقاطها، ستوقف البرنامجيتيح لك استخدام كتل try-except التعامل مع حالات الفشل هذه، وتسجيل ما حدث، وتحديد ما إذا كان يجب تخطي عنوان URL هذا، أو إعادة المحاولة، أو إيقاف التنفيذ.

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

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

باختصار، إذا فهمت كيفية بناء صفحات الويب الحديثة، ومتى يكون HTML الثابت كافيًا ومتى تحتاج إلى متصفح حقيقي، وقمت بدمجها بشكل معقول، يمكنك تحقيق النتائج المرجوة. Requests و BeautifulSoup و Selenium وواجهات برمجة التطبيقات وأدوات مثل Scrapyيمكنك أتمتة استخراج البيانات بكفاءة عالية. المهم هو القيام بذلك بعناية، مع مراعاة القيود التقنية والقانونية، والحفاظ على تنظيم الكود بشكل كافٍ بحيث يمكنك معرفة وظيفة كل جزء منه حتى بعد بضعة أشهر.