用python写一个简单的中文搜索引擎

搜索引擎可以用Nutch等工具来配置,也可以自己写代码实现,作为一个小练习。
要做的搜索引擎搜索范围限定在某个新闻网站内部,和百度site:(指定网址)的功能类似。把爬虫和解析的代码改改,也可以用于其他的搜索场合。
使用的编程语言为python。
这篇文章把搜索引擎需要的步骤都讲的很清楚了:
http://073palmer.blogspot.com/2012/06/python.html
打不开的朋友可以看这个:
http://blog.sina.com.cn/s/blog_6f97247e0102vuyo.html
(转载来转载去,也不知道到底哪个才是原作者链接)

不过这篇文章里的搜索引擎是基于英文单词的,而我写的主要是中文文本。
首先放个github链接。
https://github.com/RyinSummers/AVerySimpleSearchEngine

总的来说,要达成目标,一共有如下几个步骤:

  1. 爬取这个网站,得到所有网页链接。
  2. 得到网页的源代码,解析剥离出想要的内容。
  3. 把内容做成词条索引,保存起来。我使用的是最简陋的倒排表。
  4. 搜索时,根据搜索词在词条索引里查询,按顺序返回相关的搜索结果。我使用的评价方式是最简陋的tfidf,而且tfidf值并非在建表时保存,而是在每次查询时再计算。

步骤3和4使用的方式性能有待提升,不过,因为要爬的这个网站网页数量不过万,规模较小,所以效率目前没什么影响。

开始之前,需要几点预备知识。

1.网页爬虫,python代码如下。

from urllib import request
response=request.urlopen('http://www.baidu.com')
content=response.read().decode('gb18030')
#print(content)#将会print整个网页的html源码

2.爬虫使用BFS算法,用到的数据结构为队列deque和集合set。队列存储当前准备访问的url,集合存储所有走过的url。队列使用的python代码如下。

from collections import deque
queue=deque(['队列元素1','队列元素2','队列元素3'])
queue.append('队列元素4')
queue.popleft()#队首出队
print(queue)

3.正则表达式,可以检测一个字符串是不是符合某个格式,或者把一个字符串里特定格式的部分提取出来。用于匹配html代码中的特定内容。廖雪峰网站的Python教程有介绍正则表达式,讲的很清楚:
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143193331387014ccd1040c814dee8b2164bb4f064cff000
比如,
\d匹配一个数字,
\w匹配一个字母或数字,
\s匹配一个空白符号,
.匹配任意一个字符,
\加上一个特殊符号作为转义,
*匹配零或多个字符,
+表示至少一个字符,
?表示0个或1个字符,
{n}表示n个字符,
{n,m}表示n~m个字符,
中文[\u4e00-\u9fa5]+
python代码如下。

import re
#re.match返回一个Match对象
if re.match(r'href=\".*view\.sdu\.edu\.cn.*\"','href="http://www.view.sdu.edu.cn/new/"'):
    print('ok')
else:
    print('failed')

4.BeautifulSoup,python的一个超超超好用的html解析工具包,需要额外下载安装。官方文档介绍的很清楚了。
http://beautifulsoup.readthedocs.io/zh_CN/latest/

5.用到sqlite,是python和数据库的基础知识。python代码如下。

import sqlite3
conn=sqlite3.connect('databasetest.db')
c=conn.cursor()
#创建一个表
c.execute('create table doc (id int primary key,link text)')
#往表格插入一行数据
num=1
link='www.baidu.com'
c.execute('insert into doc values (?,?)',(num,link))
#查询表格内容
c.execute('select * from doc')
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值