基于Python实现的新闻搜索引擎

基于Python实现的新闻搜索引擎 一,Scraper - 爬虫 使用的库有: requests BeautifulSoup4 爬虫分为两部分

本文包含相关资料包-----> 点击直达获取<-------

基于Python实现的新闻搜索引擎

一、Scraper - 爬虫

使用的库有:

  • requests

  • BeautifulSoup4

爬虫分为两部分,网络通信部分(scraper.py)与适配器(adapers/*.py)部分。

1.1 网络通信部分

网络部分也分为两部分:

  • 第一部分是初始化部分,使用适配器提供的链接,下载数据后发给适配器(适配器用这些链接捕获哪些链接是下一步需要爬取的)

  • 第二部分是爬取新闻的部分,适配器在前一步里得到了大量的新闻链接,通信部分便用这些链接进行爬取。爬取之后,再将这些数据传入适配器,然后得到返回值(包含新闻的ID、标题、内容、日期、来源)

全部爬完之后,将新闻数据以json格式存入到文件里,其中新闻的内容是 html ,不是纯文本(保留了原网站的一些排版、外链图片等信息)。

这一部分是多线程(默认是10个线程)的,也就是说适配器必须要是 线程安全 的。

1.2 适配器部分

适配器部分为通信部分提供链接(url)、报文头(headers)、请求参数(params),需要实现7个函数:

  • hasNextInit() :判断是否有下一个初始链接,有的话返回True

  • nextInitParam() :返回下一个初始链接的信息,包括op和上述的url、headers、params,其中op是你想加入的额外的信息

  • init(op, text) :op表示上一个函数你所加入的额外的信息,text表示上一个函数请求的url所得到的html数据

  • hasNext() :判断是否有下一个新闻链接,有的话返回True

  • nextParam() :返回下一个新闻链接的信息,包括op和上述的url、headers、params,其中op是你想加入的额外的信息

  • eval(op, text) :op表示上一个函数你所加入的额外的信息,text表示上一个函数请求的url所得到的html数据

  • 'encoding()':返回所爬取网页用的编码格式(用于网络部分解析html数据)

请一定注意,这些函数都必须要线程安全。

二、Web - 网页

2.1 前端

  • 使用 Boostrap 3 写的UI

  • 使用 JavaScript (大部分是 jQuery )进行各种UI更新操作,比如分页、高亮、使用 ajax 获取各种服务器上的数据,动态更新网页等

  • 包含三种页面:主页( / )、搜索页( /s??wd=中国&bg=2001-01-25&ed=2018-01-25 )、新闻详细页( /post?id=people_1

2.2 后端

我使用的数据库是 Django 默认自带的 SQLite ,因此我只需要实现几个 models 就能实现数据的读写了。我一共写了4个models(位于 /web/postdb/models.py ):

  • WebInfo :存储每个适配器(adapter)的数据信息
  • name :适配器的名字(比如 people xinhua
  • count :该适配器目前有多少数据从爬虫部分的json文件里导入进了数据库(用于下一次从该json文件里更新数据)

  • PostInfo :存储每篇新闻的数据信息

  • NID (Number ID):每篇新闻的纯数字ID(从1开始),用于减少网络通信时数据传输的大小
  • TID (Text ID):每篇新闻的文本ID,是 适配器名字_number 这样命名,比如 people_1 ,用于在 /post?id=people_1 里展示(而不是以纯数字的方式,因为这样难以区分)
  • time :新闻发表的时间,用 datetime 类型存储
  • category :新闻的分类(中文),比如“社会”、“时政”、“军事”等
  • title :新闻的标题
  • content :新闻的内容(html)
  • plain :新闻的内容(纯文本)
  • url :新闻是从哪里爬取的?就是从该url爬取的
  • sourceLink :新闻的来源链接(每篇新闻都有个来源,不一定就是url)
  • sourceText :新闻的来源文本(比如“新华网”、“人民网”)

  • IndexInfo :存储每个词语对应的新闻(倒排列表索引),同时存储新闻的一些信息

  • key :词语
  • value :该词语所对应的倒排列表(list),这个列表的每一个元素的格式为 [在该新闻里的出现次数, 该新闻的NID,该新闻的发表时间] , 比如 [1234, '3', datetime(2018, 1, 2)] 。该列表会转化成json格式的字符串存储在 value

  • PostRelation :存储每篇新闻相关联的几篇新闻(默认是3篇),将其作为该新闻的推荐新闻

  • NID :新闻的 NID
  • relation :相关联新闻的列表(list),这个列表的每一个元素的格式为 {'title': 关联新闻的标题, 'TID': 关联新闻的ITD} 。该列表会转化成json格式的字符串存储在 relation

2.3 新闻搜索算法

先介绍 IndexInfo 数据库的建立。

将每篇新闻的纯文本进行分词(使用 thulac ),同时统计每个词出现的次数。然后根据格式存入 IndexInfo 里的 value

对于每一个搜索的字符串,我们将这个字符串也分词。对于每个词语,我们从 IndexInfo 里取出倒排列表,将每个新闻的出现次数累加。最后根据每条新闻的累加次数,从大到小排个序,然后返回这些新闻的 NID

2.4 推荐新闻算法

用一个最简单的办法:将这篇新闻的标题拿去 新闻搜索算法 里进行搜索,然后取出前几条新闻即可。这是因为,新闻的标题有高度的概括性(而且是人为的),在一定程度上可以代表整篇文章。

我们用该办法预处理一下每篇新闻,然后存入 PostRelation 数据库里即可。

三、界面

首页

搜索新闻

推荐展示

四、使用说明

4.1 本机环境

  • Python 3.7.0

  • Django 2.1.1

  • requests 2.19.1

  • BeautifulSoup4 4.6.3

  • thulac

4.2 使用

首先使用 scraper 文件夹下的爬虫 scraper.py 对“人民网”、“新华网”的新闻进行爬取:

python scraper.py

之后会将爬取的数据存储到 people.json xinhua.json 中,然后在 web 文件夹下,运行:

python manage.py makemigrations python manage.py migrate

初始化数据库,然后再执行:

python manage.py updateDB

将爬取的数据导入到数据库中(这可能会等很长时间),之后再执行:

python manage.py updateRelation

更新文章推荐的数据库,最后:

python manage.py runserver

启动服务器即可,你就可以通过 127.0.0.1:8000 进行访问网站了。

目前的效率是,17000篇新闻的话,在i5-7200U的机子上查询新闻只要0.1s左右。(反正Django自带的sqlite有多快我这个就有多快)

参考文献

  • 金融信息实时发布系统的设计与实现(东北大学·伦健)
  • 利用Nutch研究与实现支持Ajax动态网页的网络爬虫系统(内蒙古师范大学·李松)
  • 基于元搜索的Web信息搜索技术研究(吉林大学·张春磊)
  • 基于协同过滤算法的新闻推荐系统的设计与实现(首都经济贸易大学·张可)
  • 高校新闻资讯整合展示系统的设计与实现(华中科技大学·蔡竞)
  • 鞍山移动电信行业信息新闻发布系统的设计与实现(大连理工大学·张安)
  • 基于主题的多线程网络爬虫系统的研究与实现(北京邮电大学·陈露)
  • 基于用户日志的新闻推荐系统研究(吉林大学·高冉冉)
  • 新闻事件识别系统的研究与实现(北京邮电大学·李昕)
  • 基于.NET架构的新闻发布管理系统的设计与实现(南昌大学·廖德伟)
  • 基于SSH2的新闻信息管理平台的设计与开发(青岛大学·张明瑛)
  • 基于用户日志的新闻推荐系统研究(吉林大学·高冉冉)
  • 基于Lucene技术搜索引擎设计与实现(吉林大学·张阳)
  • 个性化资讯推荐系统的设计与实现(山东大学·仵贇)
  • 文本搜索引擎的探究与设计(华南理工大学·张立)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:毕设工厂 ,原文地址:https://m.bishedaima.com/yuanma/35378.html

相关推荐

  • 基于Python设计的汉语分词系统

    汉语分词系统 摘要 中文分词技术,是由于中文与英文为代表的拉丁语系语言相比,英文以空格作为天然的分隔符,而中文由于继承自古代汉语的传统,词语之间没有分隔
    2024年05月14日
    3 1 1
  • 基于Python的 数据分析

    Python 数据分析 实验目的及实验内容 (本次实验所涉及并要求掌握的知识;实验内容;必要的原理分析) 实验目的: 使用 python 进行图像处理 实验内容: 自己找一张图片
    2024年05月14日
    2 1 1
  • 基于Web技术实现多人博客平台

    一,需求分析 博客是网络交流的一种重要形式,国内拥有许多专业的博客平台,如 CSDN 等, 为了实现小规模用户之间文章的分享,多人之间的交流互动,熟悉博客平台的开发流程
    2024年05月14日
    3 1 1
  • 支持向量机的python实现

    1, 理论知识 1,1 SVM 模型的基本理论 在之前的课程中讨论的分类器都是线性的,而在实际问题中,很多数据并不是线性可分的,也就是说找不到这样的超平面
    2024年05月14日
    2 1 1
  • 基于JSP和MySQL的汽车销售管理系统

    基于JSP和MySQL的汽车销售管理系统 一,系统开发平台 1,1 数据库应用的基本框架 本汽车销售管理系统采用B/S架构, 服务器端是一个Web服务器和数据库服务器的组合体
    2024年05月14日
    19 1 4
  • 基于 SSM 的银行 ATM 系统

    基于 SSM 的银行 ATM 系统 1 需求分析 后端采用 SSM 框架实现简单的银行 ATM 系统,实现“登录”,“账户锁定”,“存款”,“取款”,“转账”
    2024年05月14日
    21 1 6
  • 基于Servlet + JSP实现的简易版的学生管理系统

    学生管理系统简易版总结 一,技术准备 这个项目是自己用于巩固 J2EE 相关知识的练手项目,非常简单,但是相关的功能却非常实用,所以在这里分享一下 为了完成这个项目
    2024年05月14日
    47 1 9
  • 基于Python实现手写体识别

    手写体识别实现 说明:这里选出三份采用了不同的算法实现手写体识别的说明文档,更多信息可以通过下载或克隆代码压缩包查看文档内容, 参考文献 英语应用文写作在线学习系统模式研究(燕山大学·李鑫) 基于SSH的手机网站的设计与实现(东北大学 ·陶志刚) 基于知识图谱的开放空间知识采集系统(中南民族大学·马荣香) 基于深度学习的软件实体识别方法(云南师范大学·孙超) 中学python课程知识图谱构建及应用研究(华中师范大学·黄健) 基于CNN的票据手写数字识别系统设计与实现(哈尔滨工程大学·冯涛) 手写中文文本行识别系统的设计与实现(华中科技大学·吴为治) 基于文本识别的手写汉字识别平台的设计与实现(中国科学院大学(中国科学院沈阳计算技术研究所)·董春生) 基于Spring Boot的多用户博客系统的设计研究(青海师范大学·罗涛) 基于Spring Boot的多用户博客系统的设计研究(青海师范大学·罗涛) 基于文字特征增强的手写税务票据识别系统(大连海事大学·高帅) 基于知识图谱的实体链接算法设计与实现(华中科技大学·刘译键) 轨道交通行业知识体系构建系统的研究(北京邮电大学·王毅飞) 作文句子错误识别系统的设计与实现(北京邮电大学·高甲伟) 基于知识图谱的开放空间知识采集系统(中南民族大学·马荣香)
    2024年05月14日
    2 1 1
  • 基于SpringBoot框架的大学生科创项目在线管理系统

    这是一项致力于构建一个使用SpringBoot框架的创新性大学学生项目在线管理系统的源代码实现,编程语言采用Java,开发过程中应用了SpringBoot和Vue技术
    2024年05月23日
    2 1 1
  • SSH实现在线商城在线售卖系统、javaweb+mysql

    这是一个🔥🔥SSH实现在线商城在线售卖系统,javaweb+mysql🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 在线商城系统开发技术栈为SSH项目
    2024年05月23日
    8 1 3

发表回复

登录后才能评论