كيفية استخلاص بيانات مقالات ويكيبيديا باستخدام بايثون: دليل شامل

دقائق القراءة: 5

استخلاص بيانات مقالات ويكيبيديا باستخدام بايثون: دليل شامل

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

إعداد مستخلص الويب: البداية مع بايثون

للبدء في رحلتنا، سنقوم بإنشاء ملف بايثون جديد. يمكن تسميته scraper.py. استخدم الأمر التالي في سطر الأوامر لإنشائه:

touch scraper.py

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

pip install requests

لنبدأ بتحديد صفحة ‘Web scraping’ على ويكيبيديا كنقطة انطلاق لمستخلصنا. سنقوم بإرسال طلب GET لهذه الصفحة وطباعة رمز الحالة للتحقق من نجاح الاتصال:

import requests

response = requests.get(
    url="https://en.wikipedia.org/wiki/Web_scraping",
)
print(response.status_code)

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

python3 scraper.py
200

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

استخلاص البيانات من الصفحة: استخدام BeautifulSoup

الآن بعد أن أصبح لدينا محتوى الصفحة، حان الوقت لاستخلاص المعلومات المفيدة منها، وتحديدًا عنوان المقال. لجعل عملية تحليل HTML أسهل بكثير، سنستخدم مكتبة BeautifulSoup، وهي أداة قوية لتحليل مستندات HTML و XML. قم بتثبيتها أولاً:

pip install beautifulsoup4

عند فحص بنية صفحة ويكيبيديا (باستخدام أدوات المطور في المتصفح)، نلاحظ أن وسم العنوان الرئيسي للمقال (<h1>) يحمل المعرّف id="firstHeading". هذا المعرف فريد ويجعل العثور على العنوان أمرًا مباشرًا.

لقطة شاشة توضح موقع وسم العنوان الرئيسي (h1) ومعرفه (firstHeading) في بنية HTML لصفحة ويكيبيديا.

تسمح لك مكتبة BeautifulSoup بالبحث عن عنصر باستخدام معرفه (id) بسهولة:

title = soup.find(id="firstHeading")

بدمج كل ما تعلمناه حتى الآن، يصبح البرنامج كالتالي:

import requests
from bs4 import BeautifulSoup

response = requests.get(
    url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.string)

عند تشغيل هذا الكود، سيتم عرض عنوان مقال ويكيبيديا بنجاح:

python3 scraper.py
Web scraping

لقد نجحنا في استخلاص العنوان! الخطوة التالية هي جعل المستخلص يتنقل بين الصفحات.

التنقل بين الروابط: استكشاف عشوائي لمقالات ويكيبيديا

الآن، سنتعمق أكثر في استكشاف ويكيبيديا. هدفنا هو العثور على رابط عشوائي (<a> tag) يشير إلى مقال آخر على ويكيبيديا، ثم نقوم باستخلاص بيانات تلك الصفحة. لتحقيق ذلك، سنستخدم BeautifulSoup للعثور على جميع وسوم <a> الموجودة داخل المحتوى الرئيسي للمقال. بعد ذلك، سنقوم بخلط قائمة الروابط عشوائيًا لضمان التنقل غير المتوقع.

import requests
from bs4 import BeautifulSoup
import random

response = requests.get(
    url="https://en.wikipedia.org/wiki/Web_scraping",
)
soup = BeautifulSoup(response.content, 'html.parser')
title = soup.find(id="firstHeading")
print(title.text) # Changed from .content to .text for consistency and common usage

# Get all the links within the main article body
allLinks = soup.find(id="bodyContent").find_all("a")
random.shuffle(allLinks)

linkToScrape = None # Initialize with None
for link in allLinks:
    # We are only interested in other wiki articles
    # Check if 'href' attribute exists and contains '/wiki/'
    if link.get('href') and link['href'].find("/wiki/") != -1:
        linkToScrape = link
        break

print(linkToScrape)

كما تلاحظ في الكود أعلاه، استخدمنا soup.find(id="bodyContent").find_all("a") للعثور على جميع وسوم <a> داخل العنصر الذي يحمل المعرف bodyContent، وهو عادة ما يمثل المحتوى الرئيسي للمقال. ولأننا مهتمون فقط بالروابط التي تؤدي إلى مقالات ويكيبيديا أخرى، تأكدنا من أن الرابط يحتوي على البادئة /wiki/. عند تشغيل البرنامج الآن، سيعرض رابطًا عشوائيًا لمقال آخر من ويكيبيديا:

python3 scraper.py
<a href="/wiki/Link_farm" title="Link farm">Link farm</a>

ممتاز! لقد أصبحنا قادرين على استخلاص روابط عشوائية.

بناء مستخلص لا نهائي: رحلة مستمرة في ويكيبيديا

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

import requests
from bs4 import BeautifulSoup
import random

def scrapeWikiArticle(url):
    response = requests.get(url=url)
    soup = BeautifulSoup(response.content, 'html.parser')
    title = soup.find(id="firstHeading")
    print(title.text)

    allLinks = soup.find(id="bodyContent").find_all("a")
    random.shuffle(allLinks)

    linkToScrape = None
    for link in allLinks:
        # We are only interested in other wiki articles
        if link.get('href') and link['href'].find("/wiki/") != -1:
            linkToScrape = link
            break
    
    # Ensure a link was found before attempting to scrape it
    if linkToScrape:
        scrapeWikiArticle("https://en.wikipedia.org" + linkToScrape['href'])
    else:
        print("No valid Wikipedia link found on this page to follow.")


# Start the scraping process
scrapeWikiArticle("https://en.wikipedia.org/wiki/Web_scraping")

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

python3 scraper.py
Web scraping
Digital object identifier
ISO 8178
STEP-NC
ISO/IEC 2022
EBCDIC 277
Code page 867
Code page 1021
EBCDIC 423
Code page 950
G R Mole (unit)
Gram Remmius Palaemon
Encyclopædia Britannica Eleventh Edition
Geography
Gender studies
Feminism in Brazil

مذهل! في حوالي 10 خطوات فقط، انتقلنا من مقال ‘Web Scraping’ إلى ‘Feminism in Brazil’. هذا يوضح قوة المستخلص الذي بنيناه وقدرته على استكشاف عوالم المعرفة المتشابكة في ويكيبيديا.

الخلاصة التقنية

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *