使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

百度已收录   阅读次数: 50
2021-10-0915:18:29 发表评论
摘要

在之前分享过一篇使用 Node.js 爬取数据的文章,并提供了页面是GBK格式的解决方案,以及使用 Node.js 操作数据库 并且生成API,以上都可以从下方的前情提要去查看,接下来,就是将以上的内容结合在一起,进行事件,即爬取数据后,将其存储在MySQL,并能够生成API进行调用,于是就有了今天这篇文章……

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

开篇寄语

在之前分享过一篇使用 Node.js 爬取数据的文章,并提供了页面是GBK格式的解决方案,以及使用 Node.js 操作数据库 并且生成API,以上都可以从下方的前情提要去查看,接下来,就是将以上的内容结合在一起,进行事件,即爬取数据后,将其存储在MySQL,并能够生成API进行调用,于是就有了今天这篇文章。

前情提要

达成目标

  1. 使用Node.js构建爬虫,爬取一个网页编码格式是GBK格式的,分类小说的所有标题
  2. 将爬取的所有标题储存在MySQL数据库
  3. 之后用Node.js生成api,显示所有结果

准备要素

  • 本机安装Node.js,未安装的朋友可以前往官网下载安装
  • 本机安装MySQL,未安装的朋友可以前往其官网下载,并安装MySQL Workbench
  • 本机安装VS code(或者其他编程编辑器),以进行js脚本编写
  • 本机安装POSTMAN,以方便调试API

内容详情

构建爬虫

先来构建一个Node.js爬虫,根据 使用Nodejs爬取图片音频视频与Python相比平分秋色用Nodejs爬取数据时无法解析GBK格式网站该如何是好?请看这篇 所写,先安装所需要的依赖(在terminal或者调试命令输入npm install xxx):

  • request
  • cheerio
  • iconv-lite(转换GBK格式为utf-8)

以爬取https://www.qb5.la/这个小说网站为例,格式是GBK的

var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');

option = {
    url: 'https://www.qb5.la/',
    encoding: null
}

request(option, function(err, res, body) {
    if (err) throw err;
    body = iconv.decode(body, 'gbk');
    var $ = cheerio.load(body);
    console.log($('head title').text());
});

先看一下爬取是否成功,如下图所示:

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

验证成功,接下来是怕取所有的标题,肯定是需要观察该网站首页的代码构成,右键——检查元素,找到各个小说标题的位置,如下图所示:

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

经过观察,在分类栏目中,小说位置在titletop这个class类目下,ul>li>a这样寻找后就找到了,之后用for循环就可以抓取到每个小说的标题了,代码如下:

var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');

option = {
    url: 'https://www.qb5.la/',
    encoding: null
}

request(option, function(err, res, body) {
    if (err) throw err;
    body = iconv.decode(body, 'gbk');
    var $ = cheerio.load(body);
    $('.titletop ul>li').each(function() {
        console.log($(this).find('a').text());
    });
});

调试结果如下图所示:

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

这样,目标一构建一个爬虫就完成了,接下来是将爬取的数据储存到数据库。

数据储存到数据库

储存数据到MySQL数据库,需要参阅这篇文章《 一文以Node.js 连接 MySQL为例操作数据库 》,安装以下依赖:

  • mysql

先前往MySQL新建一个表格,设置id和标题,两栏即可,如下图所示:

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

接下来是连接数据库,在前情提要已经写了,这里就不再赘述,增加数据代码如下:

var mysql = require('mysql');
var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
var arr = [];

option = {
    url: 'https://www.qb5.la/',
    encoding: null
}

var connection = mysql.createConnection({
    host: 'localhost', //数据库安装在了本地就用这个啦
    user: 'root',
    port: '3306',
    password: 'your password', //上一步设置的密码在此处用到了
});

connection.connect();

request(option, function(err, res, body) {
    if (err) throw err;
    body = iconv.decode(body, 'gbk');
    var $ = cheerio.load(body);
    $('.titletop ul>li').each(function() {
        arr.push($(this).find('a').text())
    });
    for (let i = 0; i < arr.length; i++) {
        let addSql = 'INSERT INTO demo.novel(id,title) VALUES(?,?)';
        let addSqlParams = [i + 1, arr[i]];
        connection.query(addSql, addSqlParams, function(err, result) {
            if (err) {
                console.log('[SELECT ERROR] - ', err.message);
                return;
            }
            console.log(result);
        });
    }
    connection.end();
});

之后,就可以在数据库看到爬取到的标题数据了,如下图所示:

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

这样,目标二将爬取的所有标题储存在MySQL数据库也完成了,接下来是进行第三步,生成查询API。

生成API

这个主要参考 使用 MySQL 和 Node.js 构建 API如何轻松使用Node.JS创建API,需要安装依赖:

  • express

代码如下:

var mysql = require('mysql');
var request = require('request');
var cheerio = require('cheerio');
var iconv = require('iconv-lite');
const express = require('express');
var app = express();
app.use(express.json());
var arr = [];

option = {
    url: 'https://www.qb5.la/',
    encoding: null
}

var connection = mysql.createConnection({
    host: 'localhost', //数据库安装在了本地就用这个啦
    user: 'root',
    port: '3306',
    password: 'your password', //上一步设置的密码在此处用到了
});

connection.connect();

app.listen(3000, () => console.log("Express server is running at port no : 3000"));

app.get('/example', (req, res) => {
    connection.query('SELECT * FROM demo.novel', (err, rows, fields) => {
        if (!err)
            res.send(rows);
        else
            console.log(err);
    })
});

request(option, function(err, res, body) {
    if (err) throw err;
    body = iconv.decode(body, 'gbk');
    var $ = cheerio.load(body);
    $('.titletop ul>li').each(function() {
        arr.push($(this).find('a').text())
    });
    for (let i = 0; i < arr.length; i++) {
        let addSql = 'INSERT INTO demo.novel(id,title) VALUES(?,?)';
        let addSqlParams = [i + 1, arr[i]];
        connection.query(addSql, addSqlParams, function(err, result) {
            if (err) {
                console.log('[SELECT ERROR] - ', err.message);
                return;
            }
            console.log(result);
        });
    }
});

在POSTMAN调试效果如下图所示:

使用 Node.js 爬虫后将数据储存到MySQL数据库并生成API调用

这样,目标三也完成了。

三个目标都完成了,相信你也掌握了其中的涉及到的技术了。

分享至:
  • 我的微信
  • 微信扫一扫加好友
  • weinxin
  • 我的微信公众号
  • 扫描关注公众号
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: