一、需求分析
该程序使用python语言实现利用爬虫代码爬取网站链接信息,将网站中文词语通过结巴分词进行分割,并存储爬取的数据信息,利用结巴分词库处理输入框用户输入的词语,进行搜索,通过链接评价函数,优先显示评分较高的链接;设计简单的html页面,实现可视化搜索功能。
二、概要设计
1、模块设计
爬虫模块spyder.py——爬取给定网页的子链接,存储数据到.db文件中
搜索模块searchengine.py——定义搜索引擎类,需要根据用户搜索的字符串分割成多个关键词,再根据三种评判算法综合评价各个链接,查询相关链接,并实现网页的建立
搜索引擎主页面fflask.html——主页面的设计
搜索引擎副页面search.html——搜索结果页面的设计
2、各模块间的调用关系
爬虫模块是给定需要爬取的链接后事先建立好的,该程序中实例爬取'https://leetcode.cn'网页的子网页,建立相关数据库。调用搜索引擎主页面,输入关键词后会调用搜索模块搜索相关链接,之后跳转到搜索引擎的显示页面,完成一次搜索。
三、详细设计
1、搜索引擎类实现
定义searcher类设计搜索引擎的函数,包括以下功能:
(1)初始化操作,连接数据库,打开游标执行sql操作;析构函数,关闭游标和数据库连接。
def __init__(self,dbname):
#self.con=sqlite3.connect(dbname) #连接数据库
self.con = sqlite3.connect(dbname, timeout=10, check_same_thread=False)
self.curs=self.con.cursor()#游标来执行 sql 命令
def __del__(self):
self.curs.close()
self.con.close()
(2)根据数据库查询字符串,返回单词、链接、出现位置三者的对应信息;将字符串进行jieba分词,返回分词后的数组。
(3)三种评价函数:
1、根据单词频度进行评价,认为单词在链接中出现次数较多,则该链接与该单词相关度较高。
def frequencyscore(self,rows):
counts=dict([(row[0],0) for row in rows]) #键值对字典dict
for row in rows:
counts[row[0]]+=100 #统计每个链接中出现的组合数目
maxrank = max( counts.values())
for urlid in counts:
counts[urlid] /= maxrank # 归一化
counts[urlid]*=100
print(counts)
return counts
2、根据单词出现位置进行评价,因为有时候单词出现次数并不能代表相关性就一定高,因为可能是无效、冗杂的信息,而单词位置出现越靠前,越具有概括性,视为相关度越高;
def locationscore(self,rows):
locations=dict([(row[0],0) for row in rows])
#位置评定权值初始化为0,找到最靠前位置,200/loc得到权值
for row in rows:
loc=sum(row[1:])
if 200/loc>locations[row[0]]:
locations[row[0]]=200/loc
maxrank = max( locations.values())
for urlid in locations:
locations[urlid] /= maxrank # 归一化
locations[urlid]*=100
print(locations)
return locations
3、利用pagerank算法评价,利用指向该链接的链接数目进行评价(仅计算回指数目),每个链接的pagerank=指向此链接的网页的pagerank/网页中的链接总数*0.85+0.15,其中0.85表示阻尼因子,表示网页是否点击该网页中的链接。pagerank算法是离线迭代计算,形成每个链接的稳定pagerank值。iterations为迭代计算的次数。
def pagerankscore(self, rows):
pageranks = dict(
[(row[0], self.curs.execute('select score from pagerank where urlid=%d' % row[0]).fetchall()[0][0]) for row
in rows])
maxrank = max(pageranks.values()) # 求最大的pagerank值
for urlid in pageranks:
pageranks[urlid] /= maxrank # 归一化
pageranks[urlid]*=100
print(pageranks)
return pageranks # 返回归一化的url的pagerank
综合利用三个评价函数,得出最终算出的权值。
2、页面设计
(1)创建一个网页,添加具体功能:
#创建一个网页
app=Flask(__name__)
#装饰器 给函数新增功能 ‘/’路由
@app.route('/')
def index():
return render_template('fflask.html')
@app.route('/s')
def search():
keyword=request.args.get('wd')
print(keyword)
docs =mysearcher.query(keyword)
terms = list(jieba.cut_for_search(keyword))
print(terms)
print(docs)
result = docs
return render_template('search.html', docs=result, value=keyword, length=len(docs))
(2)设计搜索主页面
添加html中的输入框、标题、按钮、图片背景、路由等功能,主要实现供用户输入关键词并提交关键词的功能。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>我的搜索引擎</title>
<style>
#all{
margin:10px auto;
width:500px; /* 必须制定宽度 */
height:200px;
}
#box{
width:5000px;
height:3000px;
background-repeat:no-repeat;
#background-image:url('https://tse3-mm.cn.bing.net/th/id/OIP-C.4JF-gbky8ahr5GoSx-YaTgHaEK?w=329&h=185&c=7&r=0&o=5&dpr=1.3&pid=1.7');
}
</style>
</head>
<body style="background-image: url('https://tse2-mm.cn.bing.net/th/id/OIP-C.4LCXZorbgMemLxN-jA0gxQHaPj?w=115&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7'); background-size: 100%; background-attachment: fixed;background-repeat:no-repeat;">
<div id="all">
<form action="/s" method="get">
<img src="https://www.iconninja.com/files/624/1019/808/2-traffic-icon.png"><h1 style="color:green"> Search Engine</h1>
<br><input type="text" name="wd">
<input type="submit" value="提交">
</form>
</div>
</body>
</html>
(3)结果显示页面
主要实现根据搜索结果显示链接信息的功能。
<!doctype html>
<html ng-app="app">
<head>
<meta charset="UTF-8">
<title>搜索</title>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="http://libs.baidu.com/bootstrap/3.0.3/css/bootstrap.min.css" rel="stylesheet">
</head>
<body ng-controller="ctrl" style="background-image: url('https://tse2-mm.cn.bing.net/th/id/OIP-C.4LCXZorbgMemLxN-jA0gxQHaPj?w=115&h=180&c=7&r=0&o=5&dpr=1.3&pid=1.7'); background-size: 100%; background-attachment: fixed;background-repeat:no-repeat;">
<div class="container">
<br>
<br>
<form class="form-inline" method="get" action="/s">
<div class="form-group">
<input type="text" style="height: 40px; width: 360px;" class="form-control" ng-model="query"
value="{{ value }}" name="wd" id="query"/>
</div>
<input class="btn btn-small btn-success" role="button" type="submit" value="搜一下" id="btn">
</form>
<br>
<br>共有{{ length }}条结果
<br>
<div id="box">
{% for doc in docs %}
<p><a href="{{ doc[0] }}" target="_blank">{{ doc[1]|safe }}</a></p>
<p>来源:{{ doc[0] }}</p>
<br>
{% endfor %}
</div>
</div>
</body>
</html>
3、主函数
给定需要爬取的服务器,建立数据库,如果该数据库已经存在则跳过爬取的过程,搜索引擎类的spyder读取数据库,运行搜索引擎页面。以下示例爬取力扣页面。
if __name__ == '__main__':
# 爬取服务器建立数据库 爬取下面网页
url = 'https://leetcode.cn'
if os.path.exists('leetcode.db'):
i=0
else:
spyder.crawlerhost(url, url, 'leetcode.db')
# 读取数据库
spyder.readdb('leetcode.db')
mysearcher= searcher('leetcode.db') #搜索引擎
#输入搜索词
app.run()
四、测试结果
测试输入关键词“题库”,在站内搜索相关内容,页面及数据显示如下:
五、学习参考
该课设部分设计参考学习于:
python数据挖掘案例系列教程——python实现搜索引擎_nn.searchnet是什么意思python中-CSDN博客使用Python实现简单的搜索引擎,完整源码_python搜索引擎代码csdn-CSDN博客文章来源:https://www.toymoban.com/news/detail-818361.html
感谢观看!!!欢迎学习交流文章来源地址https://www.toymoban.com/news/detail-818361.html
到了这里,关于【数据结构课程设计】简单搜索引擎系统的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!