1.安装node.js
Node.js 安装包及源码下载地址为:https://nodejs.org/en/download/
2.全局安装express-generator
3.初始化项目
node_modules: 所有安装的依赖模块都在这个文件夹里面
public: 所有的前端静态资源 css image js
routes: 放的是路由文件
路由主要定义 url 和资源的映射关系 ( 一一对应关系 )
主要用来接收前端发送的请求响应数据给前端
views: 主要放置 ejs 后端模板文件
app.js: 入口文件(主文件) 总路由 (其他的路由要由它来分配)
package.json: 描述文件,最重要的是依赖的模板列表 dependencies
依赖列表里面的所有模板可以通过 npm i 一次性全部安装
4.添加依赖
在package.json文件里添加需要的依赖,如:request,Cheerio,pg等,再次安装依赖。
1.连接池创建
在代码中引入pg模块,并编写数据库配置:
2.编写操作数据库的函数
有参数和无参数,该函数实现连接数据库并执行SQL语句
3.新闻表和关键词表的设计
新闻表:
id_news是每个新闻的id,设为UNIQUE属性唯一标识新闻数据
url是新闻链接
source_name是新闻的来源网站名
source_encoding是新闻的编码方式
title是新闻标题
publish_date是新闻的发表日期
content是新闻内容
关键词表:
id_word是关键词id,唯一标识该关键词
id_news是该关键词所属的新闻id,用于两表的连接
word是关键词
爬取了三个网站:雪球网、中国财经网、网易新闻网。
每一个爬虫的大致步骤都是:
1、读取种子页面
2、分析出种子页面里的所有新闻链接,并爬取内容,解析成结构化数据
3、将结构化数据存储到数据库中
下面以中国财经网为例
1.读取种子页面
引入需要的包
构造模仿浏览器的request是每个爬虫都包含的部分,定义来header来防止网站屏蔽,并且定义了request函数,调用该函数能够访问指定的url并且能够设置回调函数来处理得到的html页面。
爬取种子页面,并且获取其中每一个新闻对应的链接,其对应的代码如下:
其中seedurl_news对应的页面上所有新闻,使用seedurl_news.each()对每一块新闻获取其具体url,并且检查了url是否在数据库中已经存储过了,避免重复插入数据
2.爬取新闻链接内容
在获取了新闻详情页面后,调用newsGet函数,爬取所需要的内容。
爬取的信息包括:新闻标题、内容、来源、发表时间,并对内容、发表时间等内容的格式进行了处理
3.存储结构化数据
执行SQL语句把新闻数据插入news表
4.关键词表数据的插入
利用nodejieba.extract()方法,提取新闻内容中的关键词,并剔除停用词。
1.用pgsql查询已爬取的数据(按时间顺序)
构建sql查询语句并且调用pgsql.query_noparam进行查询即可,且对标题、关键词、源网站的查询都是按照时间降序排列,最新的新闻排在旧的新闻前面呈现。
2、用网页发送请求到后端查询
前端采用文本框样式,获取输入的查询词,并提交给后端
每个文本框及按钮绑定不同的id,便于访问不同的路由
3.用表格显示查询结果
采用现有的css框架bootstrapTable呈现查询结果
4.关键词的时间热度分析
从数据库的新闻信息中统计每天包括该关键词的新闻数量,按照时间顺序降序排列