Rumah > Artikel > pembangunan bahagian belakang > Membina Enjin Carian Meta dalam Python: Panduan Langkah demi Langkah
Dalam era digital hari ini, maklumat adalah banyak, tetapi mencari data yang betul boleh menjadi satu cabaran. Enjin carian meta mengagregatkan hasil daripada berbilang enjin carian, memberikan pandangan yang lebih komprehensif tentang maklumat yang tersedia. Dalam catatan blog ini, kami akan melalui proses membina enjin carian meta ringkas dalam Python, lengkap dengan pengendalian ralat, pengehadan kadar dan ciri privasi.
Enjin carian meta tidak mengekalkan pangkalan data halaman diindeksnya sendiri. Sebaliknya, ia menghantar pertanyaan pengguna ke berbilang enjin carian, mengumpul hasil dan membentangkannya dalam format bersatu. Pendekatan ini membolehkan pengguna mengakses julat maklumat yang lebih luas tanpa perlu mencari setiap enjin secara individu.
Untuk mengikuti tutorial ini, anda memerlukan:
Pertama, pastikan anda telah memasang perpustakaan yang diperlukan. Kami akan menggunakan permintaan untuk membuat permintaan HTTP dan json untuk mengendalikan data JSON.
Anda boleh memasang perpustakaan permintaan menggunakan pip:
pip install requests
Buat fail Python baharu bernama meta_search_engine.py dan mulakan dengan mentakrifkan enjin carian yang anda ingin tanya. Untuk contoh ini, kami akan menggunakan DuckDuckGo dan 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
Seterusnya, buat fungsi untuk menanyakan enjin carian dan mendapatkan hasil. Kami juga akan melaksanakan pengendalian ralat untuk mengurus isu rangkaian dengan anggun.
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
Untuk mengelakkan daripada mencapai had kadar API, kami akan melaksanakan pengehad kadar yang mudah menggunakan 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)
Untuk meningkatkan privasi pengguna, kami akan mengelak daripada merekod pertanyaan pengguna dan melaksanakan mekanisme caching untuk menyimpan hasil buat sementara waktu.
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
Untuk memastikan hasil adalah unik, kami akan melaksanakan fungsi untuk mengalih keluar pendua berdasarkan 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
Buat fungsi untuk memaparkan hasil carian dalam format yang mesra pengguna.
def display_results(results): for idx, result in enumerate(results, start=1): print(f"{idx}. {result['title']}\n {result['url']}\n")
Akhir sekali, integrasikan semuanya ke dalam fungsi utama yang menjalankan enjin carian meta.
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()
Berikut ialah kod lengkap untuk enjin carian meta anda:
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()
Tahniah! Anda telah membina enjin carian meta yang mudah tetapi berfungsi dalam Python. Projek ini bukan sahaja menunjukkan cara mengagregat hasil carian daripada berbilang sumber tetapi juga menekankan kepentingan pengendalian ralat, pengehadan kadar dan privasi pengguna. Anda boleh mempertingkatkan lagi enjin ini dengan menambahkan lebih banyak enjin carian, melaksanakan antara muka web, atau bahkan menyepadukan pembelajaran mesin untuk kedudukan hasil yang lebih baik. Selamat mengekod!
Atas ialah kandungan terperinci Membina Enjin Carian Meta dalam Python: Panduan Langkah demi Langkah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!