寫在開頭
經(jīng)過一個漫長的寒假墩邀,終于也是趕上復工的潮流穆桂。祝賀全國人民抗"疫"取得階段性的勝利宫盔。
在平常的Node使用過程中,我主要就是爬取點東西享完。今天分享一個簡單的Node爬蟲程序灼芭。抓取某培訓站點的評論內(nèi)容。
1.引入依賴文件
const https = require('https'), //發(fā)送請求
fs = require('fs'), // fs文件操作
cheerio = require('cheerio'); // 類似于jQuery
2.定義類
class crawlData {
constructor(page) {
this.currentPage = 1;
this.page = page;
this.baseUrl = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // 因為涉及侵權(quán),就不掛鏈接了般又。
this.init();
}
}
3.定義Init()函數(shù)
/*
* 我們定義計時器來分開請求彼绷。因為了解到他的分頁請求費GET請求直接在URL后面拼接分頁參數(shù)即可。
*/
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.發(fā)送請求
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 () {
// 將請求到的內(nèi)容轉(zhuǎn)為jQuery可操作的DOM結(jié)構(gòu)
let data = Buffer.concat(chunks, size);
let html = data.toString();
let $ = cheerio.load(html);
// 獲取內(nèi)容茴迁,在頁面上自行通過F12開發(fā)者找到對應(yīng)的標簽內(nèi)容寄悯。
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.調(diào)用
new crawlData(10);
6.過程圖
7.結(jié)果
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);
完結(jié)撒花??????
- 本人博客地址:https://reinness.com 站點名稱:平凡的你我。 歡迎大家的到來堕义!