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都正确的跳过了。