Python + Bottle + 谷歌搜索Api 实现简单搜索引擎
1.运行环境
- python3
- centos7
2.Bottle的使用
使用bottle主要是因为它仅用python自带的库即可实现对web的搭建。
bottle源码分析
bottle使用教程
3.代码
#app.py
from bottle import route, run ,Bottle ,error ,static_file ,request
from bottle import view , template
from app import search
from data import db
import json
#import views
#实例化一个app
app = Bottle()
#读取api数据
data = db.data()
data.read()
@app.route('/')
@view("home")
def index():
"""
首页
"""
return #template('home')
@app.route('/<query>')
@view("search")
def query(query):
"""
执行查询操作:/关键词
"""
global data
key = data.touch()
res = search.query(query,key)
res = json.loads(res)
return res
@app.route('/api/<query>')
def apiQuery(query):
"""
查询接口的api,返回json数据
"""
global data
key = data.touch()
res = search.apiQuery(query,key)
#res = json.loads(res)
return res
@app.route('/man/getall')
def manGetall():
"""
获取所有api信息
"""
global data
#res = json.loads(res)
list = data.getAll()
res = ''
for i in list:
res = res + i[0] + " " + i[1] + "<br>"
print(res)
return res
@app.route('/search')
@view("search")
def query2():
"""
另一种搜索传参方式:q=关键词
"""
global data
key = data.touch()
q = request.query.q
#print(q)
res = search.query(q,key)
res = json.loads(res)
return res
@error(404)
def error404(error):
"""
404
"""
return 'Nothing here, sorry'
@app.route('/static/<filename>')
def server_static(filename):
"""
静态文件返回数据
"""
#print("***")
#filename = filename + ".ico"
return static_file(filename, root='./static')
app.run(host='localhost', port=9090)
#search.py
import urllib
import urllib.request
from urllib import parse
import json
#指定站点搜索:siteSearch
def query(q,key):
url = 'https://www.googleapis.com/customsearch/v1?cx=012564558536199079522:s1cewzl004i&safe=active&key='
q = parse.quote(q)
url = url + key + "&q=" + q
resB = urllib.request.urlopen(url)
res = resB.read().decode('utf-8')
return res
def apiQuery(q,key):
url = 'https://www.googleapis.com/customsearch/v1?cx=012564558536199079522:s1cewzl004i&safe=active&key='
q = parse.quote(q)
url = url + key + "&q=" + q
resB = urllib.request.urlopen(url)
res = resB.read().decode('utf-8')
return res
#db.py
class data:
def read(self):
fp = open("data//data.txt",encoding="utf-8")
'''
#方法一
line = fp.readline()
print(line)
key = []
i = 0
while(line):
str = line.split()
#print("***")
#print(str)
key.append(str)
line = fp.readline()
i = i + 1
self.key = key
fp.close()'''
#方法二
key = []
str = fp.read()
tmp = str.split("\n")
for i in range(len(tmp)):
key.append(tmp[i].split())
self.key = key
fp.close()
#print(key)
def write(self):
"""
保存api key
"""
key = self.key
fp = open("data//data.txt","w+")
for i in range(len(key)):
fp.writelines(key[i][0]+" "+key[i][1])
fp.close()
def touch(self):
"""
随机获取一个api key
"""
key = self.key
k = 0
for i in range(len(key)):
if(key[k][1]>key[i][1]):
k = i
x = key[k][1]
key[k][1] = (str)(1 + (int)(x))
#key[k][i] += 1
return key[k][0]
def getAll(self):
"""
获取所有api key
"""
return self.key
def add(self,list):
"""
添加api key
"""
self.key.append(list)
def delOne(self,index):
"""
删除一个 api key
"""
self.key.pop(index)
#home.tpl
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<title>冒号--www.mho.cx</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="shortcut icon" href="static/fa.ico" />
</head>
<body>
<div class="panel panel-default container navbar-static-top" style="max-width:900px;">
<div class="panel-body">
<h3 class="text-center"><a href="https://www.mho.cx">冒号搜索</a></h3>
<form class="bs-example bs-example-form container" style="max-width:800px;" role="form" method="get" action="https://mho.cx/search">
<div class="input-group">
<input type="text" class="form-control" placeholder="发现这个世界!" name="q" >
<span class="input-group-btn">
<button class="btn btn-default" type="summit">
GO!
</button>
</span>
</div>
</form>
</div>
</div>
<div class="panel panel-default container" style="max-width:900px;">
<div class="panel-body">
<img src="http://img.zcool.cn/community/010b9c57748a930000012e7e419c08.png@2o.png" style="width:100%;">
</div>
</div>
<div class="panel panel-default container navbar-static-bottom" style="max-width:900px;">
<div class="panel-body">
<h5 class="text-center"><a href="https://www.mho.cx">©2019 冒号:</a></h3>
</div>
</div>
</body>
</html>
#search.tpl
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<title>冒号:搜索->
{{queries['request'][0]['searchTerms']}}
</title>
<!-- 新 Bootstrap 核心 CSS 文件 -->
<link href="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="https://cdn.staticfile.org/jquery/2.1.1/jquery.min.js"></script>
<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="https://cdn.staticfile.org/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
<link rel="shortcut icon" href="static/fa.ico" />
</head>
<body>
<div class="panel panel-default navbar-fixed-top">
<div class="panel-heading">
<h3 class="panel-title text-center"><a href="http://www.mho.cx">冒号搜索</a></h3>
</div>
<div class="panel-body">
<form class="bs-example bs-example-form container" role="form" style="max-width:800px;" method="get" action="https://mho.cx/search">
<div class="input-group">
<input type="text" class="form-control" placeholder="发现这个世界!" name="q" value="{{queries['request'][0]['searchTerms']}}">
<span class="input-group-btn">
<button class="btn btn-default" type="summit">
GO!
</button>
</span>
</div>
</form>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title text-center"><a href="https://www.mho.cx">冒号搜索</a></h3>
</div>
<div class="panel-body">
<form class="bs-example bs-example-form container" style="max-width:800px;" role="form" method="get" action="https://mho.cx/search">
<div class="input-group">
<input type="text" class="form-control" placeholder="发现这个世界!" name="q" value="{{queries['request'][0]['searchTerms']}}">
<span class="input-group-btn">
<button class="btn btn-default" type="button">
GO!
</button>
</span>
</div>
</form>
</div>
</div>
%if queries['request'][0]['totalResults']!="0":
<div class="panel panel-default">
<div class="panel-body">
%for i in items:
<div class="well container" style="max-width:800px;">
<p>
<h4><a href="{{i['link']}}" target="_blank">{{i['title']}}</a></h4>
</p>
<p><strong>{{i['snippet']}}</strong></p>
<p>{{i['displayLink']}}</p>
</div>
%end
</div>
</div>
%else:
<div class="panel panel-default">
<div class="panel-body">
<div class="well container" style="max-width:800px;">
<p>
<h4>Sorry , no found</h4>
</p>
</div>
</div>
</div>
%end
<div class="panel panel-default container navbar-static-bottom" style="max-width:800px;">
<div class="panel-body">
<h5 class="text-center"><a href="https://www.mho.cx">©2019 冒号:</a></h3>
</div>
</div>
</body>
</html>
Python + Bottle + 谷歌搜索Api 实现简单搜索引擎的更多相关文章
- Golang 谷歌搜索api 实现搜索引擎(前端 bootstrap + jquery)
Golang 谷歌搜索api 实现搜索引擎(前端 bootstrap + jquery) 体验 冒号搜索 1. 获取谷歌搜索api 谷歌搜索api教程 2. 后台调用 程序入口 main.go // ...
- python 调用图灵机器人api实现简单的人机交互
接入流程例如以下,须要先注冊开发人员帐号,之后会得到一个32位的key,保存下来,用于以后发送数据.http://www.tuling123.com/ 请求方式 演示样例: # -*- coding: ...
- Lucene.net站内搜索—3、最简单搜索引擎代码
目录 Lucene.net站内搜索—1.SEO优化 Lucene.net站内搜索—2.Lucene.Net简介和分词Lucene.net站内搜索—3.最简单搜索引擎代码Lucene.net站内搜索—4 ...
- python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用
python操作三大主流数据库(12)python操作redis的api框架redis-py简单使用 redispy安装安装及简单使用:https://github.com/andymccurdy/r ...
- FOFA爬虫大法——API的简单利用
FOFA是一款网络空间搜索引擎,它通过进行网络空间测绘,帮助研究人员或者企业迅速进行网络资产匹配,例如进行漏洞影响范围分析.应用分布统计.应用流行度等. 何为API?如果你在百度百科上搜索,你会得到如 ...
- python重新利用shodan API
前言: 之前写过一个shodan的API调用 感觉写的不这么好.然后现在重新写一个 shodan介绍: shodan是互联网上最可怕的搜索引擎. CNNMoney的一篇文章写道,虽然目前人们都认为谷歌 ...
- Python自动化开发 - RESTful API
本节内容 1. RESTful 简介 2. RESTful 设计指南 3. Django REST Framework 最佳实践 4. 理论拓展与开放平台 5. API文档化与测试 一 R ...
- ASP.NET实现二维码 ASP.Net上传文件 SQL基础语法 C# 动态创建数据库三(MySQL) Net Core 实现谷歌翻译ApI 免费版 C#发布和调试WebService ajax调用WebService实现数据库操作 C# 实体类转json数据过滤掉字段为null的字段
ASP.NET实现二维码 using System;using System.Collections.Generic;using System.Drawing;using System.Linq;us ...
- Python基础:一起来面向对象 (二) 之搜索引擎
实例 搜索引擎 一个搜索引擎由搜索器.索引器.检索器和用户接口四个部分组成 搜索器就是爬虫(scrawler),爬出的内容送给索引器生成索引(Index)存储在内部数据库.用户通过用户接口发出询问(q ...
随机推荐
- react native 使用iconfont
安卓的配置: 1.在android/app/src/assets/fonts文件夹下复制从iconfont下载的 (下载后的icon名称可以在下载来的文件中的html文件中) 2.在android ...
- Maven项目编译版本的问题和Spring中没有导入核心包
idea中maven项目的编译: 方案1:maven的settings.xml中指定全局默认编译版本 <profile> <id>jdk-1.8</id> < ...
- 18.存储过程--SQL
好文要顶: sQL存储过程的优缺点 SQL Server 存储过程 一.创建.使用存储过程 Oracle版本: CREATE PROCEDURE MailingListCount ( ListCoun ...
- IO扩展芯片
PCF8574:一个I2C接口+INT中断引脚口扩展出一个可输出输出的并口P0~P7,INT可以用于中断响应
- Spark Mllib里使用贝氏二元分类时如何将数值特征字段用StandardScaler进行标准化(图文详解)
不多说,直接上干货! NaiveBayes数值特征字段一定要大于0,所以加入下述命令将负数转换为0. 朴素贝叶斯分类算法在进行数据标准化时,参数withMean必须设置为false. 具体,见 Had ...
- JAVA 框架之面向对象设计原则
面向对象设计原则: 单一职责原则 SRP : 一个类或者行为只做一件事 . 降低代码冗余,提高可重用性,可维护性,可扩展性,可读性 使用组合形式 里氏替换原则 LSP : 所有引用基类 ...
- SharePoint Online和SharePoint 2016 导出到Excel 表错误
导出到Excel是一个有用的SharePoint功能.偶尔您可能会遇到该功能无法正常工作的情况.有几个原因可能导致此功能无法正常工作. Problem #1 使用非32位Internet Explor ...
- LibreOJ #514. 「LibreOJ β Round #2」模拟只会猜题意
内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 给定一个长度为 nnn 的序列 AAA . 定义 f(l,r)=∑i=lrAif(l,r ...
- Angularjs 列表页面筛选
个人博客链接:http://blog.yangqiong.com.cn/angularjs-lie-biao-ye-mian-shai-xuan/ 需求:页面URL和查询结果保持一致,当筛选条件变化时 ...
- CF Gym 100637J Superfactorial numeral system (构造)
题意:给一个式子,ak,k>2时,0<=ak<k:ai都是整数,给你p,q让你求一组ak. 题解:构造,每次除掉q取整得到ai,然后减一减 #include<cstdio> ...