Im heutigen digitalen Zeitalter gibt es reichlich Informationen, aber die Suche nach den richtigen Daten kann eine Herausforderung sein. Eine Metasuchmaschine fasst die Ergebnisse mehrerer Suchmaschinen zusammen und bietet so einen umfassenderen Überblick über die verfügbaren Informationen. In diesem Blogbeitrag gehen wir durch den Prozess der Erstellung einer einfachen Metasuchmaschine in Python, komplett mit Fehlerbehandlung, Ratenbegrenzung und Datenschutzfunktionen.
Eine Metasuchmaschine verwaltet keine eigene Datenbank mit indizierten Seiten. Stattdessen sendet es Benutzeranfragen an mehrere Suchmaschinen, sammelt die Ergebnisse und präsentiert sie in einem einheitlichen Format. Dieser Ansatz ermöglicht Benutzern den Zugriff auf ein breiteres Spektrum an Informationen, ohne jede Suchmaschine einzeln durchsuchen zu müssen.
Um diesem Tutorial folgen zu können, benötigen Sie:
Stellen Sie zunächst sicher, dass Sie die erforderlichen Bibliotheken installiert haben. Wir verwenden Anfragen für HTTP-Anfragen und JSON für die Verarbeitung von JSON-Daten.
Sie können die Anforderungsbibliothek mit pip installieren:
pip install requests
Erstellen Sie eine neue Python-Datei mit dem Namen meta_search_engine.py und definieren Sie zunächst die Suchmaschinen, die Sie abfragen möchten. Für dieses Beispiel verwenden wir DuckDuckGo und 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
Als nächstes erstellen Sie eine Funktion, um die Suchmaschinen abzufragen und Ergebnisse abzurufen. Wir werden auch eine Fehlerbehandlung implementieren, um Netzwerkprobleme reibungslos zu verwalten.
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
Um zu verhindern, dass API-Ratenlimits erreicht werden, implementieren wir einen einfachen Ratenbegrenzer mit 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)
Um den Datenschutz der Benutzer zu verbessern, vermeiden wir die Protokollierung von Benutzeranfragen und implementieren einen Caching-Mechanismus, um Ergebnisse vorübergehend zu speichern.
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
Um sicherzustellen, dass die Ergebnisse eindeutig sind, implementieren wir eine Funktion zum Entfernen von Duplikaten basierend auf der 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
Erstellen Sie eine Funktion, um die Suchergebnisse in einem benutzerfreundlichen Format anzuzeigen.
def display_results(results): for idx, result in enumerate(results, start=1): print(f"{idx}. {result['title']}\n {result['url']}\n")
Abschließend alles in eine Hauptfunktion integrieren, die die Metasuchmaschine ausführt.
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()
Hier ist der vollständige Code für Ihre Metasuchmaschine:
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()
Glückwunsch! Sie haben eine einfache, aber funktionale Metasuchmaschine in Python erstellt. Dieses Projekt zeigt nicht nur, wie Suchergebnisse aus mehreren Quellen aggregiert werden, sondern betont auch die Bedeutung der Fehlerbehandlung, der Ratenbegrenzung und des Datenschutzes der Benutzer. Sie können diese Engine weiter verbessern, indem Sie weitere Suchmaschinen hinzufügen, eine Webschnittstelle implementieren oder sogar maschinelles Lernen integrieren, um das Ergebnisranking zu verbessern. Viel Spaß beim Codieren!
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3