开篇寄语
在之前分享过一篇使用 Node.js 爬取数据的文章,并提供了页面是GBK格式的解决方案,以及使用 Node.js 操作数据库 并且生成API,以上都可以从下方的前情提要去查看,接下来,就是将以上的内容结合在一起,进行事件,即爬取数据后,将其存储在MySQL,并能够生成API进行调用,于是就有了今天这篇文章。
前情提要
- 《使用Nodejs爬取图片音频视频与Python相比平分秋色》
- 《用Nodejs爬取数据时无法解析GBK格式网站该如何是好?请看这篇》
- 《一文以Node.js 连接 MySQL为例操作数据库》
- 《如何轻松使用Node.JS创建API》
- 《使用 MySQL 和 Node.js 构建 API》
达成目标
- 使用Node.js构建爬虫,爬取一个网页编码格式是GBK格式的,分类小说的所有标题
- 将爬取的所有标题储存在MySQL数据库
- 之后用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()); });
先看一下爬取是否成功,如下图所示:
验证成功,接下来是怕取所有的标题,肯定是需要观察该网站首页的代码构成,右键——检查元素,找到各个小说标题的位置,如下图所示:
经过观察,在分类栏目中,小说位置在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()); }); });
调试结果如下图所示:
这样,目标一构建一个爬虫就完成了,接下来是将爬取的数据储存到数据库。
数据储存到数据库
储存数据到MySQL数据库,需要参阅这篇文章《 一文以Node.js 连接 MySQL为例操作数据库 》,安装以下依赖:
- mysql
先前往MySQL新建一个表格,设置id和标题,两栏即可,如下图所示:
接下来是连接数据库,在前情提要已经写了,这里就不再赘述,增加数据代码如下:
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(); });
之后,就可以在数据库看到爬取到的标题数据了,如下图所示:
这样,目标二将爬取的所有标题储存在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调试效果如下图所示:
这样,目标三也完成了。
三个目标都完成了,相信你也掌握了其中的涉及到的技术了。
- 我的微信
- 微信扫一扫加好友
- 我的微信公众号
- 扫描关注公众号