Cheerio là gì?

Cheerio là gì?


Đây là thư viện javascript rất mạnh dùng trong việc crawl dữ liệu, thư viện này cung cấp bộ Cheerio Selector gần giống như với jQuery Selector cho nên việc sử dụng
các hàm cũng tương tự như cách sử dụng jQuery Selector. Nói đơn giản bạn có sử dụng các hàm quen thuộc khi sử dụng jQuery ví dụ như : .html() để lấy đoạn mã html, attr( name, value ) để lấy thuộc tính phần tử,…
hệt như khi sử dụng Jquery, thông tin chi tiết về cách hoạt động của thư viện này bạn có thể tìm hiểu thêm tại đây.

Viết ứng dụng demo tự động thông báo khi có chương truyện mới


Luồng thực hiện của chúng ta như sau:

  • Bước 1: Lấy danh sách chương mới nhất của truyện
  • Bước 2: So sánh chương truyện này với chương truyện được lưu trong file json để biết được có chương truyện mới hay chưa, nếu file này chưa có tiến hành tạo mới
  • Bước 3: Nếu có chương truyện mới : lấy chi tiết truyện -> gửi email thông báo

Nào bắt tay vào thực hiện thôi


Thực hiện cài đặt thư viện cheerio và request ( thư viện này dùng gọi tới địa chỉ website muốn crawl dữ liệu)

[] [] [] [link text]
1
2
3
npm install cheerio --save
npm install request --save
npm install nodemailer --save

Thực hiện khai báo các thư viện cần thiết

1
2
3
4
const cheerio = require('cheerio');
const request = require('request');
const fs = require('fs');
const nodemailer = require('nodemailer');

Sau đó viết ra hàm Crawler thực hiện lấy chương mới nhất từ trang truyện -> so sánh với file json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
//   Hàm lấy dữ liệu từ website
function Crawler()
{
//Gửi 1 request tới website
request('http://truyencv.com/pham-nhan-tu-tien-chi-tien-gioi-thien/', function (err, res, body)
{
// Sử dụng cheerio.load để lấy dữ liệu trả về
var $ = cheerio.load(body);
// Lấy chương mới nhất của truyện
var newestChap = $('.list-overview .item .item-value a').text();
var obj = {
'newestChap' : newestChap
}
var json = JSON.stringify(obj);
// Kiểm tra file newchap.json tồn tại không
if (!fs.existsSync('newchap.json')) {
// Nếu chưa tồn tại tạo file mới
fs.writeFile('newchap.json', json, '', (err)=>{
if (err) throw err;
console.log('Tạo file newchap.json thành công!');
});
return;
}
// Đọc file newchap.json nằm trong thư mục dự án
fs.readFile('newchap.json', function readFileCallback(err, data)
{
if (err)
{
console.log('Đọc file newchap.json thất bại!');
return;
}
else
{
// Lấy chương truyện mới nhất từ file json
obj = JSON.parse(data);
var dbChap = obj.newestChap;
// So sánh 2 chương truyện nếu khác nhau -> đã có chương mới
if(newestChap !== dbChap)
{
// Lưu chương mới vào file newchap.json
fs.writeFile('newchap.json', json, '', (err)=>{
if (err) throw err;
console.log('Đã có chương mới!');
console.log('Cập nhật newchap.json thành công!');
});
// Lấy đường dẫn chương truyện mới
var detailUrl = $('.list-overview .item .item-value a').attr('href');
// Tạo yêu cầu mới -> lấy thông tin chương mới
request(detailUrl, (err, res, body)=>{
let cheerioDetail = cheerio.load(body);
let contentDetail = cheerioDetail('.truyencv-read-content .content').text();
// Gửi email thông báo
sendEmail(newestChap,contentDetail);

});
}
else{
console.log('Chưa có chương mới!');
}
}
});
})
}

Viết thêm hàm sendEmail sử dụng thư viện nodemailer để gửi như sau:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
function sendEmail(subject, content)
{
var transporter = nodemailer.createTransport({
service : 'gmail',
auth: {
user : 'xuanlocle2412@gmail.com',
pass : 'matkhaucuaban'
}
});
var mailOptions= {
from : 'xuanlocle2412@gmail.com',
to: 'xuanlocle2412@gmail.com',
subject : 'Pham nhan tu tien ra chuong moi '+subject,
text : content
}
transporter.sendMail(mailOptions, function(err, info){
if(err)
{
console.log('Lỗi khi gửi mail: ', err);
}
else
{
console.log('Đã gửi email: ', info.response);
}
});
}

Cuối cùng viết thêm 1 hàm lặp thao tác Crawler này 3 giây một lần

1
2
3
var timer = setInterval(function() {
return Crawler();
}, 5000);

Sau đó ta chạy lệnh node server.js trong cửa sổ command và chờ mail được gửi thôi!
Như vậy mình đã hướng dẫn cho các bạn làm 1 ví dụ demo đơn giản crawl dữ liệu với cheerio và nodejs. Cảm ơn và hẹn gặp lại các bạn trong những bài sau

Article
  1. 1. Cheerio là gì?
  2. 2. Viết ứng dụng demo tự động thông báo khi có chương truyện mới