zoukankan      html  css  js  c++  java
  • node 爬虫 --- 将爬取到的数据,保存到 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位

    日期时间类型

    日期类型存储空间(字节)日期格式范围
    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);

    .

  • 相关阅读:
    领域驱动设计概念(Domain-driven Design), Flower(响应式微服务框架)
    主流RPC框架通讯协议实现原理与源码解析
    响应式微服务框架Flower——快速上手
    netty源码-server端绑定端口流程
    ubuntu 20.04版本更新软件源为国内源(清华、网易、阿里云等等)
    ubuntu20.04源码安装nginx
    docker环境下Java获取cpu核心数不准确,实际上是宿主机的cpu核心数
    利用docker快速搭建创建开发环境
    mac配置python环境
    Apache Maven-创建项目
  • 原文地址:https://www.cnblogs.com/crazycode2/p/8202823.html
Copyright © 2011-2022 走看看