برنامج تعليمي من Semalt: تجريف الويب في Python

لقد زرت KinoPoisk (النسخة الروسية من IMDB) مؤخرًا واكتشفت أنه على مر السنين تمكنت من تقييم أكثر من 1000 فيلم. اعتقدت أنه سيكون من المثير للاهتمام البحث في هذه البيانات بشكل أكثر تفصيلاً: هل تغيرت مذاق الفيلم الخاص بي بمرور الوقت؟ خلال أي فصول السنة أشاهد المزيد من الأفلام؟

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

هذه المقالة مخصصة لأولئك الذين أرادوا دائمًا تعلم كيفية استخدام Web Scrapping ولكنهم لم يضعوا أيديهم عليه أو لم يعرفوا من أين يبدأون.

مهمة

مهمتنا هي استخراج البيانات حول الأفلام التي تمت مشاهدتها بالفعل: عنوان الفيلم وتاريخ ووقت المشاهدة وتقييم المستخدم.

في الواقع ، سيتم عملنا على مرحلتين:

المرحلة 1: تنزيل صفحات html وحفظها

المرحلة 2: تحليل html في تنسيق مناسب لمزيد من التحليل (csv ، json ، pandas dataframe إلخ.)

الادوات

هناك الكثير من مكتبات بايثون لإرسال طلبات http. الأكثر طلبًا وشهرة جدًا هو الطلبات.

من الضروري أيضًا اختيار مكتبة لتحليل html.

BeatifulSoup ، lxml

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

تنزيل البيانات

لنبدأ تنزيل البيانات. بادئ ذي بدء ، دعنا نحاول فقط الحصول على الصفحة عن طريق url وحفظها في ملف محلي.

نفتح الملف الناتج ونرى أنه ليس بهذه البساطة: اعتبرنا الموقع روبوتًا ولن يعرض البيانات.

دعنا نكتشف كيف يعمل الموقع

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

كما نرى ، يرسل المتصفح أيضًا إلى رؤوس UserAgent وملف تعريف الارتباط وعدد آخر من المعلمات. أولاً ، سنحاول فقط إرسال UserAgent الصحيح إلى رأس.

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

تنزيل جميع الأسعار

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

جمع البيانات من Html

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

من bs4 استيراد بيوتيفولسوب

من استيراد lxml أتش تي أم أل

# حساء جميل

حساء = BeautifulSoup (text)

film_list = soup.find ('div'، ('class': 'profileFilmsList'))

# lxml

شجرة = html.fromstring (نص)

film_list_lxml = tree.xpath ('// div [class =' 'profileFilmList' ']') [0]

دعونا نتعلم كيفية سحب العنوان الروسي للفيلم ورابط إلى صفحة الفيلم (أيضًا كيفية الحصول على النص وقيمة السمة).

إذا كنت بحاجة إلى استخراج العنوان باللغة الإنجليزية فقط قم بتغيير "nameRus" إلى "nameEng".

النتائج

لقد تعلمنا كيفية تحليل مواقع الويب ، وتعرفنا على طلبات المكتبات ، و BeautifulSoup ، و lxml ، بالإضافة إلى البيانات المستلمة المناسبة لمزيد من التحليل للأفلام التي تمت مشاهدتها بالفعل على KinoPoisk.