HOOOS

Flask快速上手:打造你的专属搜索网页,告别API限流烦恼!

0 14 代码搬运工小李 Flask搜索引擎APIPython网页开发
Apple

想不想拥有一个专属的搜索引擎网页?输入关键词,就能快速获取想要的信息?今天,就带你用Python的Flask框架,从零开始搭建一个简单的搜索应用!

1. 准备工作:磨刀不误砍柴工

  • 安装Python和pip: 这是基础,没有的话就去Python官网下载安装吧!
  • 安装Flask: 打开你的终端,输入 pip install Flask,一键安装,就是这么简单!
  • 选择一个搜索引擎API: 市面上有很多搜索引擎API,比如Google Search API、Bing Search API等等。选择一个适合你的,并获取API Key。注意,有些API可能需要付费才能使用。

2. 搭建Flask应用:Hello World! 的进阶

  • 创建项目目录: 比如 my_search_app,以后我们的代码都放在这里。
  • 创建 app.py 文件: 这是Flask应用的主文件,代码都在这里写。
from flask import Flask, render_template, request
import requests  # 用于发送HTTP请求
import time  # 用于处理时间

app = Flask(__name__)

# 替换成你自己的API Key
API_KEY = "YOUR_API_KEY"

# 搜索引擎API的URL,这里以一个假设的API为例
SEARCH_API_URL = "https://api.example.com/search"

# 记录API调用次数和时间
api_calls = []


def is_rate_limited(max_calls=5, time_window=60):
    """检查是否超过API调用频率限制"""
    now = time.time()
    # 移除超出时间窗口的调用记录
    api_calls[:] = [call for call in api_calls if call > now - time_window]
    # 如果调用次数超过限制,则返回True
    return len(api_calls) >= max_calls


@app.route('/', methods=['GET', 'POST'])
def index():
    results = []
    if request.method == 'POST':
        query = request.form['query']
        if query:
            if is_rate_limited():
                message = "API调用过于频繁,请稍后再试。"
                return render_template('index.html', message=message)
            else:
                try:
                    # 发送API请求
                    params = {
                        'q': query,
                        'key': API_KEY
                    }
                    response = requests.get(SEARCH_API_URL, params=params)
                    response.raise_for_status()  # 检查请求是否成功
                    data = response.json()
                    results = data.get('results', [])  # 假设API返回的JSON包含一个名为'results'的列表
                    api_calls.append(time.time())
                except requests.exceptions.RequestException as e:
                    message = f"API请求失败: {e}"
                    return render_template('index.html', message=message)
                except Exception as e:
                    message = f"处理搜索结果时发生错误: {e}"
                    return render_template('index.html', message=message)
        else:
            message = "请输入搜索关键词。"
            return render_template('index.html', message=message)

    return render_template('index.html', results=results)


if __name__ == '__main__':
    app.run(debug=True)
  • 代码解读:
    • from flask import Flask, render_template, request:导入需要的Flask模块。
    • app = Flask(__name__):创建一个Flask应用实例。
    • @app.route('/', methods=['GET', 'POST']):定义路由,/ 是根路径,支持GET和POST请求。
    • request.method == 'POST':判断请求方式是否为POST,如果是,则表示用户提交了搜索关键词。
    • request.form['query']:获取用户输入的关键词。
    • requests.get(SEARCH_API_URL, params=params):使用 requests 库发送GET请求到搜索引擎API,params 包含查询参数,比如关键词和API Key。
    • response.json():将API返回的JSON数据解析成Python字典。
    • render_template('index.html', results=results):渲染 index.html 模板,并将搜索结果传递给模板。
    • app.run(debug=True):启动Flask应用,debug=True 表示开启调试模式,方便开发。
  • 创建 templates 目录: Flask默认会从这个目录寻找模板文件。
  • 创建 templates/index.html 文件: 这是网页的模板文件,用来显示搜索框和搜索结果。
<!DOCTYPE html>
<html>
<head>
    <title>我的搜索引擎</title>
    <style>
        body {
            font-family: sans-serif;
            margin: 20px;
        }
        form {
            margin-bottom: 20px;
        }
        input[type="text"] {
            padding: 10px;
            border: 1px solid #ccc;
            border-radius: 4px;
            width: 300px;
        }
        button {
            padding: 10px 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        ul {
            list-style-type: none;
            padding: 0;
        }
        li {
            margin-bottom: 10px;
            border: 1px solid #eee;
            padding: 10px;
            border-radius: 4px;
        }
        a {
            text-decoration: none;
            color: #007bff;
        }
        .message {
            color: red;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <h1>我的搜索引擎</h1>
    <form method="post">
        <input type="text" name="query" placeholder="输入关键词">
        <button type="submit">搜索</button>
    </form>

    {% if message %}
        <p class="message">{{ message }}</p>
    {% endif %}

    <ul>
        {% for result in results %}
            <li><a href="{{ result.link }}">{{ result.title }}</a><br>{{ result.snippet }}</li>
        {% endfor %}
    </ul>
</body>
</html>
  • 代码解读:
    • <!DOCTYPE html>:声明文档类型为HTML5。
    • <title>我的搜索引擎</title>:设置网页标题。
    • <style>:定义CSS样式,美化网页显示效果。
    • <form method="post">:创建一个表单,用于提交搜索关键词。
    • <input type="text" name="query" placeholder="输入关键词">:创建一个文本输入框,用户可以在这里输入关键词。
    • <button type="submit">搜索</button>:创建一个按钮,点击后提交表单。
    • {% if message %}:判断是否有错误消息,如果有,则显示错误消息。
    • {% for result in results %}:循环遍历搜索结果,并将每个结果显示为一个列表项。
    • <a href="{{ result.link }}">{{ result.title }}</a>:创建一个链接,链接到搜索结果的URL,并显示搜索结果的标题。
    • {{ result.snippet }}:显示搜索结果的摘要。

3. 运行Flask应用:见证奇迹的时刻

  • 打开你的终端,进入项目目录 my_search_app
  • 运行命令 python app.py,启动Flask应用。
  • 打开你的浏览器,访问 http://127.0.0.1:5000/,就能看到你的专属搜索引擎网页啦!

4. 处理API调用频率限制:君子爱财,取之有道

  • 使用 time.sleep() 延时: 在每次调用API之后,使用 time.sleep(seconds) 函数暂停一段时间,避免过于频繁地调用API。这个方法简单粗暴,但效果有限。
  • 使用缓存: 将搜索结果缓存起来,下次搜索相同的关键词时,直接从缓存中获取结果,避免重复调用API。可以使用Redis、Memcached等缓存工具。
  • 使用代理IP: 通过使用代理IP,可以隐藏你的真实IP地址,避免被搜索引擎API封禁。可以使用一些免费或付费的代理IP服务。
  • 合理设计API调用逻辑: 尽量减少不必要的API调用,比如只在用户真正需要的时候才调用API,或者将多个API调用合并成一个。

在上面的代码中,我们使用了 is_rate_limited 函数来检查是否超过API调用频率限制。这个函数会记录API的调用时间和次数,如果超过了限制,则返回True,阻止API调用。

5. 美化网页显示效果:颜值即正义

  • 使用CSS样式: 通过CSS样式,可以美化网页的颜色、字体、布局等等,让网页看起来更舒服。
  • 使用Bootstrap框架: Bootstrap是一个流行的CSS框架,提供了很多现成的CSS样式和组件,可以快速搭建美观的网页。
  • 使用JavaScript交互: 通过JavaScript,可以实现一些动态效果,比如搜索结果的排序、过滤等等,提升用户体验。

在上面的 index.html 文件中,我们使用了一些简单的CSS样式来美化网页。你可以根据自己的喜好,修改这些样式,或者使用Bootstrap框架来快速搭建美观的网页。

6. 总结:从入门到入土...呸,是到精通!

通过本文的介绍,你已经学会了如何使用Flask框架搭建一个简单的搜索引擎网页。当然,这只是一个入门级的应用,还有很多可以改进的地方,比如:

  • 支持更多的搜索引擎API: 可以添加对Google Search API、Bing Search API等其他搜索引擎API的支持。
  • 实现更高级的搜索功能: 比如搜索结果的排序、过滤、分页等等。
  • 优化API调用频率限制的处理: 可以使用更高级的算法来控制API的调用频率,比如令牌桶算法、漏桶算法等等。
  • 美化网页显示效果: 可以使用更高级的CSS样式和JavaScript交互,让网页看起来更专业。

希望本文能帮助你快速入门Flask,并打造出你自己的专属搜索应用! 记住,编程的乐趣在于不断学习和探索,加油!

点评评价

captcha
健康