想不想拥有一个专属的搜索引擎网页?输入关键词,就能快速获取想要的信息?今天,就带你用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,并打造出你自己的专属搜索应用! 记住,编程的乐趣在于不断学习和探索,加油!