# README
信息检索课程设计[sdu视点新闻](http://view.sdu.edu.cn/)全站爬虫爬取+索引构建+搜索引擎查询练习程序(1805)。
>爬虫功能使用Python的scrapy库实现,并用MongoDB数据库进行存储。
>
>索引构建和搜索功能用Python的Whoosh和jieba库实现。(由于lucene是java库,所以pyLucene库的安装极其麻烦,因此选用Python原生库Whoosh实现,并使用jieba进行中文分词。)
>
>搜索网页界面用django实现,页面模板套用[BootCDN](http://www.bootcdn.cn/)。
## 1 要求
以下是检索的基本要求:可以利用lucene、nutch等开源工具,利用Python、Java等编程语言,但需要分别演示并说明原理。
* 1. __Web网页信息抽取__
以山东大学新闻网为起点进行网页的循环爬取,保持爬虫在view.sdu.edu.cn之内(即只爬取这个站点的网页),爬取的网页数量越多越好。
* 2. __索引构建__
对上一步爬取到的网页进行结构化预处理,包括基于模板的信息抽取、分字段解析、分词、构建索引等。
* 3. __检索排序__
对上一步构建的索引库进行查询,对于给定的查询,给出检索结果,明白排序的原理及方法。
## 2 运行方式
* 运行`sduspider/run.py`来进行网络爬虫,这个过程将持续十多个小时,但可以随时终止,在下次运行时继续。
* 运行`indexbuilder/index_builder.py`来对数据库中的72000条数据构建索引,该过程将持续几个小时,但可以随时终止。
* 如果不熟悉Whoosh库的构建索引和query搜索功能,可以参考运行`indexbuilder/sample.py`。
* 运行`indexbuilder/query.py`来测试搜索功能。
* 运行`searchengine/run_server.py`打开搜索网页服务器,在浏览器中打开[127.0.0.1:8000](127.0.0.1:8000)进入搜索页面执行搜索。
## 3 所需python库
* scrapy
* requests
* pymongo
* whoosh
* jieba
* django
## 4 所需数据库
* MongoDB
* Mongo Management Studio 可视化工具(可选)
## 5 爬虫特性
爬虫代码位于`sduspider/`目录下。
### 5.1 爬取内容
爬虫爬取以 [http://www.view.sdu.edu.cn/info/](http://www.view.sdu.edu.cn/info/) 打头的所有新闻页面的内容,这些内容包括:
|Item|Item name|
|---|---|
|标题|newsTitle|
|链接|newsUrl|
|阅读量|newsCliek|
|发布时间|newsPublishTime|
|文章内容|newsContent|
```python
# spider.py
# 爬取当前网页
print('start parse : ' + response.url)
self.destination_list.remove(response.url)
if response.url.startswith("http://www.view.sdu.edu.cn/info/"):
item = NewsItem()
for box in response.xpath('//div[@class="new_show clearfix"]/div[@class="le"]'):
# article title
item['newsTitle'] = box.xpath('.//div[@class="news_tit"]/h3/text()').extract()[0].strip()
# article url
item['newsUrl'] = response.url
item['newsUrlMd5'] = self.md5(response.url)
# article click time
item['newsClick'] = box.xpath('.//div[@class="news_tit"]/p/span/script/text()').extract()[0].strip()
pattern = re.compile(r'\(.*?\)')
parameters = re.search(pattern, item['newsClick']).group(0)
parameters = parameters[1:-1].split(',')
parameters[0] = re.search(re.compile(r'\".*?\"'), parameters[0]).group(0)[1:-1]
parameters[1] = parameters[1].strip()
parameters[2] = parameters[2].strip()
request_url = 'http://www.view.sdu.edu.cn/system/resource/code/news/click/dynclicks.jsp'
request_data = {'clicktype': parameters[0], 'owner': parameters[1], 'clickid': parameters[2]}
request_get = requests.get(request_url, params=request_data)
item['newsClick'] = request_get.text
# article publish time
item['newsPublishTime'] = box.xpath('.//div[@class="news_tit"]/p[not(@style)]/text()').extract()[0].strip()[5:]
# article content
item['newsContent'] = box.xpath('.//div[@class="news_content"]').extract()[0].strip()
regexp = re.compile(r'<[^>]+>', re.S)
item['newsContent'] = regexp.sub('',item['newsContent']) # delete templates <>
# 索引构建flag
item['indexed'] = 'False'
# yield it
yield item
```
### 5.2 宽度优先搜索爬取
爬虫基于宽度优先搜索,对[http://www.view.sdu.edu.cn/](http://www.view.sdu.edu.cn/)区段的网址进行爬取,并将[http://www.view.sdu.edu.cn/info/](http://www.view.sdu.edu.cn/info/)区段的新闻内容提取出来。
```python
# settings.py
# 先进先出,广度优先
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeue.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeue.FifoMemoryQueue'
```
### 5.3 二分法去重
所有已经爬取过的网址都会以MD5特征的形式顺序存储在list中,当获取新的url时,通过二分法查找list中是否存在该url的特征值,以达到去重的目的。
Scrapy库自带了查重去重的功能,但为了保证效率,自行编写了二分法去重,但并未关闭scrapy库自带的去重功能。
```python
# spider.py
# md5 check
md5_url = self.md5(real_url)
if self.binary_md5_url_search(md5_url) > -1: # 二分法查找存在当前MD5
pass
else:
self.binary_md5_url_insert(md5_url) # 二分法插入当前MD5
self.destination_list.append(real_url) # 插入爬虫等待序列
yield scrapy.Request(real_url, callback=self.parse, errback=self.errback_httpbin)
```
### 5.4 断点续爬
每爬取一定次数后都会将当前爬虫状态存储在pause文件夹下,重新运行爬虫时会继续上一次保存的断点进行爬取。Scrapy有自带的断点续爬功能(在settings.py中设置),但貌似在Pycharm中行不通。
```python
# spider.py
# counter++,并在合适的时候保存断点
def counter_plus(self):
print('待爬取网址数:' + (str)(len(self.destination_list)))
# 断点续爬功能之保存断点
if self.counter % self.save_frequency == 0: # 爬虫经过save_frequency次爬取后
print('Rayiooo:正在保存爬虫断点....')
f = open('./pause/response.seen', 'wb')
pickle.dump(self.url_md5_seen, f)
f.close()
f = open('./pause/response.dest', 'wb')
pickle.dump(self.destination_list, f)
f.close()
self.counter = self.save_frequency
self.counter += 1 # 计数器+1
```
### 5.5 数据存入MongoDB
关系类数据库不适用于爬虫数据存储,因此使用非关系类数据库MongoDB。数据库可以用可视化工具方便查看,例如Mongo Management Studio。
```python
# pipelines.py
class MongoDBPipeline(object):
def __init__(self):
host = settings["MONGODB_HOST"]
port = settings["MONGODB_PORT"]
dbname = settings["MONGODB_DBNAME"]
sheetname = settings["MONGODB_SHEETNAME"]
# 创建MONGODB数据库链接
client = pymongo.MongoClient(host=host, port=port)
# 指定数据库
mydb = client[dbname]
# 存放数据的数据库表名
self.post = mydb[sheetname]
def process_item(self, item, spider):
data = dict(item)
# self.post.insert(data) # 直接插入的方式有可能导致数据重复
# 更新数据库中的数据,如果upsert为Ture,那么当没有找到指定的数据时就直接插入,反之不执行插入
self.post.update({'newsUrlMd5': item['newsUrlMd5']}, data, upsert=True)
return item
```
![Mongo Management Studio 可视化工具显示.jpg](https://i.loli.net/2018/05/24/5b065b225414c.jpg)
## 6 索引构建特性
索引构建代码位于`indexbuilder/`目录下。
### 6.1 断点续构
构建倒排索引的过程比较缓慢,每小时只能构�
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
【作品名称】:基于 python 实现的sdu新闻网站全站爬取+索引构建+搜索【课程设计】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】: 要求 以下是检索的基本要求:可以利用lucene、nutch等开源工具,利用Python、Java等编程语言,但需要分别演示并说明原理。 Web网页信息抽取 以山东大学新闻网为起点进行网页的循环爬取,保持爬虫在view.sdu.edu.cn之内(即只爬取这个站点的网页),爬取的网页数量越多越好。 索引构建 对上一步爬取到的网页进行结构化预处理,包括基于模板的信息抽取、分字段解析、分词、构建索引等。 检索排序 对上一步构建的索引库进行查询,对于给定的查询,给出检索结果,明白排序的原理及方法。 2 运行方式 运行sduspider/run.py来进行网络爬虫,这个过程将持续十多个小时,但可 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
资源推荐
资源详情
资源评论
收起资源包目录
SduViewWebSpider-master.zip (35个子文件)
SduViewWebSpider-master
searchengine
db.sqlite3 0B
run_server.py 172B
searchengine
__init__.py 0B
wsgi.py 401B
view.py 735B
urls.py 838B
settings.py 3KB
templates
result.html 883B
main.html 8KB
manage.py 544B
LICENSE 1KB
indexbuilder
__init__.py 0B
index_builder.py 4KB
sample.py 1KB
query.py 2KB
settings.py 211B
.idea
180507 SduWebSpider.iml 1KB
vcs.xml 180B
misc.xml 288B
inspectionProfiles
Project_Default.xml 370B
modules.xml 290B
encodings.xml 197B
sduspider
__init__.py 0B
scrapy.cfg 261B
run.py 167B
sduspider
__init__.py 0B
pipelines.py 2KB
spiders
__init__.py 161B
sdu_view_spider.py 8KB
items.py 534B
settings.py 4KB
middlewares.py 4KB
requirements.txt 44B
.gitignore 2KB
README.md 11KB
共 35 条
- 1
资源评论
小英子架构
- 粉丝: 1024
- 资源: 4123
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 没用333333333333333333333333333333
- 基于Vue和SpringBoot的企业员工管理系统2.0版本设计源码
- 【C++初级程序设计·配套源码】第2期-基本数据类型
- 基于Java和Vue的kopsoftKANBAN车间电子看板设计源码
- 影驰战将PS3111 东芝芯片TT18G23AIN开卡成功分享,图片里面画线的选项很重要
- 【C++初级程序设计·配套源码】第1期-语法基础
- 基于JavaScript、CSS、HTML的简易DOM版飞机游戏设计源码
- 基于Java开发的日程管理FlexTime应用设计源码
- SM2258XT-BGA144-4BGA180-6L-R1019 三星KLUCG4J1CB B0B1颗粒开盘工具 , EC, 3A, 94, 43, A4, CA 七彩虹SL300这个固件有用
- GJB 5236-2004 军用软件质量度量
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功