新闻爬虫以及爬取结果查询网站搭建(四)
概要
本节主要介绍:
- 如何搭建网站后端
- 实现查询功能和时间热度分析。
网页后端框架
本次网站后端使用了Express框架
什么是Express:
- Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具。
- 使用 Express 可以快速地搭建一个完整功能的网站。
Express 框架核心特性:
- 可以设置中间件来响应HTTP请求
- 定义了路由表用于执行不同的 HTTP 请求动作。
- 可以通过向模板传递参数来动态渲染 HTML 页面。
Express的使用:
- 首先创建目录作为当前工作目录
- 通过npm init命令为应用创建package.json 文件。
- 安装Express
npm install express --save
- 文件中引入
var express=require("express");
var app=express();
框架中目录结构
- app.js: 启动文件,用来启动项目。
- package.json: 存储着工程的信息及模块依赖,当在 dependencies 中添加依赖的模块时, 运行 npm install ,npm 会检查当前目录下的 package.json,并自动安装所有指定的模块。
- node_modules: 存放 package.json 中安装的模块,当你在 package.json 添加依赖的模块并安装后,存放在这个文件夹下。
- public: 存放 image、css、js 等文件。
- routes: 存放路由文件。
- views: 存放视图文件或者说模板文件。
app.js
通过require()加装了express、path等模块,以及routes文件夹下的index.js和users.js路由文件。
-
生成一个express实例app。
var app = express(); -
设置 views 文件夹为存放视图文件的目录, 即存放模板文件的地方,__dirname 为全局变量,存储当前正在执行的脚本所在的目录。
app.set(‘views’, path.join(__dirname, ‘views’)); -
设置视图模板引擎为 ejs。
app.set(‘view engine’, ‘ejs’); -
加装日志中间件
app.use(logger(‘dev’)); -
加载解析urlencoded请求体的中间件。
app.use(bodyParser.urlencoded({ extended: false })); -
加载解析cookie的中间件。
app.use(cookieParser()); -
设置public文件夹为存放静态文件的目录。
app.use(express.static(path.join(__dirname, ‘public’))); -
路由控制器。
app.use(’/’, routes);
app.use(’/users’, users); -
导出app实例供其他模块调用。
module.exports = app;
bin/www 文件:
- #!/usr/bin/env node:表明是 node 可执行文件。
- var debug = require(‘debug’)(‘blog’):引入debug模块,打印调试日志。
- var app = require(‘…/app’):引入我们上面导出的app实例。
- app.set(‘port’, process.env.PORT || 3000):设置端口号。
- 监听3000端口
var port = normalizePort(process.env.PORT || '3000');
app.set('port', port);
routes/index.js 文件:
生成一个路由实例用来捕获访问主页的GET请求,导出这个路由并在app.js中通过
var indexRouter = require('./routes/index');
app.use('/', indexRouter);
加载。
实现查询功能和时间热度分析
根据新闻标题进行搜索
采用模糊查询:
var fetchSql = "select url,source_name,title,publish_date " + "from news where title like '%" + req.query.title + "%' Order By publish_date desc" ;
pgsql.query_noparam(fetchSql, function(err, result, fields) {
res.end(JSON.stringify(result.rows));
});
根据网站名进行搜索
var fetchSql = "select url,source_name,title,publish_date " +
"from news where source_name like '%" + req.query.source_name + "%' Order By publish_date desc" ;
pgsql.query_noparam(fetchSql, function(err, result, fields) {
// console.log("here");
res.end(JSON.stringify(result.rows));
});
根据关键词进行搜索
res.writeHead(200, { 'Content-Type': 'text/html;charset=utf-8' });
var fetch = "select news.url,news.title,news.source_name,keywords.word " +
"from keywords,news where keywords.word like '%" + req.query.keyword + "%' and news.id_news=keywords.id_news" ;
pgsql.query_noparam(fetch, function(err, result, fields) {
// console.log("here");
res.end(JSON.stringify(result));
});
时间热度分析
var fetchSql = "SELECT publish_date,count(*) as Num FROM news WHERE content like '%" + req.query.keyword + "%' group by publish_date order by publish_date desc;";
pgsql.query_noparam(fetchSql, function(err, result, fields) {
res.end(JSON.stringify(result));
});