」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用 Python 建立元搜尋引擎:逐步指南

使用 Python 建立元搜尋引擎:逐步指南

發佈於2024-08-28
瀏覽:388

Building a Meta Search Engine in Python: A Step-by-Step Guide在当今的数字时代,信息丰富,但找到正确的数据可能是一个挑战。元搜索引擎聚合来自多个搜索引擎的结果,提供更全面的可用信息视图。在这篇博文中,我们将逐步介绍用 Python 构建一个简单的元搜索引擎的过程,包括错误处理、速率限制和隐私功能。

什么是元搜索引擎?

元搜索引擎不维护自己的索引页面数据库。相反,它将用户查询发送到多个搜索引擎,收集结果,并以统一的格式呈现它们。这种方法允许用户访问更广泛的信息,而无需单独搜索每个引擎。

先决条件

要学习本教程,您需要:

  • 您的计算机上已安装 Python(最好是 Python 3.6 或更高版本)。
  • Python编程基础知识。
  • Bing 搜索的 API 密钥(您可以注册免费套餐)。

第 1 步:设置您的环境

首先,确保您安装了必要的库。我们将使用 requests 来发出 HTTP 请求,使用 json 来处理 JSON 数据。

您可以使用pip安装requests库:

pip install requests

第 2 步:定义您的搜索引擎

创建一个名为meta_search_engine.py 的新Python 文件,并首先定义要查询的搜索引擎。在此示例中,我们将使用 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

第 4 步:实施速率限制

为了防止达到 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)

第 5 步:添加隐私功能

为了增强用户隐私,我们将避免记录用户查询并实施缓存机制来临时存储结果。

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

第 6 步:删除重复项

为了确保结果是唯一的,我们将实现一个根据 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

第 7 步:显示结果

创建一个函数,以用户友好的格式显示搜索结果。

def display_results(results):
    for idx, result in enumerate(results, start=1):
        print(f"{idx}. {result['title']}\n   {result['url']}\n")

第8步:主要功能

最后,将所有内容集成到运行元搜索引擎的主函数中。

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 构建了一个简单但实​​用的元搜索引擎。该项目不仅演示了如何聚合多个来源的搜索结果,还强调了错误处理、速率限制和用户隐私的重要性。您可以通过添加更多搜索引擎、实施 Web 界面,甚至集成机器学习以提高结果排名来进一步增强此引擎。快乐编码!

版本聲明 本文轉載於:https://dev.to/thisisanshgupta/building-a-meta-search-engine-in-python-a-step-by-step-guide-1jb8?1如有侵犯,請洽study_golang@163 .com刪除
最新教學 更多>
  • 在應用PostgreSQL限制之前,如何有效地獲取總數?
    在應用PostgreSQL限制之前,如何有效地獲取總數?
    在數據庫查詢中確定結果計數之前確定結果計數,在應用限制之前確定結果總數對於分頁至關重要。當前,一種常見的方法涉及兩次運行查詢:一次計算所有結果,並再次限制檢索所需的頁面。但是,此方法可能是效率低下的。 注意,雖然此方法提供了所需的信息,但它在計算上可能很昂貴,因為即使所有行被限制排除在外。 在選定...
    程式設計 發佈於2025-03-23
  • 如何在JavaScript對像中動態設置鍵?
    如何在JavaScript對像中動態設置鍵?
    在嘗試為JavaScript對象創建動態鍵時,如何使用此Syntax jsObj['key' i] = 'example' 1;不工作。正確的方法採用方括號: jsobj ['key''i] ='example'1; 在JavaScript中,數組是一...
    程式設計 發佈於2025-03-23
  • 如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    如何將PANDAS DataFrame列轉換為DateTime格式並按日期過濾?
    將pandas dataframe列轉換為dateTime格式示例:使用column(mycol)包含以下格式的以下dataframe,以自定義格式:})指定的格式參數匹配給定的字符串格式。轉換後,MyCol列現在將包含DateTime對象。 基於date filtering > = pd.to...
    程式設計 發佈於2025-03-23
  • 如何干淨地刪除匿名JavaScript事件處理程序?
    如何干淨地刪除匿名JavaScript事件處理程序?
    刪除匿名事件偵聽器將匿名事件偵聽器添加到元素中會提供靈活性和簡單性,但是當要刪除它們時,可以構成挑戰,而無需替換元素本身就可以替換一個問題。 element? element.addeventlistener(event,function(){/在這里工作/},false); 要解決此問題,請考...
    程式設計 發佈於2025-03-23
  • 大批
    大批
    [2 數組是對象,因此它們在JS中也具有方法。 切片(開始):在新數組中提取部分數組,而無需突變原始數組。 令ARR = ['a','b','c','d','e']; // USECASE:提取直到索引作...
    程式設計 發佈於2025-03-23
  • 。最小的範圍覆蓋K列表中的元素
    。最小的範圍覆蓋K列表中的元素
    632。最小的範圍涵蓋了k列表的元素 [2 台詞: 您在 non-decreasing Order 中的k列表。查找範圍的範圍,該範圍至少包含一個k列表中的一個數字。 我們定義範圍[a,b]小於範圍[c,d]如果b -a
    程式設計 發佈於2025-03-23
  • 為什麼mgo.findid()無法使用十六進制對象ID檢索文檔?
    為什麼mgo.findid()無法使用十六進制對象ID檢索文檔?
    在Golang中使用MONGODB操作時,開發人員可能會遇到iDID方法的問題,使用MOGO庫進行MongoDB操作時,使用MGO庫進行MONGO庫時,使用MGO Library進行MONGODB操作時,使用MGO Library進行MOGO Library時,將MOGO庫時可能會遇到ID ID的問...
    程式設計 發佈於2025-03-23
  • Android classNotFoundException:如何解決此持續活動發射問題?
    Android classNotFoundException:如何解決此持續活動發射問題?
    ,儘管執行了多個故障排除步驟,但您在啟動Android Activation時遇到了持久的ClassNotFoundExcept。此錯誤表明,儘管在清單和dex文件中列出了正確的列表,但該活動仍未得到正確的識別。 在eclipse中執行庫和應用程序項目的徹底清潔和重建。此步驟確保應用所有更改並使用...
    程式設計 發佈於2025-03-23
  • 如何使用PHP將斑點(圖像)正確插入MySQL?
    如何使用PHP將斑點(圖像)正確插入MySQL?
    essue VALUES('$this->image_id','file_get_contents($tmp_image)')";This code builds a string in PHP, but the function call fil...
    程式設計 發佈於2025-03-23
  • Java是否允許多種返回類型:仔細研究通用方法?
    Java是否允許多種返回類型:仔細研究通用方法?
    在Java中的多個返回類型:一種誤解類型:在Java編程中揭示,在Java編程中,Peculiar方法簽名可能會出現,可能會出現,使開發人員陷入困境,使開發人員陷入困境。 getResult(string s); ,其中foo是自定義類。該方法聲明似乎擁有兩種返回類型:列表和E。但這確實是如此嗎...
    程式設計 發佈於2025-03-23
  • 如何在透明區域中創建單方面的CSS3偏斜變換效果?
    如何在透明區域中創建單方面的CSS3偏斜變換效果?
    理解如何創建“ CSS3變換偏斜的一側”效果對各種Web設計項目都有用。但是,重要的是要注意的是,在使用背景圖像時,簡單地應用偏斜變換可能不會產生所需的結果。 在特定的情況下解決問題在特定情況下,您需要CSS3在維持近距離的近距離區域的一面。使用實體邊界的提供的解決方案無法有效地實現此效果。 嵌...
    程式設計 發佈於2025-03-23
  • 如何創建瀏覽器擴展程序
    如何創建瀏覽器擴展程序
    您可能正在使用浏览器扩展程序。一些扩展程序非常流行且实用,例如广告拦截器、密码管理器和 PDF 查看器。这些扩展程序(或“附加组件”)的功能并非仅限于此——您可以用它们做更多的事情!本文将向您介绍如何创建一个扩展程序。最终,我们将使其在多个浏览器中运行。 我们要制作什么 我们将制作一个名为“Red...
    程式設計 發佈於2025-03-23
  • 如何同步迭代並從PHP中的兩個等級陣列打印值?
    如何同步迭代並從PHP中的兩個等級陣列打印值?
    同步的迭代和打印值來自相同大小的兩個數組使用兩個數組相等大小的selectbox時,一個包含country代碼的數組,另一個包含鄉村代碼,另一個包含其相應名稱的數組,可能會因不當提供了exply for for for the uncore for the forsion for for ytry...
    程式設計 發佈於2025-03-23
  • 為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    為什麼Microsoft Visual C ++無法正確實現兩台模板的實例?
    在Microsoft Visual C 中,Microsoft consions用戶strate strate strate strate strate strate strate strate strate strate strate strate strate strate strate st...
    程式設計 發佈於2025-03-23
  • 如何從Google API中檢索最新的jQuery庫?
    如何從Google API中檢索最新的jQuery庫?
    從Google APIS 問題中提供的jQuery URL是版本1.2.6。對於檢索最新版本,以前有一種使用特定版本編號的替代方法,它是使用以下語法:獲取最新版本:未壓縮)While these legacy URLs still remain in use, it is recommended ...
    程式設計 發佈於2025-03-23

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3