Blog đầu tiên nên đặt tựa là gì?

Lời mở đầu


Chào mọi người, thật ngại quá. Đây là blog - có thể được gọi là đầu tiên của mình hiện tại. Trước đây mình từng viết blog về tình yêu, về những cảm nhận sâu sắc các thứ nhưng sau một thời gian thấy không hợp nên mình xóa hết rồi. Hehe, từ đây mình sẽ làm quen với những điều mới mẻ, lặng lẽ mà viết một blog của mình thôi.

Vậy… mình là ai?

Hiện tại mình đang là dev tại một công ty đầy tiềm năng trong lĩnh vực xây dựng. Công việc của cũng không xoay quanh gì ngoài những dòng code huyền bí, những UI hợp lý và những anh chị đầy nhiệt huyết luôn hết mình bất thình lình trong công việc. Không những thế, mình còn có hàng tá những ứng dụng muốn làm. Cái mình thiếu chỉ là thời gian mà thôi, hị hị.

Mục phụ

Cái gì cũng có sự bắt đầu, để đến mục đích phải có mục phụ, ai viết blog cũng sẽ trải qua những bài viết đầu tiên. Và, “mục phụ” của bài viết này là mình khoe mình đã có blog mới. Nhẹ hơn, lược giản hơn ít tính năng hơn. Nhưng mình thích là được.

Mục đích chính


Mục đích chính của mình vẫn là khoe blog của mình. Nhưng khoan, blog của mình hiện tại đang sử dụng github page - nếu bạn muốn xây dựng một website mà chỉ bao gồm HTML, CSS và Js. Bạn có thể xây dựng 1 static web hoàn toàn miễn phí phục vụ cho việc học tập hoặc thậm chí cho mục đích kinh doanh với nó https://pages.github.com.

  • Lợi ích của Github Page là dễ dàng cài đặt, dễ dàng commit các nội dung mới. Và hơn hết, nó nhẹ nữa.
  • Điểm khó khăn của Github Page là khó khăn với newbie, bạn sẽ tốn kha khá thời gian để vật lộn với github, với repository, với hexo, cách trỏ DNS hay thậm chí là cách viết bài với Markdown nữa. Nhưng đừng lo, vô số đàn anh đàn chị đi trước đã để lại một kho hướng dẫn đồ sộ trên google. Nên cũng không quá khó khăn nếu bạn là người mới đâu nhé!
  • Nếu bạn cảm thấy muốn phát triển một blog dễ dàng hơn, mình khuyến cáo bạn nên dùng wordpress.com. Giao diện trực quan, tạo xong tài khoản, up avatar, banner, đặt một tiêu đề thật chất, viết vài dòng nội dung là bạn có thể trở thành blogger rồi. Thú vị phải không nào.

Yêu

Thế giới hơn 8 tỷ người, hàng ngàn hàng triệu trang blog nhan nhản trên mang từng sứ mệnh riêng. Mình thừa nhận chúng ta có duyên số, nên nếu có thể, bạn hãy cho mình xin một số bình luận cho vui nhà vui blog. Giờ là 1 giờ sáng và mình đã đọc đi đọc lại 3 lần blog này, chứng tỏ mình trân trọng bạn đọc biết bao. Hị hị. Nếu bạn tò mò tại sao mình không giải thích cái tiêu đề thì bạn đoán đi.

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