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

كيفية تحويل كاشطات الويب إلى واجهات برمجة تطبيقات البيانات

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

لماذا بناء واجهة برمجة تطبيقات القشط؟

فيما يلي بعض الفوائد الأساسية لتقديم البيانات المسروقة من خلال واجهة برمجة التطبيقات:

  • معلومات الوقت الحقيقي - يمكن لواجهات برمجة التطبيقات (API) استخراج البيانات عند الطلب بدلاً من الاعتماد على الدُفعات القديمة والمخزنة مؤقتًا.

  • استعلامات مخصصة - تسمح واجهات برمجة التطبيقات (APIs) بالاستعلام المخصص عن البيانات بدلاً من مجرد تفريغ مواقع الويب بأكملها.

  • التدرجية – تتعامل واجهات برمجة التطبيقات (APIs) مع ارتفاع حركة المرور وتوسع نطاقها لآلاف المستخدمين.

  • الموثوقية - تقوم واجهات برمجة التطبيقات بإعادة محاولة الطلبات الفاشلة وتنفيذ منطق تجريف قوي.

  • مرونة - يمكن لواجهات برمجة التطبيقات (API) تنفيذ طرق مختلفة لتوصيل البيانات مثل خطافات الويب.

  • التجريد - تخفي واجهات برمجة التطبيقات منطق التجريد المعقد والبنية التحتية من مستهلكي واجهة برمجة التطبيقات.

كشط بنية API

على مستوى عالٍ، تتبع واجهة برمجة تطبيقات تجريف الويب هذه البنية:

كشط بنية API

  1. واجهة برمجة التطبيقات تتلقى الطلب
  2. مكشطة جلب البيانات
  3. يتم تخزين البيانات مؤقتًا
  4. تقوم API بإرجاع البيانات المسروقة

المكونات الرئيسية هي:

  • خادم API - يتعامل مع طلبات العملاء ويسلم البيانات المسروقة.

  • مكشطة – جلب البيانات حسب الطلب من المواقع المستهدفة.

  • مخبأ - يخزن البيانات المسروقة لتجنب الحذف الزائد.

  • قاعدة البيانات - تخزين البيانات المقطوعة بشكل اختياري للتحليل التاريخي.

لماذا نستخدم FastAPI؟

هناك العديد من أطر عمل API الممتازة. بالنسبة للكاشطات، أوصي FastAPI لان:

  • FastAPI سريع جدًا - مثالي لواجهات برمجة التطبيقات (API) لتجميع البيانات.

  • يوفر مستندات تلقائية، والتحقق من الصحة، والتسلسل، وما إلى ذلك.

  • يدعم عدم التزامن للتجريف غير المتزامن.

  • سهلة الاستخدام والتعلم. مرنة لواجهات برمجة التطبيقات الصغيرة والكبيرة.

  • يحتوي على نظام بيئي رائع لأدوات الكشط مثل httpx وparsel وما إلى ذلك.

كشط إعداد API

سنستخدم المكتبات الأساسية التالية:

  • FastAPI - إطار عمل API الخاص بنا

  • httpx – عميل HTTP غير متزامن

  • جزء – محلل HTML/XML

  • لوجورو - فائدة التسجيل

تثبيت الحزم:

pip install fastapi uvicorn httpx parsel loguru

في هذا الدليل، سنستخرج بعض بيانات الأسهم الأساسية من Yahoo Finance.

قم بإنشاء واجهة برمجة التطبيقات

لنقم بإعداد تطبيق FastAPI الأولي بنقطة نهاية واحدة:

from fastapi import FastAPI

app = FastAPI() 

@app.get("/stock/{symbol}")  
async def get_stock(symbol: str):
    return { "stock": symbol } 

تقوم واجهة برمجة التطبيقات الأساسية هذه بإرجاع رمز السهم الذي نقدمه فقط.

لنبدأ الخادم ونختبره:

uvicorn main:app --reload
import httpx

print(httpx.get("http://localhost:8000/stock/AAPL").json())

# {‘stock‘: ‘AAPL‘}

واجهة برمجة التطبيقات الخاصة بنا جاهزة لتلقي الطلبات. بعد ذلك، دعونا نجعلها تتخلص من بعض البيانات.

كشط بيانات المخزون

للحصول على بيانات السهم سنقوم بما يلي:

  1. أنشئ عنوان URL الخاص بـ Yahoo Finance من الرمز
  2. جلب صفحة HTML
  3. تحليل القيم باستخدام XPath
from parsel import Selector # for xpath parsing

async def scrape_stock(symbol: str):

    url = f"https://finance.yahoo.com/quote/{symbol}"

    async with httpx.AsyncClient() as client:
       response = await client.get(url)

    sel = Selector(response.text)

    # parse summary values 
    values = sel.xpath(‘//div[contains(@data-test,"summary-table")]//tr‘)
    data = {}
    for value in values:
        label = value.xpath("./td[1]/text()").get()
        val = value.xpath("./td[2]/text()").get()
        data[label] = val

    # parse price 
    data["price"] = sel.xpath(‘//fin-streamer[@data-symbol=$symbol]/@value‘, symbol=symbol).get()

    return data

تقوم هذه المكشطة بإرجاع قاموس يحتوي على البيانات التي تم تحليلها. لنقم بتوصيله بواجهة برمجة التطبيقات (API) الخاصة بنا:

from fastapi import FastAPI
from yahoo_finance import scrape_stock

app = FastAPI()

@app.get("/stock/{symbol}")
async def get_stock(symbol: str):
    data = await scrape_stock(symbol) 
    return data

الآن عندما نتصل بواجهة برمجة التطبيقات (API) الخاصة بنا، فسوف تجلب أحدث البيانات:

http http://localhost:8000/stock/AAPL

HTTP/1.1 200 OK
Content-Length: 340

{
  "52 Week Range": "142.00 - 182.94",
  "Beta (5Y Monthly)": "1.25", 
  "Diluted EPS (ttm)": "6.05",
  "Earnings Date": "Oct 27, 2022",
  "Ex-Dividend Date": "Aug 05, 2022",
  "Forward Dividend & Yield": "0.92 (0.59%)",
  "Market Cap": "2.44T",
  "Open": "156.76",
  "PE Ratio (ttm)": "25.60",
  "Previous Close": "153.72",
  "Price": "155.33",  
  "Volume": "53,978,024"
}

إضافة التخزين المؤقت

كشط على كل طلب هو الإسراف. دعونا نضيف التخزين المؤقت حتى نقوم فقط بكشط المخزون مرة واحدة كل 5 دقائق.

سوف نستخدم بسيطة dict لتخزين البيانات المسروقة المرتبطة برمز المخزون:

STOCK_CACHE = {} 

async def scrape_stock(symbol):

   if symbol in STOCK_CACHE:
       return STOCK_CACHE[symbol] 

   data = ... # scrape 
   STOCK_CACHE[symbol] = data

   return data

الآن ستعيد الطلبات المتكررة البيانات المخزنة مؤقتًا بدلاً من حذفها في كل مرة.

يمكننا أيضًا مسح ذاكرة التخزين المؤقت القديمة بشكل دوري:

import time

CACHE_MAX_AGE = 300 # seconds

async def clear_expired_cache():
   curr_time = time.time()
   for symbol, data in STOCK_CACHE.items():
       if curr_time - data["ts"] > CACHE_MAX_AGE:
           del STOCK_CACHE[symbol]

# run every 5 minutes   
clear_cache_task = asyncio.create_task(clear_expired_cache()) 

وهذا يضمن أن ذاكرة التخزين المؤقت لدينا لن تنمو بشكل غير محدود.

إضافة خطافات الويب

بالنسبة لمهام التجريد الطويلة، يمكننا استخدام خطافات الويب لإرجاع النتائج بشكل غير متزامن:

@app.get("/stock/{symbol}")
async def get_stock(symbol: str, webhook: str):

   if webhook:
      task = asyncio.create_task(fetch_stock(symbol, webhook))
      return {"msg": "Fetching data"}

   data = await scrape_stock(symbol)  
   return data

async def fetch_stock(symbol, url):
   data = await scrape_stock(symbol)

   async with httpx.AsyncClient() as client:
      await client.post(url, json=data)

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

يمكننا اختبار ذلك باستخدام أداة مثل Webhook.site.

تحجيم واجهة برمجة تطبيقات القشط

مع زيادة حركة المرور، إليك بعض تقنيات القياس:

  • إضافة التخزين المؤقت لواجهة برمجة التطبيقات - استخدم ذاكرة تخزين مؤقت مثل Redis لتقليل حمل التجريد.

  • تشغيل عمليات متعددة – التوسع عبر النوى/الخوادم باستخدام gunicorn.

  • تفريغ القشط - انقل الكاشطات إلى العمال مثل Celery أو RabbitMQ.

  • استخدام خدمات القشط - الاستفادة من واجهات برمجة التطبيقات (APIs) مثل Scrapfly أو ScraperAPI.

  • تحسين الكاشطات - التأكد من كفاءة الكاشطات وتجنب الحظر.

  • إضافة قواعد البيانات – تخزين البيانات المسروقة في قواعد البيانات لمزيد من التحليل.

وفي الختام

قمنا في هذا الدليل ببناء واجهة برمجة تطبيقات لاستخلاص الويب في لغة بايثون باستخدام FastAPI. الوجبات الرئيسية هي:

  • يوفر FastAPI إطارًا ممتازًا لاستخراج واجهات برمجة التطبيقات.

  • يمكننا إنشاء كاشطات لجلب البيانات عند الطلب.

  • يساعد التخزين المؤقت وخطافات الويب في التغلب على قيود الاستخراج.

  • هناك العديد من استراتيجيات التحسين والقياس مع نمو حركة المرور.

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

الوسوم (تاج):

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

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