Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Membina Enjin Carian Meta dalam Python: Panduan Langkah demi Langkah

Membina Enjin Carian Meta dalam Python: Panduan Langkah demi Langkah

王林
王林asal
2024-08-09 18:34:30862semak imbas

Building a Meta Search Engine in Python: A Step-by-Step GuideDalam 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.

Apakah itu Enjin Carian Meta?

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.

Prasyarat

Untuk mengikuti tutorial ini, anda memerlukan:

  • Python dipasang pada mesin anda (sebaik-baiknya Python 3.6 atau lebih tinggi).
  • Pengetahuan asas pengaturcaraan Python.
  • Kunci API untuk Carian Bing (anda boleh mendaftar untuk peringkat percuma).

Langkah 1: Sediakan Persekitaran Anda

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

Langkah 2: Tentukan Enjin Carian Anda

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

Langkah 3: Laksanakan Fungsi Pertanyaan

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

Langkah 4: Laksanakan Pengehadan Kadar

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)

Langkah 5: Tambah Ciri Privasi

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

Langkah 6: Alih Keluar Pendua

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

Langkah 7: Paparkan Keputusan

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")

Langkah 8: Fungsi Utama

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()

Kod Lengkap

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()

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn