В сегодняшнюю цифровую эпоху информации много, но найти нужные данные может оказаться непростой задачей. Метапоисковая система объединяет результаты нескольких поисковых систем, обеспечивая более полное представление доступной информации. В этом сообщении блога мы рассмотрим процесс создания простой метапоисковой системы на Python, дополненной обработкой ошибок, ограничением скорости и функциями конфиденциальности.
Метапоисковая система не ведет собственную базу данных проиндексированных страниц. Вместо этого он отправляет пользовательские запросы в несколько поисковых систем, собирает результаты и представляет их в едином формате. Такой подход позволяет пользователям получить доступ к более широкому спектру информации без необходимости искать в каждой системе индивидуально.
Чтобы следовать этому руководству, вам понадобится:
Во-первых, убедитесь, что у вас установлены необходимые библиотеки. Мы будем использовать запросы для выполнения HTTP-запросов и json для обработки данных JSON.
Вы можете установить библиотеку запросов с помощью pip:
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()
Поздравляем! Вы создали простую, но функциональную метапоисковую систему на Python. Этот проект не только демонстрирует, как агрегировать результаты поиска из нескольких источников, но также подчеркивает важность обработки ошибок, ограничения скорости и конфиденциальности пользователей. Вы можете еще больше улучшить эту систему, добавив больше поисковых систем, внедрив веб-интерфейс или даже интегрировав машинное обучение для улучшения ранжирования результатов. Приятного кодирования!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3