في العصر الرقمي اليوم، تتوفر المعلومات بكثرة، ولكن العثور على البيانات الصحيحة يمكن أن يمثل تحديًا. يقوم محرك البحث التعريفي بتجميع النتائج من محركات بحث متعددة، مما يوفر رؤية أكثر شمولاً للمعلومات المتاحة. في منشور المدونة هذا، سنتعرف على عملية إنشاء محرك بحث تعريفي بسيط في Python، مكتمل بمعالجة الأخطاء وتحديد المعدل وميزات الخصوصية.
لا يحتفظ محرك البحث التعريفي بقاعدة بيانات خاصة به للصفحات المفهرسة. وبدلاً من ذلك، يرسل استعلامات المستخدم إلى محركات بحث متعددة، ويجمع النتائج ويقدمها بتنسيق موحد. يتيح هذا الأسلوب للمستخدمين الوصول إلى نطاق أوسع من المعلومات دون الحاجة إلى البحث في كل محرك على حدة.
لمتابعة هذا البرنامج التعليمي، ستحتاج إلى:
أولاً، تأكد من تثبيت المكتبات اللازمة. سنستخدم طلبات تقديم طلبات HTTP وjson للتعامل مع بيانات JSON.
يمكنك تثبيت مكتبة الطلبات باستخدام النقطة:
pip install requests
أنشئ ملف Python جديدًا باسم meta_search_engine.py وابدأ بتحديد محركات البحث التي تريد الاستعلام عنها. في هذا المثال، سنستخدم DuckDuckGo وBing.
import requests import json import os import time # Define your search engines SEARCH_ENGINES = { "DuckDuckGo": "https://api.duckduckgo.com/?q={}&format=json", "Bing": "https://api.bing.microsoft.com/v7.0/search?q={}&count=10", } BING_API_KEY = "YOUR_BING_API_KEY" # Replace with your Bing API Key
بعد ذلك، قم بإنشاء وظيفة للاستعلام عن محركات البحث واسترجاع النتائج. سنقوم أيضًا بتنفيذ معالجة الأخطاء لإدارة مشكلات الشبكة بأمان.
def search(query): results = [] # Query DuckDuckGo ddg_url = SEARCH_ENGINES["DuckDuckGo"].format(query) try: response = requests.get(ddg_url) response.raise_for_status() # Raise an error for bad responses data = response.json() for item in data.get("RelatedTopics", []): if 'Text' in item and 'FirstURL' in item: results.append({ 'title': item['Text'], 'url': item['FirstURL'] }) except requests.exceptions.RequestException as e: print(f"Error querying DuckDuckGo: {e}") # Query Bing bing_url = SEARCH_ENGINES["Bing"].format(query) headers = {"Ocp-Apim-Subscription-Key": BING_API_KEY} try: response = requests.get(bing_url, headers=headers) response.raise_for_status() # Raise an error for bad responses data = response.json() for item in data.get("webPages", {}).get("value", []): results.append({ 'title': item['name'], 'url': item['url'] }) except requests.exceptions.RequestException as e: print(f"Error querying Bing: {e}") return results
لمنع الوصول إلى حدود معدل واجهة برمجة التطبيقات (API)، سنقوم بتنفيذ محدد معدل بسيط باستخدام time.sleep().
# Rate limit settings RATE_LIMIT = 1 # seconds between requests def rate_limited_search(query): time.sleep(RATE_LIMIT) # Wait before making the next request return search(query)
لتعزيز خصوصية المستخدم، سنتجنب تسجيل استعلامات المستخدم وننفذ آلية التخزين المؤقت لتخزين النتائج مؤقتًا.
CACHE_FILE = 'cache.json' def load_cache(): if os.path.exists(CACHE_FILE): with open(CACHE_FILE, 'r') as f: return json.load(f) return {} def save_cache(results): with open(CACHE_FILE, 'w') as f: json.dump(results, f) def search_with_cache(query): cache = load_cache() if query in cache: print("Returning cached results.") return cache[query] results = rate_limited_search(query) save_cache({query: results}) return results
لضمان أن النتائج فريدة، سنقوم بتنفيذ وظيفة لإزالة التكرارات بناءً على عنوان URL.
def remove_duplicates(results): seen = set() unique_results = [] for result in results: if result['url'] not in seen: seen.add(result['url']) unique_results.append(result) return unique_results
إنشاء وظيفة لعرض نتائج البحث بتنسيق سهل الاستخدام.
def display_results(results): for idx, result in enumerate(results, start=1): print(f"{idx}. {result['title']}\n {result['url']}\n")
أخيرًا، قم بدمج كل شيء في وظيفة رئيسية تقوم بتشغيل محرك البحث التعريفي.
def main(): query = input("Enter your search query: ") results = search_with_cache(query) unique_results = remove_duplicates(results) display_results(unique_results) if __name__ == "__main__": main()
إليك الكود الكامل لمحرك البحث التعريفي الخاص بك:
import requests import json import os import time # Define your search engines SEARCH_ENGINES = { "DuckDuckGo": "https://api.duckduckgo.com/?q={}&format=json", "Bing": "https://api.bing.microsoft.com/v7.0/search?q={}&count=10", } BING_API_KEY = "YOUR_BING_API_KEY" # Replace with your Bing API Key # Rate limit settings RATE_LIMIT = 1 # seconds between requests def search(query): results = [] # Query DuckDuckGo ddg_url = SEARCH_ENGINES["DuckDuckGo"].format(query) try: response = requests.get(ddg_url) response.raise_for_status() data = response.json() for item in data.get("RelatedTopics", []): if 'Text' in item and 'FirstURL' in item: results.append({ 'title': item['Text'], 'url': item['FirstURL'] }) except requests.exceptions.RequestException as e: print(f"Error querying DuckDuckGo: {e}") # Query Bing bing_url = SEARCH_ENGINES["Bing"].format(query) headers = {"Ocp-Apim-Subscription-Key": BING_API_KEY} try: response = requests.get(bing_url, headers=headers) response.raise_for_status() data = response.json() for item in data.get("webPages", {}).get("value", []): results.append({ 'title': item['name'], 'url': item['url'] }) except requests.exceptions.RequestException as e: print(f"Error querying Bing: {e}") return results def rate_limited_search(query): time.sleep(RATE_LIMIT) return search(query) CACHE_FILE = 'cache.json' def load_cache(): if os.path.exists(CACHE_FILE): with open(CACHE_FILE, 'r') as f: return json.load(f) return {} def save_cache(results): with open(CACHE_FILE, 'w') as f: json.dump(results, f) def search_with_cache(query): cache = load_cache() if query in cache: print("Returning cached results.") return cache[query] results = rate_limited_search(query) save_cache({query: results}) return results def remove_duplicates(results): seen = set() unique_results = [] for result in results: if result['url'] not in seen: seen.add(result['url']) unique_results.append(result) return unique_results def display_results(results): for idx, result in enumerate(results, start=1): print(f"{idx}. {result['title']}\n {result['url']}\n") def main(): query = input("Enter your search query: ") results = search_with_cache(query) unique_results = remove_duplicates(results) display_results(unique_results) if __name__ == "__main__": main()
تهانينا! لقد قمت ببناء محرك بحث تعريفي بسيط ولكنه عملي في بايثون. لا يوضح هذا المشروع كيفية تجميع نتائج البحث من مصادر متعددة فحسب، بل يؤكد أيضًا على أهمية معالجة الأخطاء وتحديد المعدل وخصوصية المستخدم. يمكنك تحسين هذا المحرك بشكل أكبر عن طريق إضافة المزيد من محركات البحث، أو تنفيذ واجهة ويب، أو حتى دمج التعلم الآلي لتحسين تصنيف النتائج. برمجة سعيدة!
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3