本次的主要任务是将爬取到的信息存入一个数据库中。
将爬取到的信息存入数据库中
课程老师向我们推荐了使用最为广泛的开源数据库MySQL,我按照教程下载并安装了MySQL Community Server 8.0.19免安装版。
//以下安装配置是给未来的自己看的,毕竟写博客只是为了以后能够回顾温习/-_-||
下载安装包后将其解压到c:\mysql文件夹并以管理员身份打开命令行
cd c:\mysql\bin
mysqld -install //安装mysql服务
mysqld --initialize --console//初始化mysql
//记录下随机生成的初始密码
net start mysql
mysql -u root -p
//进入mysql并按照提示输入得到的随机密码
//进入后输入:
alter user 'root'@'localhost'identified by 'root';
//以后想要启动只需输入 ‘mysql -uroot -proot’就可以啦
//最后给root用户授权从客户端访问
-alter user 'root'@'localhost'identified with mysql_native_password by 'root';
-flush privileges;
这样就可以建立database来存取新闻了,这里给个链接
,是网上搜到的某个CSDN用户提供的一些常用的MySQL数据库常用命令小结。
其中对于我来说最实用的就是:
create database _name //创建数据库
use _database_name //选择数据库
drop database _name //直接删除数据库,不提醒
show tables //显示表
show databases //显示所有数据库
delete from _table_name //删除整个表中的信息
delete from _table_name where _条件语句//删除指定条件的语句
show status //显示当前状态,可以在其中的“current database”属性中看到当前所使用的数据库名称
有了这些基本命令,就可以针对不同新闻网站信息建立相对应的database用以存放信息,并可以进行删除操作移除失去时效性的信息。
接下来在存放crawler的文件夹下创建一个MySQL.js文件,用于创建一个 pool 连接池
用 createConnection 创建 Mysql 连接,每执行一次 connection.query 都是一个全新的连接,会造成一个资源的极大浪费,降低性能。
连接池是另外的一种执行方法,它一次性的创建了多个连接,然后根据客户端的查询,自动的 分发、复用、管理 这些连接。
并在crawler文件中引入该文件
var mysql = require('./mysql.js');
将fetch对象写入MySQL中预先建立的database中名为"fetches"的table中,该table中预设有许多属性:
var fetchAddSql = 'INSERT INTO fetches(url,source_name,source_encoding,title,' + 'keywords,author,publish_date,crawltime,content) VALUES(?,?,?,?,?,?,?,?,?)'; //预写好写入顺序并先赋?值初始化
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];
mysql.query(fetchAddSql, fetchAddSql_Params, function(qerr, vals, fields) {
if (qerr) console.log(qerr);}); //mysql写入
接下来为防止在数据库中存入重复爬取的新闻,需要添加以下片段:
var fetch_url_Sql = 'select url from fetches where url=?';
//预设要发送的SQL查询
var fetch_url_Sql_Params = [myURL];
mysql.query(fetch_url_Sql, fetch_url_Sql_Params, function(qerr, vals, fields) {
if (vals.length > 0) console.log('URL 重复!')
else newsGet(myURL); //读取新闻页面 });
如此一来,当再次运行crawler程序后,爬取到的新闻就被写入到了数据库中,且再次写入时也避免了重复存储的问题。
//想要在数据库中找到写入的信息很简单
use _database_name; //选择database
select url , titles from _table_name limit _number;
//从表中选取特定属性,如链接与标题,中特定数量的值并显示
添加定时爬取功能
想要实现该功能需要先引入"schedule-node"模块,记得在crawler文件夹下先 npm install schedule-node。
var schedule = require('node-schedule');
var rule = new schedule.RecurrenceRule();
var times = [0, 12];
//每天2次自动执行var
times2 = 5;
//定义在第几分钟执行
rule.hour = times;
rule.minute = times2;
schedule.scheduleJob(rule, function() { seedget();});
这是定义了一个rule来规定操作间隔的时间,并将抓取链接的函数封装进去,就能实现定时的爬取功能。当然,还有更简洁的方式来定义时间间隔:
//如上述可直接写成
schedule.scheduleJob('0 5 */12 * * *', function(){
seedget(); });
// '1 * * * * *' 每分钟的第一秒触发
// '1 1 * * * *' 每小时一分一秒触发
// '1 1 1 * * *' 每天凌晨一点一分一秒触发
// '1 1 1 1 * *' 每月一日一点一分一秒触发
// '1 1 1 1 2020 *' 2020年一月一日一点一分一秒触发
// '1 1 1 * * 1' 每周一点一分一秒触发
// '*/10 * * * * *' 间隔10s执行