web scraping هو عملية جمع المعلومات من الإنترنت.
في هذه المقالة سيتم العمل على تطبيق لسحب بيانات
المنتجات من موقع Jumia
و حفظها في ملف اكسل ، لكن أولا دعونا نتعرف على أشهر
مكتبات بايثون التي تستعمل في هذا المجال .
مكتبات بايثون ل
web scraping :
beautifulSoup
بيوتيفلسوب هي مكتبة بايثون لتحليل البيانات المهيكلة. يسمح لك بالتفاعل مع ه . ت . م . ل بطريقة مشابهة لكيفية تفاعلك مع صفحة الويب باستخدام أدوات المطور. تعرض المكتبة وظيفتين بديهية يمكنك استخدامها لاستكشاف ه . ت . م . ل الذي تلقيته.
selenium
السيلينيوم هو مشروع شامل لمجموعة من الأدوات
والمكتبات التي تمكن وتدعم أتمتة متصفحات الويب.
يوفر امتدادات لمحاكاة تفاعل المستخدم مع
المتصفحات ، وخادم توزيع لتوسيع نطاق تخصيص المستعرض ، والبنية التحتية لتطبيقات
مواصفات W3C
WebDriver التي تتيح لك كتابة كود قابل للتبديل لجميع
متصفحات الويب الرئيسية.
أصبح هذا المشروع ممكنًا عن طريق المساهمين
المتطوعين الذين قضوا آلاف الساعات من وقتهم ، وجعلوا شفرة المصدر متاحة مجانًا
لأي شخص لاستخدامها والاستمتاع بها وتحسينها.
يجمع السيلينيوم بين بائعي المستعرضات والمهندسين
والمتحمسين لمزيد من المناقشة المفتوحة حول أتمتة منصة الويب. ينظم المشروع مؤتمر
سنوي لتعليم ورعاية المجتمع.
في قلب السيلينيوم يوجد WebDriver ، واجهة لكتابة مجموعات التعليمات التي يمكن تشغيلها بالتبادل في العديد من المتصفحات. بمجرد تثبيت كل شيء ، فقط بضعة أسطر من التعليمات البرمجية تجعلك تدخل داخل المتصفح. يمكنك العثور على مثال أكثر شمولاً في كتابة أول برنامج نصي للسيلينيوم.
requests
مكتبة ريكويستس هي المعيار الفعلي لإجراء طلبات ه . ت . ت . ب في بايثون. إنه يلخص تعقيدات تقديم الطلبات خلف واجهة برمجة تطبيقات بسيطة وجميلة بحيث يمكنك التركيز على التفاعل مع الخدمات واستهلاك البيانات في تطبيقك.
scrapy
سكرابي هو إطار عمل مجاني ومفتوح المصدر للزحف على الويب مكتوب بلغة بايثون. تم تصميمه في الأصل من أجل ويب سكرايبينغ ، ويمكن استخدامه أيضًا لاستخراج البيانات باستخدام واجهات برمجة التطبيقات أو كزاحف ويب للأغراض العامة.
استخراج بيانات المنتجات من
موقع Jumia :
(الكود كامل على GitHub في أسفل الصفحة )
سنعتمد على مكتبة beautifulSoup و requests و أيضا مكتبة pandas لتخزين
البيانات .
import requests
from bs4 import BeautifulSoup
import pandas as pd
بعدها نقوم بإدخال رابط لموقع جوميا يحتوي على
معلومات الهواتف ، ممكن إضافة أي رابط في موقع جوميا
'url = 'https://www.jumia.ma/smartphones/?page=1
ثم ندخل dictionnary الذي سنخزن فيه البيانات بعد استخراجها لمتغير
.
columns = {'name':[] , 'price':[], 'img url':
[]}
بعدها ، ننشئ كائن beautifulSoup و بمساعدة مكتبة
requests نأخذ page.content وهو محتوى HTML للرابط الذي
أدخلناه من قبل .
r = requests.get(url)
soup = BeautifulSoup(r.content, "html.parser")
"html.parser" تتأكد من أنك
تستخدم المحلل اللغوي المناسب لمحتوى HTML.
في هذه المرحلة يجب التركيز جيدا ، لأننا سنبحث عن
العناصر التي نريد استخراجها من الكود عن طريق class Name .
نبحث في الكود HTML فقط عن المحتوى الذي نريد استخراج
منه البيانات ، ثم ننسخ ما بداخل class و إدخالها
لوظيفة find() بالطريقة التالية
:
ancher = soup.find('div',{'class' : '-paxs row
_no-g _4cl-3cm-shs'})
في هذه الحالة وجدنا أن div هو العنصر الذي يضم كل البيانات
التي نحتاجها لذلك أدخلنا div و
class و ما يوجد بداخل class في الوظيفة find .
هناك وظيفة أخرى لكائنات beautifulSoup تسمى
find_all() ، نستعملها إذا كان العنصر متكرر أكثر من مرة
، سنستعمل هذه الوظيفة في المرحلة المقبلة .
يوجد داخل العنصر div كل البيانات التي نحتاجها، سنبحث عن
هذا في الكود HTML .
نلاحظ أنه يوجد مجموعة من عناصر article داخل العنصر div الذي حددناه
من قبل (كل article تمثل هاتف و بياناته في الموقع)،
و داخل كل article يوجد البيانات التي نريدها التي
هي اسم الهاتف و الثمن و الصورة.
سنستعمل وظيفة find_all() لتحديد كل عناصر
article و استخراج ما بداخلها .
ancher = ancher.find_all('article' , {'class' :
'prd _fb col c-prd'})
بعدما حددنا كل العناصر article ، نبرمج حلقة لسحب
البيانات من كل عنصر ، مع تحديد العناصر للمعلومة المراد استخراجها ب
class و إدخالها ل find كما فعلنا سابقا .
ثم نخزن كل البيانات في القاموس الذي عرفناه في أول الكود .
:for pt in ancher
img=pt.find('a').find('div' , {'class' : 'img-c'}).find('img',{'class':'img'})
name = pt.find('a').find('div' , {'class' : 'info'}).find('h3' , {'class' : 'name'})
price = pt.find('a').find('div' , {'class' : 'info'}).find('div' , {'class' :
'prc'})
columns['name'].append(name.text)
columns['price'].append(price.text)
columns['img url'].append(img.get('data-src'))
الآن قبل حفظ البيانات في ملف اكسل ، ماذا لو أردنا سحب هذه البيانات من مجموعة من الصفحات أو كل الصفحات ، و هذا ما سنفعله الآن .
لاحظوا جيدا أن الرابط ينتهي برقم الصفحة :
الآن كل ما علينا هو جعل الكود يقوم بتغيير الرقم
كل مرة مع استخراج البيانات لكل صفحة ، سنقوم ببرمجة حلقة تفعل كل هذا ليصبح الكود
بالشكل التالي :
import requests
from bs4 import BeautifulSoup
import pandas as pd
'=url = 'https://www.jumia.ma/smartphones/?page
columns = {'name':[] , 'price':[], 'img url': []}
:for page in range(1,10)
print('---', page, '---')
r = requests.get(url + str(page))
soup = BeautifulSoup(r.content, "html.parser")
ancher = soup.find('div',{'class' : '-paxs row _no-g
_4cl-3cm-shs'}).find_all('article' , {'class' : 'prd _fb col c-prd'})
:for pt in ancher
img=pt.find('a').find('div' , {'class' : 'img-c'}).find('img',{'class':'img'})
name = pt.find('a').find('div' , {'class' : 'info'}).find('h3' , {'class' :
'name'})
price = pt.find('a').find('div' , {'class' : 'info'}).find('div' , {'class' :
'prc'})
columns['name'].append(name.text)
columns['price'].append(price.text)
columns['img url'].append(img.get('data-src'))
في الأخير نحفظ كل هذه البيانات في ملف اكسل
بمساعدة مكتبة
pandas .
data = pd.DataFrame(columns)
data.to_excel('data.xlsx')
النتيجة :
هناك استعمالات كثيرة
لهذه البيانات مثلا : التسويق بالعمولة لموقع جوميا مع إضافة المنتجات لموقعك ، .....
الكود كامل على GitHub 💻:
https://github.com/AyoubAllali1/web-scraping-Jumia
برمجة سعيدة 🔥🔥