如何使用python写一个搜索引擎,该项目常用于毕业设计
优采云 发布时间: 2021-07-25 04:12如何使用python写一个搜索引擎,该项目常用于毕业设计
文章directory
前言
随着互联网和宽带上网的普及,搜索引擎在中国应运而生,并越来越深入到人们的日常生活中。在互联网普及之前,人们首先想到的是拥有大量书籍和资料的图书馆。但是今天,很多人会选择更方便、快捷、全面、准确的访问方式——互联网。帮助我们在整个互联网上快速找到目标信息的搜索引擎越来越受到重视。
今天学长来给大家介绍一下如何用python写一个搜索引擎,这个项目经常用于毕业设计
1.Realize 1.1 系统架构
搜索引擎有五个基本模块,分别是:
本设计研究是如何构建一个完整的基于信息处理和分析的中文搜索引擎。
因此该系统主要由以下详细部分组成:
1.2 爬取大量网络数据
要爬取数据,实际使用爬虫。
我们平时浏览网页的时候,在浏览器中输入一个网址,然后回车,我们会看到一些网站的页面,那么这个过程其实就是浏览器请求一些服务器然后我们从服务器,然后我们看到了这个网页。
请求就是使用程序来实现上述过程,需要编写代码模拟浏览器向服务器发起请求,然后获取这些网页资源。一般来说,实际获取到的这些网页资源都是一串HTML代码,其中收录HTML标签,以及一些浏览器可以看到的文字。然后我们要提取的一些数据收录在这些 HTML 文本中。接下来我们要做的就是从这些文本中提取我们想要的一些信息(比如一段、一个手机号码、一段文本等),这就是我们提取的一个过程。提取后,我们将提取的信息存储在数据库或文本中。这是完成一个数据采集的过程。
我们写好程序后,让它一直运行,它可以代替我们的浏览器向服务器发送请求,然后不停地循环运行,批量获取大量数据。这是爬虫的一个基本流程。
一个通用的网络爬虫框架如图所示:
这里有一个爬虫爬取网站和你感兴趣的内容,并以固定格式保存:
# encoding=utf-8
# 导入爬虫包
from selenium import webdriver
# 睡眠时间
import time
import re
import os
import requests
# 打开编码方式utf-8打开
# 睡眠时间 传入int为休息时间,页面加载和网速的原因 需要给网页加载页面元素的时间
def s(int):
time.sleep(int)
# html/body/div[1]/table/tbody/tr[2]/td[1]/input
# http://dmfy.emindsoft.com.cn/common/toDoubleexamp.do
if __name__ == '__main__':
#查询的文件位置
# fR = open('D:\\test.txt','r',encoding = 'utf-8')
# 模拟浏览器,使用谷歌浏览器,将chromedriver.exe复制到谷歌浏览器的文件夹内
chromedriver = r"C:\\Users\\zhaofahu\\AppData\\Local\\Google\\Chrome\\Application\\chromedriver.exe"
# 设置浏览器
os.environ["webdriver.chrome.driver"] = chromedriver
browser = webdriver.Chrome(chromedriver)
# 最大化窗口 用不用都行
browser.maximize_window()
# header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'}
# 要爬取的网页
neirongs = [] # 网页内容
response = [] # 网页数据
travel_urls = []
urls = []
titles = []
writefile = open("docs.txt", 'w', encoding='UTF-8')
url = 'http://travel.yunnan.cn/yjgl/index.shtml'
# 第一页
browser.get(url)
response.append(browser.page_source)
# 休息时间
s(3)
# 第二页的网页数据
#browser.find_element_by_xpath('// *[ @ id = "downpage"]').click()
#s(3)
#response.append(browser.page_source)
#s(3)
# 第三页的网页数据
#browser.find_element_by_xpath('// *[ @ id = "downpage"]').click()
#s(3)
#response.append(browser.page_source)
# 3.用正则表达式来删选数据
reg = r'href="(//travel.yunnan.cn/system.*?)"'
# 从数据里爬取data。。。
# 。travel_urls 旅游信息网址
for i in range(len(response)):
travel_urls = re.findall(reg, response[i])
# 打印出来放在一个列表里
for i in range(len(travel_urls)):
url1 = 'http:' + travel_urls[i]
urls.append(url1)
browser.get(url1)
content = browser.find_element_by_xpath('/html/body/div[7]/div[1]/div[3]').text
# 获取标题作为文件名
b = browser.page_source
travel_name = browser.find_element_by_xpath('//*[@id="layer213"]').text
titles.append(travel_name)
print(titles)
print(urls)
for j in range(len(titles)):
writefile.write(str(j) + '\t\t' + titles[j] + '\t\t' + str(urls[j])+'\n')
s(1)
browser.close()
1.3 中文分词
中文分词可以使用jieba库
jieba 是一个基于 Python 的中文分词工具。对于一段较长的文本,其分词原理大致可以分为三个步骤:
1. 先用正则表达式将中文段落粗略划分成句子。
2.将每个句子构造成一个有向无环图,然后找到最佳分割方案。
3.最后,对于连续词,再用HMM模型进行划分。
jieba 分词分为“默认模式”(cut_all=False)、“完整模式”(cut_all=True)和搜索引擎模式。对于“默认模式”,还可以选择是否使用HMM模型(HMM=True,HMM=False)。
1.4 相关性排名
已根据用户输入获取相关 URL 数据。
获取的数据中行的形式如下
[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3…),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3…)]
列表的每个元素都是一个元组,每个元素的内容就是urlid和每个关键词在文档中的位置。
wordids的形式为[wordid1, wordid2, wordid3...],即每个关键词对应的word id
我们将介绍几种排名算法。所谓排名,就是按照自己的规则给每个环节打分,得分越高越好。并且最后我们会综合运用几种排名算法给出最终排名。既然要综合利用,就要先实现各个算法。综合利用会遇到几个问题。
1、各个排名算法的评分机制不同,给出的评分尺度和意义也不同
2、如何综合使用,要考虑各个算法的效果。给予好的结果更大的权重。
我们先来考虑第一个问题,如何消除每个评分算法给出的评分尺度和含义不同的问题。
第二个问题,等所有的算法都研究完了再考虑。
简单,使用归一化将每个分值缩放到 0-1,1 代表最高,0 代表最低。
有几种排序算法用于对爬取的数据进行排序:
第一个排序算法:一个根据词位打分的函数
我们可以想到用户输入的多个关键词。在文档中,这些关键词的位置尽可能早地出现。比如我们经常习惯在文章前面加一些抽象的、笼统的描述。
<p> # 根据单词位置进行评分的函数.
# rows是[(urlid1,wordlocation1_1,wordlocation1_2,wordlocation1_3...),(urlid2,wordlocation2_1,wordlocation2_2,wordlocation2_3...)]
def locationscore(self,rows):
locations=dict([(row[0],1000000) for row in rows])
for row in rows:
loc=sum(row[1:]) #计算每个链接的单词位置总和,越小说明越靠前
if loc