如何把数据存储到MySql中

如何把数据存储到MySql中

写在前面

  • 这篇博客主要记录了在学习了老师得课程之后如何把爬取下来的文件存储到MySql中去
  • 数据库的安装和配置在这里略去不讲
  • 目标如下:
    1. 数据库存储爬取的数据
    2. 爬取新闻页面之前先查询数据库,是否该url已经爬取过了
    3. 设置爬虫定时工作

用npm引入mysql模块

1
npm install mysql --save

给root用户授权从客户端访问

在mysql中敲入

1
2
alter user'root'@'localhost'identified with mysql_native_password by 'root';
flush privileges;
  • 目的是让其他客户端,也能访问我的mysql

示例

使用mysql创造一个数据库和一张用来存放数据的表

  • 建库代码
1
2
create database crawl;(crawl就是新的数据库名字)
use crawl;(切换数据库)
  • 建表代码,老师的最为详细,我一一来解释,同时也会附上我的建表码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE `fetches` (
//id_fetches 就是每段信息的标号,默认从1开始递增
`id_fetches` int(11) NOT NULL AUTO_INCREMENT,
//url 就是我们爬取个网站的链接
`url` varchar(200) DEFAULT NULL,
//source_name 就是每个网站的题目,比如什么值得买,中国新闻网,网易等等
`source_name` varchar(200) DEFAULT NULL,
//source_encoding 就是编码,可以实GBK,也可以是UTF-8,根据网站编码来定
`source_encoding` varchar(45) DEFAULT NULL,
//title 就是标题
`title` varchar(200) DEFAULT NULL,
//keywords 就是关键字
`keywords` varchar(200) DEFAULT NULL,
// author 就是作者
`author` varchar(200) DEFAULT NULL,
// publish_date 就是出版时间
`publish_date` date DEFAULT NULL,
// crawltime 就是爬取信息的时间
`crawltime` datetime DEFAULT NULL,
//content就是内容,主体
`content` longtext,
// createtime就是创造这行数据所用的时间
`createtime` datetime DEFAULT CURRENT_TIMESTAMP,
//下面是默认设置
PRIMARY KEY (`id_fetches`),//primary key是主键的意思
1,主键非空,也就是说被设定为主键的列在插入数据的时候就不能为空,如果为度空就会报错。
2,主键是唯一的,一个表通过一个主键可以确定一条记录。
3,有时可以用专两个字段来建立主键,这叫联合主键。这种情况出现在当一个字段无法唯一的时候要借助属另一个字段来确保唯一性的时候。
//这里,把id设为主键,就是用来标号的,
UNIQUE KEY `id_fetches_UNIQUE` (`id_fetches`),//就是说id是不能重复的
UNIQUE KEY `url_UNIQUE` (`url`)//就是说url字段是不能重复的
) ENGINE=InnoDB DEFAULT CHARSET=utf8;//编码
  • 我爬取的数据分类比较少,除了改动一行代码的名字之外,删了几行不需要的代码
1
2
3
4
5
6
7
8
9
10
11
12
13
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,
`interface_format` longtext,//这个其实就是存放标题的
`crawltime` datetime DEFAULT NULL,
`content_format` 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;

用node调用mysql

  • 我们通过引用分文件的方式。也就是说新建一个mysql.js文件,在里面写上具体操作,然后在主爬虫程序中引入即可,我们还是通过讲解代码的方式来介绍。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//在这个文件里真正引入了mysql模块
var mysql = require("mysql");
//定义了mysql的一些基本信息
var pool = mysql.createPool({
host: '127.0.0.1',//本机
user: 'root',//用户名,这里是root
password: 'root',//密码,这里也是root
database: 'crawl'//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’),前提是两个文件放在同一个文件夹下。关于js中调用同文件夹的语法,这里略去不讲

在newsGet函数的最后修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
//因为老师的代码更为详细,所以那他的举例子,具体到我自己写的每个爬虫,只需要在原基础上删改即可

//下面注释掉的是原来写入文件的操作,现在我们要把他写入数据库中
// var filename = source_name + "_" + (new Date()).toFormat("YYYY-MM-DD") +
// "_" + myURL.substr(myURL.lastIndexOf('/') + 1) + ".json";
// 存储json
// fs.writeFileSync(filename, JSON.stringify(fetch));


//INSERT INTO fetches就是要把信息写入我们建立出来的fetches表中
//后面跟着的就是我们要写入的数据种类,注意,要一一对应:括号内的类型,创建表的时候定义的类型,问号个数
var fetchAddSql = 'INSERT INTO fetches(url,source_name,source_encoding,title,'
+'keywords,author,publish_date,crawltime,content) VALUES(?,?,?,?,?,?,?,?,?)';

//下面这个params数组中的值,就是要具体传给上面问号里的,所以也要一一对应
var fetchAddSql_Params = [fetch.url, fetch.source_name, fetch.source_encoding,
fetch.title, fetch.keywords, fetch.author, fetch.publish_date,
fetch.crawltime.toFormat("YYYY-MM-DD HH24:MI:SS"), fetch.content
];


//最后,执行sql,数据库中fetch表里的url属性是unique的,不会把重复的url内容写入数据库
mysql.query(fetchAddSql, fetchAddSql_Params, function(qerr, vals, fields) {
if (qerr) {
console.log(qerr);
}
}); //mysql写入

成果展示

经过了上面的操作,我们来分别看看老师的爬虫和我的爬虫分别爬取到的信息吧!

  • 老师的爬虫

示例

  • 我的爬虫

示例

写在最后

  • 其实我真的只是想看看大佬们都买了那些咖啡玩具,QAQ
-------------本文结束,感谢您的阅读-------------