Dùng Node-Red làm bot lấy nội dung của trang và tự động gửi về email

Mọi người cho em hỏi em muốn làm một con bot lấy tên gói thầu trong trang http://dauthau.mpi.gov.vn/goi-thau?bid_nm=&bid_no=&aujusted_limited=0&institu_full_nm=&datetimestart=&datetimesend=&date_type=PUBLIC_DT&bid_target=bid
cùng với link chi tiết của gói thầu đó và tự động gửi về email lúc 7h sáng mỗi ngày. Dùng Node-red phải làm sao ạ do em có đồ án thầy giao, đây là lần đầu em gửi lên trang daynhauhoc để hỏi nên có sai sót gì mong mọi người thông cảm và giúp em với em cảm ơn rất nhiều.

Mặc dù biết chủ thớt có thể đã tìm ra cách và làm xong cái đồ án đó rồi nhưng vì mình khá rảnh nên mình vẫn sẽ bình luận =]]


Sau khi tra Google một chút thì có vẻ như Node-red là một tool dùng để làm dashboard thường dùng trong mấy dự án IoT, nghĩa là Node-red dùng để biểu thị cái dữ liệu ra, vấn đề là giờ là làm sao để lấy dữ liệu. Để crawl dữ liệu từ một website thì có hai cách:

  • Gửi request tới cái trang đó rồi xử lí dữ liệu: Đây là cách đơn giản, nhẹ nhàng và nhanh nhất. Trong Node.js, muốn gửi request thì có thể dùng một thư viện có sẵn tên là request còn nếu không thích thì có thể dùng thư viện bên ngoài như axios, got,… Xử lí dữ liệu thì cần còn tùy vào kết quả trả về từ server, nếu thuộc kiểu JSON thì khoẻ quá, parse sang object thôi, còn nếu là HTML thì cần phải dùng một thư viện parse code HTML, anh thì thích dùng Cheerio nó khá đơn giản và cú pháp giống jQuery.

  • Dùng thư viện headless browser: Giả sử như mọi chuyện không đơn giản chỉ cần gửi request lên server là xong mà cần phải chạy code JS trên web, giải captcha, giả lập user thì dùng headless browser, cách này khó hơn cũng như chậm hơn do phải chạy một cái trình duyệt nặng vài trăm MB, mà có vẻ như cái trang trên cũng thuộc dạng đơn giản, chỉ cần gửi request là xong.

Về phần gửi email thì cần phải tìm hiểu về REST, tạo tài khoản email ở chỗ nào free và có hỗ trợ API riêng, về khoản này thì chọn Gmail luôn cho nó nhanh.

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?