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

摘要:
关键字=“+键+”&pageindex=“+页;如果密钥是中文,则不会捕获任何数据。使用JS函数url=encodeURI;只需切换它。使用“pageindex=”出现的位置加上其长度,即可获得page=nextUrl的页数。片Indexof是返回的子字符串在父字符串中的第一个位置。如果没有-1,区分大小写的步骤3:创建一个数据表以启动mysqlmysql-uroot-p123456root是mysql用户名,123456是创建数据库createDatabasespider_data的密码;查看所有数据库数据库showdatabases;输入数据库usespider_data;创建表格formcreatetableblog;MySQL数据类型包括整型、浮点型、日期型和字符型。这里,以表格的形式详细描述了每种数据类型。只要记住常见的,你需要再次查找它们。

步骤一:安装必要模块

(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(-215215215到215)
无符号值:0到65535(0到216216-1)
2
MEDIUMINT有符号值:-8388608 到 8388607(-223223223到223)
无符号值:0到16777215(0到224224)
3
INT有符号值:-231231231到231
无符号值:0232到232-1
4
BIGINT有符号值:-263263263到263
无符号值:0264到264-1
8
浮点型
数据类型精度
FLOAT[(M,D)]小数点后6-7位(常用)
DOUBLE[(M,D)]小数点后14-15位
日期时间类型
日期类型存储空间(字节)日期格式范围
datetime8YYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp4YYYY-MM-DD HH:MM:SS1970-01-01 00:00:01 ~ 2038
date3YYYY-MM-DD1000-01-01 ~ 9999-12-31
year1YYYY1901~2155
time2HH:MM:SS-838:59:59 ~ 838:59:59
字符型
列类型说明
CHAR(M)M个字节,0<=M<=255,固定长度
VARCHAR(M)L+1个字节,其中L<M且0<M<65535,可以小于定于长度M
TINYTEXTL+1个字节,其中L<2828
TEXTL+2个字节,其中L<216216
MEDIUMTEXTL+3个字节,其中L<224224
LONGTEXTL+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);

.

免责声明:文章转载自《node 爬虫 --- 将爬取到的数据,保存到 mysql 数据库中》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇PhantomJS 基础及示例 (转)网页提示错误(net::ERR_EMPTY_RESPONSE)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql中时间比较的实现

MySql中时间比较的实现 unix_timestamp() unix_timestamp 函数可以接受一个参数,也可以不使用参数。 它的返回值是一个无符号的整数。不使用参数,它返回自1970年1月1日0时0分0秒到现在所经过的秒数, 如果 使用参数,参数的类型为时间类型或者时间类型的字符串表示,则是从1970-01-01 00:00:00到指定时间所经历...

使用filebeat 收集日志到logstash 收集日志redis再到logstash到es

大型场合的工作流程图 filebeat -->logstash ---> redis ---> logstash --->es 工作环境: 需要两台logstash, 安装jdk8 [root@es-web1]# apt install openjdk-8-jdk -y 这里已经安装filebeat 配置filebeat(这里的...

mysq优化三之buffer pool

sql语句执行流程   不管是select还是update,都是要查询把页取出来放在内存中,mysql中有一个单独的区域用来存放页,这就是buffer pool innodb architecture  mysql启动的时候,会在内存中开辟一个128M的空间,这个空间就是buffer pool  当再取一个页放在buffer pool中的什么位置呢...

MySQL 查询语句

MySQL 查询语句 查询单表查询多表查询DQLSELECTSHOWWHEREGROUP BYHAVINGORDER BYLIMITASUNIONUNION ALLDISTINCT 欢迎来到 来到大浪涛天的博客 ! 一、MySQL 查询语句 1. DQL 介绍 2. select 语句的应用 2-1. select单独使用的情况,不针对任何数据库...

noodjs(koa)+mysql搭建服务器环境及基本的增删改查操作

手动创建项目文件 1.在指定目录下,右击创建项目文件夹。2.使用git init 命令把此文件下内容变成可由git进行版本控制的文件。3.执行“npm init -y”命令,创建package.json文件,初始化4.执行“npm init koa”命令,安装koa,此时项目路径下会生成一个package-lock.json文件。 创建server 1.创...

Ping监控脚本

  需求 内网服务器之间高频率检验延时信息, 脚本特点 多进程,可同时异步监控多个地址,不会互相影响。 使用方式 创建文件夹(可以替换为你自己的,我这里就用我们生产环境的标准目录了) mkdir /data/w/falcon-agent/tmp 复制wiki里的代码至ping.py脚本并替换脚本内需要监控的地址 启动脚本 python ping.py &...