想拥有一个专属的搜索引擎?比如只搜索技术文档、医疗报告或最新行业资讯?本文将手把手教你用Python+博查Web Search API,50行代码实现一个可定制化搜索引擎!


引言:为什么需要定制化搜索引擎?

想象以下场景:

  • 程序员小明想快速查找某开源框架的报错解决方案,但百度结果中总掺杂广告和过时博客
  • 医学研究员李教授需要精准获取最新的癌症治疗论文,但通用搜索引擎返回大量无关内容

痛点:通用搜索缺乏垂直领域优化!
解决方案:基于博查Web Search API,开发一个可定制过滤、排序、高亮的搜索引擎!


一、项目目标与核心功能

1.1 项目目标

  • 精准搜索:根据用户需求过滤无关结果
  • 灵活展示:支持分页、高亮、排序(如按时间/相关性)
  • 快速开发:无需爬虫,直接调用API

1.2 功能清单

功能 实现方式
关键词搜索 调用博查Web Search API
结果过滤 按时间范围、网站域名筛选
高亮显示 关键词标红
分页展示 前端动态加载

二、前期准备:API与环境配置

2.1 获取博查API Key

  1. 访问博查AI开放平台 → 注册账号
  2. 进入 API Key管理 → 创建密钥(形如sk-xxxxxx

2.2 安装依赖库

pip install requests flask python-dotenv
  • requests:发送HTTP请求
  • flask:搭建简易Web界面
  • python-dotenv:管理环境变量

三、API集成:搜索与数据解析

3.1 调用Web Search API

import requests
import json

def search_web(query: str, api_key: str, max_results=50) -> list:
    """调用博查API获取搜索结果"""
    url = "https://api.bochaai.com/v1/web-search"
    headers = {"Authorization": f"Bearer {api_key}"}
    payload = {
        "query": query,
        "count": max_results,
        "summary": True  # 开启摘要
    }
    
    try:
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        data = response.json()
        return data["data"]["webPages"]["value"]
    except Exception as e:
        print(f"搜索失败:{str(e)}")
        return []

参数说明

  • count:控制返回结果数量(1~50)
  • summary=True:获取更详细的文本摘要

3.2 数据解析与高亮

def highlight_keywords(text: str, keywords: list) -> str:
    """关键词高亮(支持多个关键词)"""
    for word in keywords:
        text = text.replace(word, f'<span style="color:red;">{word}</span>')
    return text

# 示例:解析并高亮结果
raw_results = search_web("深度学习框架对比", "sk-你的密钥")
processed = [{
    "title": highlight_keywords(item["name"], ["深度学习"]),
    "url": item["url"],
    "snippet": highlight_keywords(item["snippet"], ["框架"]),
    "date": item["dateLastCrawled"][:10]  # 提取日期
} for item in raw_results]

四、定制化功能实现

4.1 按时间过滤

def filter_by_date(results: list, start_date: str) -> list:
    """过滤指定日期后的结果(日期格式:YYYY-MM-DD)"""
    return [item for item in results if item["date"] >= start_date]

# 示例:仅保留2024年后的结果
filtered_results = filter_by_date(processed, "2024-01-01")

4.2 按域名屏蔽

BLACKLIST_DOMAINS = ["baidu.com", "weibo.com"]  # 自定义黑名单

def filter_blacklist(results: list) -> list:
    """屏蔽指定域名的结果"""
    return [item for item in results 
            if not any(domain in item["url"] for domain in BLACKLIST_DOMAINS)]

五、前端界面开发(Flask实现)

5.1 HTML模板(templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>定制搜索引擎</title>
    <style>
        .result { border: 1px solid #ddd; padding: 15px; margin: 10px; }
        .highlight { font-weight: bold; color: #ff4d4d; }
    </style>
</head>
<body>
    <h1>自定义搜索</h1>
    <form action="/search">
        <input type="text" name="q" placeholder="输入关键词...">
        <button type="submit">搜索</button>
    </form>
    
    {% for item in results %}
    <div class="result">
        <h3>{{ item.title|safe }}</h3>
        <a href="{{ item.url }}" target="_blank">{{ item.url }}</a>
        <p>{{ item.snippet|safe }}</p>
        <small>收录时间:{{ item.date }}</small>
    </div>
    {% endfor %}
</body>
</html>

5.2 Flask后端逻辑

from flask import Flask, render_template, request
from dotenv import load_dotenv
import os

load_dotenv()
app = Flask(__name__)
API_KEY = os.getenv("BOCHA_API_KEY")  # 从.env文件读取密钥

@app.route('/')
def index():
    return render_template('index.html', results=[])

@app.route('/search')
def search():
    query = request.args.get('q', '')
    raw_results = search_web(query, API_KEY)
    processed = [
        {
            "title": highlight_keywords(item["name"], [query]),
            "url": item["url"],
            "snippet": highlight_keywords(item["snippet"], [query]),
            "date": item["dateLastCrawled"][:10]
        } for item in raw_results
    ]
    filtered = filter_blacklist(processed)
    return render_template('index.html', results=filtered)

if __name__ == '__main__':
    app.run(debug=True)

六、项目实战与优化

运行效果

  1. 创建.env文件存储API密钥:
    BOCHA_API_KEY=sk-你的密钥
    
  2. 启动服务:
    python app.py
    
  3. 访问http://localhost:5000,搜索“Python教程”:

效果截图


七、完整项目代码

注意事项:

  • 代码文件命名为 app.py
  • app.py 所在的工作目录下新建一个文件夹:templates
  • templates 文件夹中新建 html 文件 index.html ,并复制5.1节中的代码
  • app.py 所在的工作目录下新建 .env 文件,然后在里面写入:BOCHA_API_KEY = “sk-你的密钥”
  • 最后运行 app.py ,打开http://localhost:5000,即可访问!
from flask import Flask, render_template, request
from dotenv import load_dotenv
import os
import requests
import json

BLACKLIST_DOMAINS = ["baidu.com", "weibo.com"]  # 自定义黑名单

def filter_blacklist(results: list) -> list:
    """屏蔽指定域名的结果"""
    return [item for item in results 
            if not any(domain in item["url"] for domain in BLACKLIST_DOMAINS)]

def filter_by_date(results: list, start_date: str) -> list:
    """过滤指定日期后的结果(日期格式:YYYY-MM-DD)"""
    return [item for item in results if item["date"] >= start_date]

def highlight_keywords(text: str, keywords: list) -> str:
    """关键词高亮(支持多个关键词)"""
    for word in keywords:
        text = text.replace(word, f'<span style="color:red;">{word}</span>')
    return text

def search_web(query: str, api_key: str, max_results=50) -> list:
    """调用博查API获取搜索结果"""
    url = "https://api.bochaai.com/v1/web-search"
    headers = {"Authorization": f"Bearer {api_key}"}
    payload = {
        "query": query,
        "count": max_results,
        "summary": True  # 开启摘要
    }
    
    try:
        response = requests.post(url, headers=headers, json=payload)
        response.raise_for_status()
        data = response.json()
        return data["data"]["webPages"]["value"]
    except Exception as e:
        print(f"搜索失败:{str(e)}")
        return []
    


load_dotenv()
app = Flask(__name__)
API_KEY = os.getenv("BOCHA_API_KEY")  # 从.env文件读取密钥

@app.route('/')
def index():
    return render_template('index.html', results=[])

@app.route('/search')
def search():
    query = request.args.get('q', '')
    raw_results = search_web(query, API_KEY)
    processed = [
        {
            "title": highlight_keywords(item["name"], [query]),
            "url": item["url"],
            "snippet": highlight_keywords(item["snippet"], [query]),
            "date": item["dateLastCrawled"][:10]
        } for item in raw_results
    ]
    filtered = filter_blacklist(processed)
    return render_template('index.html', results=filtered)

if __name__ == '__main__':
    app.run(debug=True)

总结

通过集成博查Web Search API,你实现了

  • 快速获取结构化数据,避免爬虫开发

同时还可以在本项目的基础上集成

  • 语义排序(Semantic Reranker)、多模态搜索等更多功能,
  • NLP模型识别同义词(如“AI”高亮“人工智能”)等,

赶快自己动手实践一下吧!


立即行动:

前往博查AI开放平台领取API Key

查看往期教程👇,构建完整RAG应用链

🔗 系列文章推荐:

《用Python玩转博查Web Search API》

《Semantic Reranker API:搜索结果智能排序》

《Dify+博查API:零代码搭建RAG应用》

让AI告别“古董知识库”,拥抱实时智能新时代!🚀

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐