Web期中实践——Nodejs新闻爬虫及查询网站
·
项目概览

本项目选取了5个代表性的新闻网站:中国新闻网、新浪新闻网、新华网、光明网和人民网 建立nodejs爬虫。通过针对不同网站的新闻页面进行分析,我们爬取出编码、关键词、标题、时间、作者、内容、摘要、来源等结构化信息,并将之存储在MySQL数据库中。
之后,我们构建了支持 分项全文搜索 和 关键词热度分析 的前端页面,可对标题、作者、关键词 单独或联合索引,结果返回满足要求的新闻信息;也可通过搜索关键词,获取不同日期中包含该词的新闻数目。
使用工具包
请求模块
在该项目中,我们使用requerst方式获取网页内容,并人为将浏览器的user-agent信息填充到headers 参数中,从而模拟浏览器,避免被待爬取的目标新闻网站屏蔽。
同时,在程序运行时,请求过程较为漫长,我们没必要阻塞地等待请求的完成再继续处理下一个任务,因此,我们通过使用回调函数来异步地爬取网页的url,即爬取url的同时就能对所得url进行解析,这样能有效提高网页爬取的效率。
var myRequest = require('request');
//防止网站屏蔽我们的爬虫
var headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36'
}
//request模块异步fetch url
function request(url, callback) {
var options = {
url: url,
encoding: null,
//proxy: 'http://x.x.x.x:8080',
headers: headers,
timeout: 10000
}
myRequest(options, callback)
};
数据解析模块
在该项目中,我们调用 cheerio 模块来筛选和提取网页中的信息,调用iconv-lite模块来解析编码,同时也通过date-utils日期工具类来处理时间相关的数据。
var myCheerio = require('cheerio');
var myIconv = require('iconv-lite');
require('date-utils');
存储网页信息模块
var mysql = require("mysql");
// 创建数据库连接池
var pool = mysql.createPool({
host: '127.0.0.1',
user: 'root',
password: 'root',
database: 'crawl'
});
var query = function(sql, sqlparam, callback) {
pool.getConnection(function(err, conn) {
// 获取连接
if (err) {
callback(err, null, null);
// pool.end(callback);
} else {
conn.query(sql, sqlparam, function(qerr, vals, fields) {
conn.release(); //释放连接
callback(qerr, vals, fields); //事件驱动回调
// pool.end(callback);
});
}
});
};
var query_noparam = function(sql, callback) {
pool.getConnection(function(err, conn) {
if (err) {
callback(err, null, null);
} else {
conn.query(sql, function(qerr, vals, fields) {
conn.release(); //释放连接
callback(qerr, vals, fields); //事件驱动回调
});
}
});
};
exports.query = query;
exports.query_noparam = query_noparam;
前端网页展示模块
我们使用express脚手架来创建一个网站框架,在该项目目录下的cmd中输入 express -e search_site 生成一个名为 search_site 文件夹,而搭建前端我们需使用到数据库中的信息,故将mysql.js也拷贝进该文件夹。
之后cmd切换至search_site目录下,运行 npm install mysql -save、npm install,将mysql包安装到该项目中,并加载完依赖项,完成初步的网站搭建。
·
网页爬取
网站分析及爬虫设计
此处我们以人民网下的中国gongchandang新闻网为例进行分析。
新闻URL获取
首先观察网页链接,均是 http://jhsjk.people.cn/result/x 形式,最后所跟数字代表分页的页数,因此,我们可以通过设置循环更改页数来爬取不同分页的具体新闻链接。

先尝试爬取该网页,然后分析得到的各链接,可以看到下图红框标注部分才是我们想得到的新闻页面,由此得知这些新闻链接都以 http://jhsjk.people.cn/article/32038656 的形式组织,故我们检验所爬取链接是否正确的正则表达式应设为:
url_reg = /\/article\/(\d{
8})/ // 匹配“/article/8位数字”

同时,我们也注意到所得新闻链接的格式与总网页的链接格式不一致,故对得到结果进行人为转换,若为 http:// 开头的直接获取,若为 // 开头则认为添上 http: 头,若不是这两种形式,则按照 domin_people 的格式加上所得url(此处是一个小坑,即不能直接在 seedUrl_people 基础上加所得url),最后用url的正则表达式进行判断,获取正确链接。
var domin_people = 'http://jhsjk.people.cn/';
var seedUrl_people = 'http://jhsjk.people.cn/result/';
function seedget_People(seedURL, url_reg, source_name, title_format, date_format, author_format, content_format, source_format) {
for (i = 1; i <= 5; i++) {
seedUrl = seedURL + String(i);
// console.log(seedURL);
request(seedUrl, function (err, res, body) {
//读取种子页面
<

最低0.47元/天 解锁文章
1533

被折叠的 条评论
为什么被折叠?



