كيفية كشط البيانات من موقع

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

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

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

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

سنستخدم لغة برمجة Python لتجميع البيانات بسبب:

  • لديها أكبر دعم مجتمعي للتخليص وعلوم البيانات وما شابه
  • فمن السهل على التعلم

يأتي Python مثبتًا مسبقًا على نظام التشغيل Mac OS X ولكن بالنسبة لمستخدم Windows ، يجب عليك تثبيته عبر الموقع الرسمي. سنستخدم Python2.

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

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

دعنا نلقي نظرة على المكتبات التي سنستخدمها للتخلص:

  1. Jupyter Notebook - The Jupyter Notebook هو تطبيق ويب مفتوح المصدر يسمح لك بإنشاء ومشاركة المستندات التي تحتوي على تعليمات برمجية مباشرة ومعادلات ومرئيات ونصوص سردية. سأشارك الشفرة المستخدمة في هذا البرنامج التعليمي من خلال دفتر ملاحظات Jupyter المستضاف على Github!
  2. الطلبات - هذه المكتبة تجعل التعامل مع طلبات HTTP بسيطًا. لماذا تحتاج إلى التعامل مع طلبات HTTP؟ لأنهم هم ما يرسله متصفح الويب الخاص بك في الخلفية عندما يريد استرداد صفحة من الإنترنت.
  3. BeautifulSoup - هذه مكتبة بيثون تتولى استخراج البيانات ذات الصلة من HTML و XML. يمكنك قراءة المزيد حول التثبيت وكيفية استخدام BeautifulSoup هنا.

بعد ذلك ، نحتاج إلى الحصول على مكتبة BeautifulSoup باستخدام أداة إدارة الحزم في Python المعروفة باسم pip.

في الجهاز الطرفي (أو موجه الأوامر لمستخدمي Windows) ، اكتب:

نقطة تثبيت طلبات BeautifulSoup4

بعض القواعد التي يجب مراعاتها قبل الغاء:

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

يمكنك قراءة المزيد حول أخلاقيات تجريف البيانات هنا

كشط موقع على شبكة الإنترنت

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

الصفحة المقصودة لبلدي بلوق الشخصية

أولاً ، سنحتاج إلى فحص صفحة الويب والتعرف على تصميم HTML قبل المضي قدمًا في عملية التجريف. لتفقد صفحة ويب ، ما عليك سوى النقر بزر الماوس الأيمن على صفحة الويب والنقر فوق فحص.

كيفية فحص صفحة الويب

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

فحص التصميم للوظائف

بعد الامتحان المناسب ، اكتشفت أن جميع منشورات مدونتي كانت موجودة في div مع اسم صفي ، بعد النشر. والآن بعد أن أصبحت لدينا هذه المعلومات ، فلنبدأ في كتابة التعليمات البرمجية.

سأستفيد من Jupyter كما قلت سابقًا ، يمكنك أن تقرر كتابة الشفرة في البرامج النصية وتشغيلها يدويًا. أحب حقيقة أن Jupyter Notebooks تسمح لك بتشغيل التعليمات البرمجية الخاصة بك في الخلايا.

أولاً ، دعنا نستورد المكتبات التي سنستخدمها في هذا البرنامج التعليمي.

طلبات الاستيراد
من bs4 استيراد BeautifulSoup

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

بعد ذلك ، دعونا نقدم طلبًا ونحصل على HTML الخاص بمدونتي.

عنوان url = applications.get ('https://bolajiolajide.github.io')

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

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

source = BeautifulSoup (url.text، 'html.parser')

لقد مررت url.text بدلاً من url لأننا نريد فقط تحليل جزء HTML من الاستجابة إلى BeautifulSoup. الآن بعد أن أصبح لدينا كائن BeautifulSoup ، يمكننا معالجته باستخدام معرفتنا بتخطيط صفحة الويب للحصول على البيانات التي نحتاجها.

يمكن لـ BeautifulSoup مساعدتنا في الوصول إلى طبقات عميقة من HTML واستخراج المحتوى باستخدام find (). تذكر ، بعد أن فحصنا صفحة الويب ، اكتشفنا أن جميع المقالات الموجودة في المدونة كانت موجودة في div مع فئة من الخلاصة اللاحقة. في هذه الحالة ، نظرًا لأن فئة HTML فريدة في هذه الصفحة ، يمكننا ببساطة الاستعلام عن

.

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

post_feed = source.find ('div' ، class _ = "post-feed")

الآن لدينا جميع مقالاتنا (ترميزها ، لول) المخزنة في تغذية ما بعد متغير. بعد ذلك ، دعونا نتفقد المقالات الفردية للحصول على مؤلف المقال وعنوانه ومقتطفاته.

المشاركات = post_feed.find_all ('article'، class _ = "post-card")

ما قمنا به هنا هو استخدام طريقة find_all للحصول على جميع مثيلات العلامة مع فئة من البطاقات البريدية.

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

single_post = المشاركات [0]

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

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

  • يتم التفاف عنوان المنشور في عنصر h2 بفئة من بطاقة ما بعد البطاقة.
  • يتم تغليف مقتطف المشاركة في علامة p متداخلة داخل عنصر مقطع مع مقتطف ما بعد بطاقة الفصل.
  • يتم التفاف اسم المؤلف في علامة متداخلة في عنصر span مع مؤلف بطاقة ما بعد الفصل.
فحص عنوان المنشورفحص مقتطفات المنشورفحص مؤلف المنشور

واحدة من ميزات BeautifulSoup هو أنه يمكن استخراج علامات HTML بغض النظر عن مدى تداخلها العميق.

ما يعنيه هذا هو أنه يمكننا العثور على العلامات التي تحتوي على مؤلف المنشور وعنوانه ومقتطفاته دون الاضطرار إلى البحث بشكل أعمق.

لنبدأ بعنوان المنشور ، يتم لفه بعنصر h2 مع اسم بطاقة ما بعد الفصل.

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

title = single_post.find ('h2'، class _ = 'post-card-title')

هذا سيعود العلامات كما هي. نظرًا لأننا نريد فقط النص الموجود داخل علامة h2 ، يمكننا استهدافه بالنص .text.

title = title.text

title.text يعطينا العنوان في النص دون العلامات.

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

نظرًا لأن عنصر p متداخل بداخله ، فإننا ببساطة نستهدف نص العنصر p بنفس الطريقة التي استهدفنا بها النص الموجود داخل العنوان.

excerpt = single_post.find ('section'، class _ = "post-card-excerpt")
مقتطفات = excerpt.p.text

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

الكاتب = single_post.find ('span' ، class _ = "post-card-author")
المؤلف = المؤلف

لقد حصلنا على المعلومات التي نحتاجها من منشور واحد ، نحتاج الآن إلى تحويل العملية إلى وظيفة حتى نتمكن من تشغيل الوظيفة للحصول على البيانات التي نحتاجها من كل منشور نقوم بجمعه.

def get_post_details (مقالة):
    title = article.find ('h2'، class _ = 'post-card-title'). text
    excerpt = article.find ('section'، class _ = 'post-card-excerpt'). p.text
    المؤلف = article.find ('span' ، class _ = 'post-card-author'). a.text
    إرجاع {
        "اللقب": العنوان ،
        "مقتطفات": مقتطفات ،
        "المؤلف": المؤلف
    }

أعيد المعلومات ككائن ، لذلك يتم تمثيل كل منشور بكائن.

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

يمكنك الاستفادة من فهم القائمة للحصول على تفاصيل كل منشور

# الاستفادة من قائمة الفهم بدلا من الحلقات
blog_posts = [get_post_details (منشور) للنشر في المنشورات] ؛

أو استخدام حلقة لتكرار الحلقة عبر كل منشور وتمرير العلامة إلى الوظيفة:

blog_posts = []
للنشر في الوظائف:
    blog_posts.append (get_post_details (آخر))

سيتم إلحاق تفاصيل كل منشور في صفيف blog_posts.

لقد وصلنا إلى نهاية هذا البرنامج التعليمي ، لقد حررت في إرفاق دفتر ملاحظات Jupyter كجائزة في هذا المنشور حتى تتمكن من المتابعة خلال وقت فراغك.

القشط هو حقا سهلة وممتعة! ♂

إذا كنت قد استمتعت بهذا المقال ، يرجى لذلك ومشاركتها. أنا أقدر ذلك حقًا.

إذا كان لديك أي أسئلة ، فلا تتردد في ترك تعليق أدناه.

شكرا!