从零开始的爬虫项目(二)

本次的主要任务是将爬取到的信息存入一个数据库中。

将爬取到的信息存入数据库中

课程老师向我们推荐了使用最为广泛的开源数据库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写入

上述中 MySQL.query 的定义及用法

接下来为防止在数据库中存入重复爬取的新闻,需要添加以下片段:

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执行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值