写在开头
经过一个漫长的寒假,终于也是赶上复工的潮流。祝贺全国人民抗"疫"取得阶段性的胜利。
在平常的 Node 使用过程中,我主要就是爬取点东西。今天分享一个简单的 Node 爬虫程序。抓取某培训站点的评论内容。
1.引入依赖文件
const https = require("https"), //发送请求
fs = require("fs"), // fs文件操作
cheerio = require("cheerio"); // 类似于jQuery
2.定义类
class crawlData {
constructor(page) {
this.currentPage = 1;
this.page = page;
this.baseUrl = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // 因为涉及侵权,就不挂链接了。
this.init();
}
}
3.定义 Init()函数
/*
* 我们定义计时器来分开请求。因为了解到他的分页请求费GET请求直接在URL后面拼接分页参数即可。
*/
init() {
let _self = this;
let time = setInterval(function () {
if (_self.currentPage > _self.page) {
clearInterval(time);
} else {
_self.getDataPackage(_self.baseUrl + `?page=${_self.currentPage}`, _self.currentPage);
_self.currentPage++;
}
}, 1000 * 1);
}
4.发送请求
getDataPackage(url, curPage) {
console.log(url);
let _self = this;
https.get(url, function (response) {
var chunks = [];
var size = 0;
response.on('data', function (chunk) {
chunks.push(chunk);
size += chunk.length;
});
response.on('end', function () {
// 将请求到的内容转为jQuery可操作的DOM结构
let data = Buffer.concat(chunks, size);
let html = data.toString();
let $ = cheerio.load(html);
// 获取内容,在页面上自行通过F12开发者找到对应的标签内容。
let result = [];
$('.cmt-list').find('.inner').each(i => {
let map = {};
map.user = $('.inner').eq(i).find('.hd').find('.name').text();
map.img = "http:" + $('.inner').eq(i).find('.hd').find('a').find('img').attr('src');
map.starts = $('.inner').eq(i).find('.hd').find('.stars').find('span').text();
map.content = $('.inner').eq(i).find('.cmt-txt').text();
result.push(map);
map = {};
})
// 处理JSON格式
let dataStr = JSON.stringify(result).trim().replace(/^\[/, curPage == 1 ? '[' : '').replace(/\]$/, curPage == _self.page ? ']' : ',');
// 通过fs写入
fs.writeFile('./pinglun.json', dataStr, {
'flag': 'a'
}, function (err) {
if (err) throw err;
console.log('写入成功');
});
});
});
}
5.调用
new crawlData(10);
6.过程图
7.结果
8.完整代码
完整代码
const https = require("https"),
fs = require("fs"),
cheerio = require("cheerio");
class crawlData {
constructor(page) {
this.currentPage = 1;
this.page = page;
this.baseUrl = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
this.init();
}
init() {
let _self = this;
let time = setInterval(function () {
if (_self.currentPage > _self.page) {
clearInterval(time);
} else {
_self.getDataPackage(_self.baseUrl + `?page=${_self.currentPage}`, _self.currentPage);
_self.currentPage++;
}
}, 1000 * 1);
}
getDataPackage(url, curPage) {
console.log(url);
let _self = this;
https.get(url, function (response) {
var chunks = [];
var size = 0;
response.on("data", function (chunk) {
chunks.push(chunk);
size += chunk.length;
});
response.on("end", function () {
let data = Buffer.concat(chunks, size);
let html = data.toString();
let $ = cheerio.load(html);
let result = [];
$(".cmt-list")
.find(".inner")
.each((i) => {
let map = {};
map.user = $(".inner").eq(i).find(".hd").find(".name").text();
map.img = "http:" + $(".inner").eq(i).find(".hd").find("a").find("img").attr("src");
map.starts = $(".inner").eq(i).find(".hd").find(".stars").find("span").text();
map.content = $(".inner").eq(i).find(".cmt-txt").text();
result.push(map);
map = {};
});
let dataStr = JSON.stringify(result)
.trim()
.replace(/^\[/, curPage == 1 ? "[" : "")
.replace(/\]$/, curPage == _self.page ? "]" : ",");
fs.writeFile(
"./pinglun.json",
dataStr,
{
flag: "a",
},
function (err) {
if (err) throw err;
console.log("写入成功");
}
);
});
});
}
}
new crawlData(10);
完结撒花🎉🎉🎉
Caleb https://reinness.com/posts/85 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自小陈博客 !