À l’ère numérique d’aujourd’hui, les informations sont abondantes, mais trouver les bonnes données peut être un défi. Un métamoteur de recherche regroupe les résultats de plusieurs moteurs de recherche, offrant une vue plus complète des informations disponibles. Dans cet article de blog, nous expliquerons le processus de création d'un méta-moteur de recherche simple en Python, doté de fonctionnalités de gestion des erreurs, de limitation de débit et de confidentialité.
Un métamoteur de recherche ne gère pas sa propre base de données de pages indexées. Au lieu de cela, il envoie les requêtes des utilisateurs à plusieurs moteurs de recherche, collecte les résultats et les présente dans un format unifié. Cette approche permet aux utilisateurs d'accéder à un plus large éventail d'informations sans avoir à rechercher chaque moteur individuellement.
Pour suivre ce didacticiel, vous aurez besoin de :
Tout d’abord, assurez-vous que les bibliothèques nécessaires sont installées. Nous utiliserons des requêtes pour effectuer des requêtes HTTP et json pour gérer les données JSON.
Vous pouvez installer la bibliothèque de requêtes en utilisant pip :
pip install requests
Créez un nouveau fichier Python nommé meta_search_engine.py et commencez par définir les moteurs de recherche que vous souhaitez interroger. Pour cet exemple, nous utiliserons DuckDuckGo et 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
Ensuite, créez une fonction pour interroger les moteurs de recherche et récupérer les résultats. Nous mettrons également en œuvre la gestion des erreurs pour gérer les problèmes de réseau avec élégance.
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
Pour éviter d'atteindre les limites de débit de l'API, nous allons implémenter un simple limiteur de débit à l'aide de 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)
Pour améliorer la confidentialité des utilisateurs, nous éviterons de consigner les requêtes des utilisateurs et mettrons en œuvre un mécanisme de mise en cache pour stocker temporairement les résultats.
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
Pour garantir l'unicité des résultats, nous mettrons en œuvre une fonction permettant de supprimer les doublons en fonction de l'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
Créez une fonction pour afficher les résultats de la recherche dans un format convivial.
def display_results(results): for idx, result in enumerate(results, start=1): print(f"{idx}. {result['title']}\n {result['url']}\n")
Enfin, intégrez le tout dans une fonction principale qui exécute le méta-moteur de recherche.
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()
Voici le code complet de votre méta-moteur de recherche :
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()
Félicitations! Vous avez créé un méta-moteur de recherche simple mais fonctionnel en Python. Ce projet montre non seulement comment agréger les résultats de recherche provenant de plusieurs sources, mais souligne également l'importance de la gestion des erreurs, de la limitation du débit et de la confidentialité des utilisateurs. Vous pouvez encore améliorer ce moteur en ajoutant davantage de moteurs de recherche, en implémentant une interface Web ou même en intégrant l'apprentissage automatique pour un meilleur classement des résultats. Bon codage !
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3