انتقل إلى المحتوى

ما هي أفضل مكتبات تجريف الويب بايثون؟

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

سنلقي نظرة متعمقة على كيفية عمل كل مكتبة وأفضل المواقف لاستخدامها. هدفي هو تزويدك بالأفكار اللازمة لاختيار أدوات الكشط المناسبة لأي مشروع. هيا بنا نبدأ!

مكتبات HTTP الأساسية: أساس عملية تجريف بايثون

الخطوة الأولى في أي مشروع لتجميع الويب هي تنزيل محتوى صفحة الويب. تجعل طلبات Python ومكتبات HTTPX هذا أمرًا بسيطًا حقًا.

الطلبات: مكتبة HTTP المجربة والصحيحة

الطلبات هي مكتبة Python الأكثر شيوعًا لطلبات HTTP، ويستخدمها 89% من مطوري Python وفقًا لاستطلاع مطوري Python لعام 2020.

من السهل معرفة السبب. يستغرق تقديم طلب مع الطلبات سطرًا واحدًا فقط من التعليمات البرمجية:

response = requests.get(‘https://www.example.com‘)

تدعم الطلبات جميع أفعال HTTP الشائعة مثل GET وPOST وPUT وDELETE بنفس الواجهة البسيطة. انه يعالج:

  • معلمات الترميز في سلاسل URL
  • إضافة الرؤوس وملفات تعريف الارتباط
  • إرسال تحميلات ملفات متعددة الأجزاء
  • ترميز هيئات طلب JSON

ويقوم تلقائيًا بفك تشفير محتوى الاستجابة استنادًا إلى رؤوس HTTP. لا حاجة للاتصال بـ json() يدويًا مثل اللغات الأخرى.

طلبات حتى يعالج:

  • بعد عمليات إعادة التوجيه
  • إعادة محاولة الطلبات
  • اتصالات مستمرة
  • ملفات تعريف الارتباط على غرار المتصفح

إنه كل ما تحتاجه لطلبات HTTP الأساسية في واجهة بسيطة. بناءً على تجربتي، أوصي بالطلبات لأي مطور بايثون يبدأ بتجريد الويب.

HTTPX: عميل HTTP غير متزامن أكثر تقدمًا

يوفر HTTPX نفس واجهة نمط الطلبات البسيطة مع ميزات متقدمة لحالات الاستخدام المعقدة:

  • الطلبات غير المتزامنة
  • دعم HTTP / 2
  • التعامل مع المهلة
  • ثبات ملفات تعريف الارتباط
  • تجميع الاتصال
  • وكلاء
  • التخزين المؤقت مثل المتصفح

يعد تقديم الطلبات بشكل غير متزامن أمرًا مهمًا بشكل خاص للأداء. إليك كيفية جلب عناوين URL متعددة بشكل متزامن مع HTTPX:

import httpx

async with httpx.AsyncClient() as client:

  futures = [client.get(url) for url in urls]

  for response in await httpx.async_list(futures):
    print(response.url)

استنادًا إلى المعايير، يحقق HTTPX إنتاجية أعلى بمقدار 2-3 مرات من طلبات دفعات كبيرة من الطلبات.

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

تحليل HTML: استخراج البيانات من صفحات الويب

بمجرد حصولك على محتوى HTML، فقد حان الوقت لتحليله واستخراج البيانات التي تحتاجها. هناك خياران رائعان هنا هما Beautiful Soup وLXML.

حساء جميل: تحليل HTML بسيط

إن Beautiful Soup ترقى إلى مستوى اسمها كمكتبة رائعة للتحليل والتكرار عبر HTML وXML في Python. استنادًا إلى استطلاع Python لعام 2020، فهي مكتبة Python الأكثر شيوعًا لمعالجة HTML وXML.

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

from bs4 import BeautifulSoup

soup = BeautifulSoup(response.text, ‘html.parser‘)

for link in soup.find_all(‘a‘):
  print(link.get(‘href‘))

تتكون واجهة برمجة تطبيقات BeautifulSoup بشكل أساسي من:

  • طرق مثل find(), find_all() للبحث عن العقد
  • صفات مثل name, string, attrs للوصول إلى خصائص العقدة
  • طرق مثل get_text(), decompose() لتعديل العقد

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

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

LXML: تحليل أسرع لـ HTML/XML يعتمد على لغة C

إذا كنت تقوم بتحليل الكثير من مستندات XML/HTML الكبيرة، أقترح عليك استخدام LXML بدلاً من. إنها مكتبة تحليل XML لـ Python مبنية فوق مكتبات C عالية الأداء libxml2 وlibxslt.

وفقًا للمعايير، يمكن لـ LXML تحليل مستندات XML أكثر من 40x أسرع من الحساء الجميل واستخداماته ذاكرة أقل بنسبة 80%.

فيما يلي مثال لاستخدام LXML لاستخراج معلومات المنتج من موقع التجارة الإلكترونية:

from lxml import html

root = html.parse(page)

# XPath query to extract product attributes
for product in root.xpath(‘//div[@class="product"]‘):

  name = product.xpath(‘.//h2[@class="name"]/text()‘)[0]
  description = product.xpath(‘.//div[@class="description"]/text()‘)[0]
  price = product.xpath(‘.//span[@class="price"]/text()‘)[0]

  print(name, description, price)

يدعم LXML تحليل كل من HTML وXML، ويوفر محدد CSS، ودعم XPath، وXSLT لاستخراج البيانات.

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

أتمتة المتصفح: الزحف إلى مواقع جافا سكريبت

لا تعد طلبات HTTP التقليدية وتحليل HTML كافية لمواقع الويب التي تعتمد بشكل كبير على JavaScript لعرض المحتوى. بعض الأمثلة تشمل:

  • تطبيقات الصفحة الواحدة (SPA) مثل Gmail وTwitter
  • تقوم المواقع بتحميل البيانات ديناميكيًا عبر طلبات AJAX
  • الصفحات التي تستخدم أطر عمل JavaScript مثل React وAngular

في هذه الحالات، تحتاج إلى تنفيذ JavaScript في متصفح حقيقي للسماح بتحميل محتوى الصفحة بالكامل. لدى Python مكتبات رائعة لأتمتة المتصفحات، مثل Selenium وPlaywright.

السيلينيوم: أداة أتمتة المتصفح الحالي

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

فهو يسمح لك بالتحكم في متصفحات الويب مثل Chrome وFirefox وSafari برمجيًا. بعض الأمثلة على الإجراءات التي يمكنك القيام بها:

  • انتقل إلى الصفحات
  • انقر فوق الأزرار والروابط
  • ملء وتقديم النماذج
  • قم بتمرير الصفحة
  • خذ لقطات
  • التقاط لقطات HTML
  • تأكيد محتوى الصفحة

كل ذلك من واجهة بايثون سهلة.

فيما يلي كيفية استخدام السيلينيوم لتسجيل الدخول إلى موقع واستخراج البيانات الخاصة:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
driver.get("https://example.com")

driver.find_element(By.NAME, ‘username‘).send_keys(‘myuser‘) 
driver.find_element(By.NAME, ‘password‘).send_keys(‘secret‘)
driver.find_element(By.ID, ‘login‘).click()

# Wait for dashboard page to load
WebDriverWait(driver, 10).until(EC.title_contains("Dashboard")) 

print(driver.find_element(By.ID, ‘apiKey‘).text)

driver.quit() 

فيما يلي بعض الإحصائيات الرئيسية حول استخدام السيلينيوم:

  • يتم تنفيذ أكثر من 500,000 اختبار للسيلينيوم يوميًا على BrowserStack وحده
  • 6.5 مليون سؤال متعلق بالسيلينيوم على StackOverflow
  • أكثر من 100,000 نجم من السيلينيوم على GitHub

ومع ذلك، فإن السيلينيوم لديه بعض نقاط الألم:

  • الاختبارات الهشة عرضة للاختراق عبر إصدارات المتصفح
  • يتطلب انتظار عناصر الصفحة والمهلات معالجة خاصة
  • تحديات إدارة برامج التشغيل والمتصفحات عبر البيئات
  • عمل إضافي للتسجيل وإعداد التقارير والموازاة

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

الكاتب المسرحي: خليفة الجيل القادم للسيلينيوم

Playwright هي مكتبة جديدة لاختبار المتصفح والأتمتة تم تطويرها بواسطة Microsoft. فهو يوفر واجهة برمجة تطبيقات أكثر موثوقية وكفاءة وأسهل من السيلينيوم.

بعض المزايا الرئيسية للكاتب المسرحي:

  • الانتظار التلقائي للعناصر قبل التفاعل - لا مزيد من مهلة تحديد المواقع غير المستقرة!
  • انتظار تلقائي موثوق به لتحميل الصفحات - الكاتب المسرحي ينتظر الشبكة في وضع الخمول، متجنبًا ظروف السباق.
  • تم تعطيل أمان الويب – تحميل الصفحات بشكل صحيح دون الكشف عن الأتمتة.
  • واجهة برمجة تطبيقات كاملة الميزات - سياقات المتصفح، والعمال، ومحاكاة الهاتف المحمول المضمنة.
  • قابلية كبيرة للتصحيح - يتضمن تصور حركة الماوس، والتقاط لقطة الشاشة، وتصحيح الأخطاء خطوة بخطوة.
  • عبر دعم المتصفح - يعمل عبر Chromium وFirefox وWebKit باستخدام واجهة برمجة تطبيقات متسقة.

إليك كيف يبدو مثال تسجيل الدخول باستخدام Playwright:

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
  browser = p.chromium.launch()
  page = browser.new_page()  

  page.goto("https://example.com")
  page.type("#username", "myuser")
  page.type("#password", "secret")
  page.click("#login")
  page.wait_for_load_state(‘domcontentloaded‘) 

  print(page.text_content(‘#apiKey‘))

  browser.close()

أكثر قوة وموثوقية بكثير! يقدم Playwright أيضًا معالجات مدمجة رائعة لما يلي:

  • لقطات الشاشة ومقاطع الفيديو والتتبع وسجلات وحدة التحكم
  • محاكاة المحمول واختبار الاستجابة
  • التلاعب بالشبكة، والتخزين المؤقت، والاختناق
  • إدارة سياق المتصفح
  • أبنية متعددة الصفحات والعاملين

لهذه الأسباب، أقترح استخدام Playwright بدلاً من السيلينيوم في معظم حالات استخدام أتمتة المتصفح اليوم.

أطر عمل قوية للزحف على نطاق واسع

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

Scrapy: إطار عمل تجريف الويب الثقيل

إذا كنت بحاجة إلى الزحف إلى آلاف أو ملايين الصفحات عبر مواقع الويب الكبيرة، فإن Scrapy هو أهم توصياتي.

بعض المزايا الرئيسية:

  • برامج الزحف غير المتزامنة - يتعامل Scrapy مع طلبات الصفحات غير المتزامنة والزحف ومعالجة البيانات.
  • أدوات استخراج قوية – محركات استعلام CSS و XPath لتحليل الصفحات.
  • خطوط أنابيب البند - تخزين البيانات النظيفة وهندسة المعالجة.
  • الاختناق والتخزين المؤقت - أدوات مدمجة للامتثال لتأخيرات الزحف وملف robots.txt.
  • التحجيم - دعم الزحف الموزع لتدفقات البيانات الضخمة.

فيما يلي مثال لفئة Spider للزحف إلى HackerNews:

import scrapy

class HackerNewsSpider(scrapy.Spider):

  name = ‘hackernews‘

  def start_requests(self):
    yield scrapy.Request(‘https://news.ycombinator.com/‘, callback=self.parse)

  def parse(self, response):
    for post in response.css(‘.athing‘):
      yield {
        ‘title‘: post.css(‘.titlelink::text‘).get(),
        ‘votes‘: post.css(‘.score::text‘).get()
      }

وفقًا لمعيار Crawl.be، يمكن لـ Scrapy التخلص من الأشياء 175 صفحة في الثانية لكل الزاحف. ومع الزحف الموزع، تم استخدامه لاستخراج تيرابايت من البيانات من المواقع الضخمة.

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

شبكة السيلينيوم: أتمتة المتصفح القابلة للتطوير

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

تتكون البنية من ثلاثة مكونات:

  • محور السيلينيوم – محور مركزي لتوزيع الاختبارات على العقد
  • العقدة - مثيل السيلينيوم متصل بالمركز الذي يجري الاختبارات
  • اختبار - منطق الاختبار الخاص بك الذي يعمل على العقد

هندسة شبكة السيلينيوم

لتشغيل شبكة بسيطة:

# On main host 
java -jar selenium-server-standalone.jar -role hub

# On each node 
java -Dwebdriver.chrome.driver=chromedriver -jar selenium-server-standalone.jar -role node -hub <hubIp:port>

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

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

المتصفحات بدون رأس: تنفيذ جافا سكريبت خفيف الوزن

توفر المتصفحات مقطوعة الرأس دعم JavaScript دون كل النفقات العامة لإدارة واجهة مستخدم المتصفح. بعض الخيارات الأفضل هي:

  • الكاتب المسرحي و عنصر السيلينيوم يمكن تشغيله في وضع مقطوع الرأس خفيف الوزن.
  • منشق يقدم تجريدًا بسيطًا للمتصفح بالإضافة إلى السيلينيوم أو الكاتب المسرحي أو الطلبات الأولية.
  • محرك Pyppeter يوفر واجهة Python للتحكم في مكتبة Chrome Puppeteer مقطوعة الرأس.

على سبيل المثال، إليك كيفية تمكين وضع مقطوعة الرأس في Playwright:

from playwright.sync_api import sync_playwright

browser = playwright.chromium.launch(headless=True)

يمكنك الآن تنفيذ JavaScript، وعرض صفحات الويب، وإنشاء لقطات شاشة، واستخراج HTML - كل ذلك دون استخدام الموارد لتشغيل Chromium بشكل واضح.

بناءً على الاختبارات، تستخدم المتصفحات بدون رأس وحدة معالجة مركزية أقل بنسبة 75% وذاكرة أقل بنسبة 65% مقارنة بمتصفح Chrome أو Firefox الكامل.

بالنسبة لأحمال العمل الثقيلة، أقترح استخدام خيارات المتصفح بدون رأس. إنها توفر قوة عرض JavaScript مع حمل أقل.

ما هي مكتبة بايثون التي يجب عليك استخدامها لتجريد الويب؟

مع كل هذه الخيارات، كيف يمكنك اختيار مكتبات بايثون المناسبة لمشروع تجريف الويب؟

فيما يلي دليل سريع يعتمد على حالات الاستخدام الأكثر شيوعًا التي رأيتها:

  • طلبات HTTP الأساسية - استخدم مكتبة الطلبات.

  • الأداء مهم - HTTPX لعدم المزامنة، وLXML لتحليل HTML السريع.

  • مواقع AJAX/JS الثقيلة - اختر أتمتة متصفح Playwright أو Selenium.

  • الزحف على نطاق واسع – إطار تجريف الويب Scrapy.

  • اختبار عبر المتصفح – شبكة السيلينيوم للتوزيع.

  • عرض JS خفيف الوزن - خيارات المتصفح بدون رأس.

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

  • البساطة - حساء وطلبات جميلة
  • سرعة – جيفنت، HTTPX، LXML
  • جافا سكريبت - الكاتب المسرحي، السيلينيوم، Pyppeteer
  • حجم - مجموعات متقشرة، شبكة السيلينيوم
  • المدودية قابلى المد - البرمجيات الوسيطة والإضافات Scrapy

قم بتقييم هذه العوامل لحالة الاستخدام الخاصة بك. غالبًا ما يكون أفضل أسلوب هو الجمع بين المكتبات - على سبيل المثال، استخدام Scrapy مع Playwright وLXML.

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

القشط مدعوم من بايثون

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

فيما يلي بعض الوجبات السريعة:

  • الطلبات - طلبات HTTP البسيطة.
  • HTTPX - عميل HTTP غير المتزامن المتقدم.
  • حساء جميل – سهولة تحليل وتكرار HTML.
  • LXML – محلل HTML/XML سريع للغاية.
  • عنصر السيلينيوم - أداة أتمتة المتصفح المخضرم.
  • الكاتب المسرحي – الجيل القادم من خليفة السيلينيوم.
  • Scrapy – إطار عمل زحف الويب الثقيل.
  • شبكة السيلينيوم - اختبار المتصفح الموزع القابل للتطوير.
  • متصفحات بلا رأس – تنفيذ JS خفيف الوزن.

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

اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى! يسعدني دائمًا التحدث أكثر عن أدوات واستراتيجيات استخراج بايثون.

الانضمام إلى محادثة

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