步骤一:安装必要模块
(1)cheerio模块 ,一个类似jQuery的选择器模块,分析HTML利器。
(2)request模块,让http请求变的更加简单
(3)mysql模块,node连接mysql的模块
npm i cheerio request mysql -D
步骤二:分析爬取网址的内容
目标URL:
http://zzk.cnblogs.com/s/blogpost?Keywords=%E6%B8%B8%E6%88%8F,游戏其实被编码成了%E6%B8%B8%E6%88%8F
分析:
var url = 'http://zzk.cnblogs.com/s/blogpost?Keywords=' + key + '&pageindex=' + page;
如果key是中文,是会抓取不到任何数据,用JS函数url = encodeURI(url);转换一下就好。
用"pageindex="出现的位置加上本身长度即得到页数
page = nextUrl.slice(nextUrl.indexOf('pageindex=') + 10);
indexof是返回子串在母串的第一个位置,没有则-1,区分大小写
步骤三:创建数据表
(1)启动 mysql
mysql -uroot -p123456
root是mysql用户名,123456是密码
(2)创建 database 数据库
create database spider_data;
(3)查看 所有的 database 数据库
show databases;
(4)进入 数据库
use spider_data;
(5)创建 table 表单
create table blog(
id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(100) NOT NULL,
href VARCHAR(100) NOT NULL,
author VARCHAR(100) NOT NULL,
time DATE,
view INT(5) NOT NULL
);
MySQL数据类型包括:整型、浮点型、日期类型、字符型,这里用表格的方式详细说明每个数据类型,这些只要记住常用的即可,需要再查阅。
整型
数据类型
存储范围
字节
TINYINT
有符号值:-128 到 127(-2727到2727)
无符号值:0到255(0到2828)
1
SMALLINT
有符号值:-32768 到 32767(-215到215215到215)
无符号值:0到65535(0到216216-1)
2
MEDIUMINT
有符号值:-8388608 到 8388607(-223到223223到223)
无符号值:0到16777215(0到224224)
3
INT
有符号值:-231到231231到231
无符号值:0到232到232-1
4
BIGINT
有符号值:-263到263263到263
无符号值:0到264到264-1
8
浮点型
数据类型
精度
FLOAT[(M,D)]
小数点后6-7位(常用)
DOUBLE[(M,D)]
小数点后14-15位
日期时间类型
日期类型
存储空间(字节)
日期格式
范围
datetime
8
YYYY-MM-DD HH:MM:SS
1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp
4
YYYY-MM-DD HH:MM:SS
1970-01-01 00:00:01 ~ 2038
date
3
YYYY-MM-DD
1000-01-01 ~ 9999-12-31
year
1
YYYY
1901~2155
time
2
HH:MM:SS
-838:59:59 ~ 838:59:59
字符型
列类型
说明
CHAR(M)
M个字节,0<=M<=255,固定长度
VARCHAR(M)
L+1个字节,其中L
TINYTEXT
L+1个字节,其中L<2828
TEXT
L+2个字节,其中L<216216
MEDIUMTEXT
L+3个字节,其中L<224224
LONGTEXT
L+4个字节,其中L<232232
ENUM('value1','value2')
枚举,1或2个字节,取决于枚举的个数(最多216216-1个值)
SET('value1','value2')
集合,1,2,3,4,8个字节,取决于成员个数
(6)查看 当前数据库下的 数据表
show tables;
(7)查看表结构
desc blog;
步骤四:代码
/**
* 将node爬取到的数据,保存到mysql数据库中
*/
var request = require('request');
var cheerio = require('cheerio');
var mysql = require('mysql');
// 创建数据库连接
var db = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '123456',
database: 'spider_data'
});
db.connect();
// 请求数据
function fetchData(key, page) {
var url = 'http://zzk.cnblogs.com/s/blogpost?Keywords=' + key + '&pageindex=' + page;
//用JS的全局对象函数,作为URI编码,不然中文,空格等抓取不到
url = encodeURI(url);
request(url, function(err, res) {
if (err) return console.log(err);
var $ = cheerio.load(res.body.toString());
var arr = [];
//解析HTML代码
$('.searchItem').each(function() {
var title = $(this).find('.searchItemTitle');
var author = $(this).find('.searchItemInfo-userName a');
var time = $(this).find('.searchItemInfo-publishDate');
var view = $(this).find('.searchItemInfo-views');
var info = {
title: $(title).find('a').text(),
href: $(title).find('a').attr('href'),
author: $(author).text(),
time: $(time).text(),
view: $(view).text().replace(/[^0-9]/ig, '')
};
arr.push(info);
//打印
console.log('~~~~~~~~~~~~~~~~~~~~~~~ 输出开始 ~~~~~~~~~~~~~~~~~~~~~~~');
console.log(info);
console.log('~~~~~~~~~~~~~~~~~~~~~~~ 输出结束 ~~~~~~~~~~~~~~~~~~~~~~~');
//保存数据
db.query('insert into blog set ?', info, function(err, result) {
if (err) throw err;
if (!!result) {
console.log('插入成功');
console.log(result.insertId);
} else {
console.log('插入失败');
}
});
});
//下一页
var nextA = $('.pager a').last(),
nextUrl = '';
if ($(nextA).text().indexOf('Next') != -1) {
nextUrl = nextA.attr('href');
page = nextUrl.slice(nextUrl.indexOf('pageindex=') + 10);//"pageindex="出现的位置加上本身长度得到页数
setTimeout(function() {
fetchData(key, page);
}, 2000);
} else {
db.end();
console.log('结束,爬取完所有数据');
}
});
}
// 调用
fetchData('游戏开发', 1);
.