从零开始的Node.js新闻爬虫实验项目(五)将爬虫爬取的数据存入Mysql中

Mysql是一个使用广泛,功能强大,性能开销低的数据库系统,这里用mysql取代文件直接存储数据,能提高存储和读取的效率。
这是计划的第4-5步。

创建Mysql数据表

安装过程略,这里创建了一个名为crawl的数据库,并创建了一个fetches表,
并且统一了爬取信息类别的命名。

CREATE TABLE `fetches` (
  `id_fetches` int(11)  NOT NULL AUTO_INCREMENT,
  `url` varchar(200) DEFAULT NULL,
  `source_name` varchar(200) DEFAULT NULL,
  `source_encoding` varchar(45) DEFAULT NULL,
  `title` varchar(200) DEFAULT NULL,
  `keywords` varchar(200) DEFAULT NULL,
  `author` varchar(200) DEFAULT NULL,
  `publish_date` date DEFAULT NULL,
  `crawltime` datetime DEFAULT NULL,
  `content` longtext,
  `createtime` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id_fetches`),
  UNIQUE KEY `id_fetches_UNIQUE` (`id_fetches`),
  UNIQUE KEY `url_UNIQUE` (`url`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建调用mysql的js文件

同时要nodejs需要安装好mysql包,在爬虫脚本同路径下创建mysql.js 文件,并存储以下内容

var mysql = require("mysql");
var pool = mysql.createPool({
    host: '127.0.0.1',
    user: 'root',
    password: 'yourPassword',
    database: 'crawl'
});
//mysql的基本信息:用户、密码、数据库
var query = function(sql, sqlparam, callback) {
    pool.getConnection(function(err, conn) {
        if (err) {
            callback(err, null, null);
        } else {
            conn.query(sql, sqlparam, function(qerr, vals, fields) {
                conn.release(); //释放连接 
                callback(qerr, vals, fields); //事件驱动回调 
            });
        }
    });
};
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;

这样,便可以在不同的爬虫文件中调用 var mysql = require(’./mysql.js’) 来引用该文件,非常方便的将需要存储的各项信息通过这个文件来登录mysql,打开对应的数据库,并且存储。

在脚本中调用mysql
  • 修改脚本 xueqiu.js
    在引用中加上一行
var mysql = require('./mysql.js') 

然后在 getTexts 函数中加入以下内容,以整理信息存入数据库中

var newsAddSql = 'INSERT INTO fetches(url,source_name,source_encoding,title,' +
	'keywords,auther,publish_date,crawtime,content) VALUES(?,?,?,?,?,?,?,?,?)';
	//SQL语句
news.crawltime = new Date();
var newsAddSql_Params = [news.link, news.source, 'utf-8', news.title, news.contain, 
	news.editor,news.time, news.crawltime, news.texts];
	//爬虫爬下来的数据,用来存入SQL语句的‘?’中
mysql.query(newsAddSql, newshAddSql_Params, function(qerr, vals, fields) {
	if (qerr) {
		console.log(qerr);
	}
	//调用mysql.js中的函数,存入数据库中

运行一次该脚本,然后在命令提示符中查看这个数据库
在这里插入图片描述
非常漂亮

避免重复爬取同一个Url

在主函数中,将 getTexts 函数改为一下形式调用

var news_url_Sql = 'select url from fetches where url=?';
var news_url_Sql_Params = [news.link];
mysql.query(news_url_Sql, news_url_Sql_Params, function(qerr, vals, fields) {
	if (vals.length > 0) {
		console.log('URL duplicate!')
	} else  getTexts(newsArr, news, function(newsArr, news) {
			newsArr.push(news);
			}); //读取新闻页面
});

先从数据库中读取url,然后判断此url长度是否已经大于1,如果大于1说明该url已经读取过,就不必在做 getText 读取该url下的信息了。
在这里插入图片描述
爬取过的url都正确的跳过了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值