步骤一:安装必要模块javascript
(1)cheerio模块 ,一个相似jQuery的选择器模块,分析HTML利器。java
(2)request模块,让http请求变的更加简单node
(3)mysql模块,node链接mysql的模块mysql
npm i cheerio request mysql -D
步骤二:分析爬取网址的内容sql
目标URL:数据库
http://zzk.cnblogs.com/s/blogpost?Keywords=%E6%B8%B8%E6%88%8F,游戏其实被编码成了%E6%B8%B8%E6%88%8Fnpm
分析:ide
var url = 'http://zzk.cnblogs.com/s/blogpost?Keywords=' + key + '&pageindex=' + page;函数
若是key是中文,是会抓取不到任何数据,用JS函数url = encodeURI(url);转换一下就好。post
用"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<M且0<M<65535,能够小于定于长度M |
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);
.