node爬取app数据_node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中

梁丘凯定
2023-12-01

步骤一:安装必要模块

(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);

.

 类似资料: