抓取
一、新建一个文件夹
文件夹不要是中文
二、下载第三方模块
cmd
进入文件夹地址,输入:npm init -y
进行初始化- 输入
npm i crawler mysql-ithm
下载爬虫和node-orm模板
三、导入模块
const Crawler = require("crawler");
const db = require('mysql-ithm')
四、利用爬虫模块进行抓取数据
- 在王者荣耀官网找到请求,所有英雄的ajax请求
- 其中他的响应就是所有英雄的信息(但是不是详细信息)
- 通过ename属性获取对应英雄的详细信息
比如:猪八戒的ename为:551
其英雄详细地址:
- 通过第三方模块
crawler
来获取所有的英雄详细信息
- 先通过请求herolist接口获取所有ename属性,循环访问所有的英雄详细信息页面,并为爬取详细信息页获取链接
- 在把请求到的数据写到一个数组中,以便做orm插入
var heros = []
var c = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function (error, res, done) {
if (error) {
console.log(error);
} else {
var $ = res.$;
//1.先通过请求herolist接口获取所有ename属性,循环访问所有的英雄详细信息页面
JSON.parse(res.body).forEach(element => {
// Queue just one URL, with default callback
let url = `https://pvp.qq.com/web201605/herodetail/${
element.ename}.shtml`
//为下个请求建立连接
xq.queue(url);
});
}
done();
}
});
// Queue just one URL, with default callback
c.queue('https://pvp.qq.com/web201605/js/herolist.json');
var xq = new Crawler({
maxConnections: 10,
// This will be called for each crawled page
callback: function (error, res, done) {
if (error) {
console.log(error);
} else {
var $ = res.$;
//写入一个数组中
heros.push({
heroName: $('.cover-name').text(),
heroSkill: $('.skill-name>b').first().text(),
heroIcon: 'http:' + $('.ico-play').prev().attr('src')
})
}
done();
}
});
入库
一、通过第三方orm插件建立连接,并创建表
const db = require('mysql-ithm')
db.connect({
host: 'localhost',//数据库地址
port: '3306',
user: 'root',//用户名,没有可不填
password: 'root',//密码,没有可不填
database: 'vido'//数据库名称
});
let heroModel = db.model('hero', {
heroName: String,
heroSkill: String,
heroIcon: String,
isDelete: String
});
二、用刚才存储数据的数组,写入到数据库中
- 但是这里有个问题要注意一下:
爬虫爬取数据是异步操作,我们必须要等到所有数据爬取完了,才写入数据库
这里我们通过绑定drain
等所有的数据都爬取完了才执行入库操作
//要等待所有的请求全部做完之后,才入库
xq.on('drain', function () {
heroModel.insert(heros, (err, result) => {
if (err == null) {
console.log('添加成功')
} else {
console.log('添加失败')
}
})
});
三、数据查看
通过上面一系列的操作我们就可以得到你想要的王者荣耀所有英雄的信息了