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

كيفية كشط بحث Algolia

فيما يلي مقال مدونة يحتوي على أكثر من 2000 كلمة حول "كيفية حذف بحث Algolia":

المُقدّمة

Algolia هي واجهة برمجة تطبيقات بحث شائعة تعمل على تشغيل وظيفة البحث للعديد من مواقع الويب عبر الإنترنت. فهو يسمح لمواقع الويب بتنفيذ بحث سريع وملائم دون الحاجة إلى تشغيل بنية أساسية معقدة للبحث بنفسها.

تتضمن بعض الأمثلة على مواقع الويب الشهيرة التي تستخدم Algolia ما يلي:

  • رديت
  • متوسط
  • GitHub جيثب:
  • ستاكوفيرفلوو
  • HackerNews

الهدف من هذه التدوينة هو توضيح:

  1. ما هو الغوليا وكيف يعمل
  2. كيفية استخراج نتائج بحث Algolia باستخدام Python
  3. تقنيات لكشط الغوليا بكفاءة على نطاق واسع
  4. كيفية تجنب التعرض للحظر أثناء تجريف Algolia

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

ما هو ألغوليا؟

Algolia عبارة عن واجهة برمجة تطبيقات بحث مستضافة توفر خدمات مثل الفهرسة والبحث والتوصيات. ويُشار إليه غالبًا باسم موفر خدمة البحث كخدمة (SaaS).

تتضمن مقترحات القيمة الرئيسية لشركة Algolia ما يلي:

  • بحث سريع - تدعي Algolia أنها قادرة على البحث في مليارات السجلات في أقل من 100 مللي ثانية. يعد هذا أسرع من إجراء البحث على البنية التحتية الخاصة بك.

  • البحث ذات الصلة - تتعامل Algolia مع أشياء مثل التسامح مع الأخطاء المطبعية والمرادفات والتعلم بناءً على سلوك المستخدم لإرجاع النتائج الأكثر صلة.

  • خدمة مستضافة – تهتم Algolia بأشياء مثل القياس والتكرار. لا توجد بنية تحتية يمكنك إدارتها.

  • الوصول إلى واجهة برمجة التطبيقات – يمكن الوصول إلى وظيفة البحث عبر واجهة برمجة التطبيقات (API) التي تتيح سهولة التكامل في مواقع الويب وتطبيقات الهاتف المحمول وما إلى ذلك.

توفر Algolia مكتبات عملاء لمعظم اللغات والأطر الرئيسية التي تتعامل مع اتصالات API. على الواجهة الأمامية، يضيف المطورون كود JavaScript للتفاعل مع واجهة برمجة تطبيقات Algolia.

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

كشط بحث Algolia باستخدام بايثون

الآن بعد أن فهمنا ما هو Algolia، دعونا نلقي نظرة على كيفية استخراج نتائج بحث Algolia باستخدام بايثون.

يعتبر تجريف Algolia أمرًا مباشرًا نظرًا لأن واجهة برمجة التطبيقات (API) عامة وموثقة. نحن ببساطة بحاجة إلى:

  1. تحديد نقطة نهاية API والمعلمات
  2. استخراج أي مفاتيح الوصول
  3. إرسال طلبات البحث وتحليل استجابة JSON

دعنا نستعرض مثالًا كاملاً لاستخراج موقع ويب يعمل بنظام Algolia.

العثور على نقطة نهاية API

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

على سبيل المثال ، في HackerNews نرى طلبًا مقدمًا إلى:

https://hn.algolia.com/api/v1/search?query=python

/api/v1/search يوضح المسار أن هذه هي واجهة برمجة تطبيقات بحث Algolia. نرى أيضًا مصطلح البحث python تم تمريرها كمعلمة استعلام.

من خلال التحقق من الاستجابة، يمكننا أن نرى أنها تُرجع JSON مع النتائج. نحن نعرف الآن نقطة نهاية API ومعلمة البحث المطلوب استخدامها.

الحصول على مفاتيح API

بعد ذلك، نحتاج إلى الحصول على مفتاح API المطلوب للمصادقة. عند التحقق مرة أخرى من طلب الشبكة، يمكننا أن نرى أنه تم تمريره عبر X-Algolia-API-Key رأس.

يمكننا استخراج مفتاح API هذا وإضافته إلى طلباتنا. قد تكون هناك حاجة إلى بعض الهندسة العكسية الإضافية إذا كان المفتاح غامضًا في JavaScript.

تقديم طلبات البحث

باستخدام نقطة النهاية ومفتاح API، يمكننا الآن تقديم طلبات البحث في بايثون:

import requests 

api_key = "abc123" # Extracted key 

search_url = "https://hn.algolia.com/api/v1/search"

params = {
  ‘query‘: ‘python‘,
  ‘hitsPerPage‘: 100, 
  ‘attributesToSnippet‘: [‘title:10‘]
}

headers = {
  "X-Algolia-API-Key": api_key
}

response = requests.get(search_url, params=params, headers=headers)
data = response.json()

print(data[‘hits‘])

نقوم بتقديم طلب GET إلى نقطة نهاية واجهة برمجة التطبيقات (API) لتمرير مصطلح البحث الخاص بنا، والزيارات لكل صفحة، ورأس مفتاح واجهة برمجة التطبيقات (API). تحتوي النتيجة على نتائج البحث بتنسيق JSON والتي يمكننا تحليلها ومعالجتها حسب الحاجة.

ولدينا الآن مكشطة Algolia الأساسية!

كشط صفحات إضافية

أحد القيود هو أن واجهة برمجة التطبيقات (API) تعرض فقط الصفحة الأولى من النتائج. للحصول على صفحات إضافية، نحن بحاجة لتمرير page زيادة المعلمة من 0:

# First page
params[‘page‘] = 0 

# Second page
params[‘page‘] = 1 

# Third page
params[‘page‘] = 2

لاستخراج جميع الصفحات، يمكننا تنفيذ طلبات زيادة رقم الصفحة حتى لا يتم إرجاع المزيد من النتائج.

وضع هذا معا:

from typing import Iterator

def scrape_search(search_term: str) -> Iterator[dict]:

  params = {
    ‘query‘: search_term,
    ‘hitsPerPage‘: 100,
  }

  page = 0
  while True:
    params[‘page‘] = page
    resp = requests.get(search_url, params=params, headers=headers)
    data = resp.json()

    if not data[‘hits‘]:
      break

    yield from data[‘hits‘]

    page += 1

يتكرر هذا على الصفحات ويعطي كل النتائج.

لجمع كافة النتائج:

results = []

for result in scrape_search("python"):
  results.append(result)

print(len(results))

ولدينا الآن مُرقّم صفحات كامل لاستخراج جميع نتائج بحث Algolia!

كشط Algolia على نطاق واسع

تعمل المكشطة الأساسية المذكورة أعلاه ولكنها غير مُحسَّنة للتجريف على نطاق واسع. المشكلات التي قد تواجهك:

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

دعونا نلقي نظرة على كيفية معالجة هذه المشكلات من أجل إجراء عملية تجريف قوية واسعة النطاق.

الطلبات غير المتزامنة

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

على سبيل المثال مع asyncio وحدة:

import asyncio

async def fetch_page(page):
  params[‘page‘] = page
  resp = await asyncio.to_thread(requests.get, search_url, params=params) 
  return resp.json()

async def async_scrape():
  page = 0 
  while True:
    tasks = [asyncio.create_task(fetch_page(page + i)) for i in range(10)]
    results = await asyncio.gather(*tasks)

    for data in results:
      if not data[‘hits‘]:
        return

      for hit in data[‘hits‘]:
        yield hit

    page += 10

pages = async_scrape()  

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

إعادة المحاولة والتسامح مع الخطأ

طلبات الشبكة عرضة للفشل المتقطع. يمكننا إضافة عمليات إعادة المحاولة للتعامل مع الأخطاء بأمان:

from time import sleep

async def fetch_page(page):

  for retry in range(3):

    try:
      return await asyncio.to_thread(requests.get, search_url, params=params) 
    except Exception as e:
      print(f"Error: {e}, retrying")
      sleep(1)

  print(f"Failed to fetch page {page} after {retries} retries")
  return {‘hits‘: []} # Return empty result

يؤدي هذا ببساطة إلى إعادة المحاولة حتى 3 مرات في حالة حدوث أي فشل. يمكن أيضًا إضافة تحسينات أخرى مثل التراجع الأسي.

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

من خلال إعادة المحاولة على مستويات متعددة، يمكن لأداة الكشط التعافي من الأخطاء المختلفة والاستمرار في العمل.

وكلاء الدورية

يؤدي حذف الكثير من عنوان IP واحد إلى خطر الحظر. ولمنع ذلك، يمكننا توجيه الطلبات عبر وكلاء مختلفين باستخدام وحدات مثل requests-proxy-killer:

from proxy_killer import KillerScraper

scraper = KillerScraper(use_cache=False, max_retries=3)

async def fetch_page(page):

  for retry in range(3): 
    try:
      proxy = scraper.get_proxy() # Rotate proxy
      resp = scraper.get(search_url, proxies=proxy, params=params)
      return resp.json()
    except Exception as e:
      print(f"Error: {e}, retrying")
      sleep(1)

# Remainder same as above

من خلال توجيه كل طلب عبر عنوان IP وكيل مختلف، يمكننا استخراج البيانات على نطاق واسع دون القلق بشأن الكتل.

تتيح لنا الخطوات المذكورة أعلاه إنشاء مكشطة Algolia قوية وعالية الأداء وواسعة النطاق في لغة Python. تنطبق نفس المبادئ على أي لغة.

تجنب الكتل أثناء تجريف Algolia

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

فيما يلي بعض النصائح للتخلص من الكتل بأدب وتقليلها:

  • معدل الحد: لا تطغى على واجهة برمجة التطبيقات بمئات الطلبات المتزامنة. ابدأ صغيرًا ثم زد تدريجيًا.

  • استخدم الوكلاء: قم بتدوير عناوين IP المختلفة لتوزيع الحمل وتجنب الطلبات المركزة.

  • عشوائية وكلاء المستخدم: قم بتغيير رأس وكيل المستخدم بين الطلبات.

  • اتبع ملف robots.txt: تأكد من أن أداة الكشط لديك تتوافق مع قواعد ملف robots.txt.

  • استخدم منطق إعادة المحاولة: التراجع الأسي إذا حصلت على معدل محدود أو محظور.

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

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

مع الرعاية المناسبة، يمكنك بناء كاشطات Algolia مستدامة وطويلة الأمد. ولكن تأكد من مراقبة نهجك عن كثب وتكييفه مع مرور الوقت.

كشط المكتبات المساعدة

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

فمثلا:

  • كشط النحل - يتعامل مع الوكلاء واختبارات CAPTCHA والمتصفحات.
  • ScraperAPI – واجهة برمجة تطبيقات المتصفح مع دوران الوكيل التلقائي.
  • ProxyCrawl - وكلاء سكنيون مع متصفح مقطوعة الرأس.

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

في المخص:

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

  • توفر Algolia بحثًا مستضافًا عبر واجهة برمجة التطبيقات (API) لسهولة التكامل في المواقع.
  • واجهة برمجة تطبيقات البحث عامة ويمكن استخراجها عن طريق استخراج نقطة النهاية والمفاتيح.
  • يتطلب الكشط على نطاق واسع طلبات غير متزامنة وتناوب الوكيل.
  • راقب بعناية واكشط بأدب لتجنب الكتل.
  • يمكن لخدمات التجريف التجارية تبسيط مهام التجريف الكبيرة.

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

اسمحوا لي أن أعرف إذا كان لديك أي أسئلة أخرى!

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

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

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