Trình thu thập thông tin nodejs github

Hướng dẫn cách thu thập dữ liệu của một trang web bằng cách sử dụng Node. js, sử dụng một số gói hỗ trợ, tùy thuộc vào mức độ phức tạp của dữ liệu của trang web mà có những cách để thu thập thông tin khác nhau

Trình thu thập thông tin nodejs github

Trình thu thập thông tin nodejs github

Bài viết này đã được đăng tại freetuts. net , không được sao chép dưới mọi hình thức.

Thu thập thông tin là một kỹ thuật sử dụng kỹ thuật để lấy dữ liệu từ một trang web bằng cách tách dữ liệu ra khỏi một trang web nào đó, đây là một kỹ thuật được sử dụng rất nhiều, điển hình là Google bot. Kỹ thuật thu thập dữ liệu được sử dụng rộng rãi Mục đích lấy dữ liệu từ các trang web khi không được cung cấp 1 API cho phép lấy dữ liệu trực tiếp

1. Cần hiểu trước khi Thu thập dữ liệu trang web bằng NodeJS

Có thể nói rằng crawl ( "cào"

Trình thu thập thông tin nodejs github
) dữ liệu của 1 trang web là một kỹ thuật cho phép thu thập các dữ liệu có trên trang web. Công cụ thu thập dữ liệu sẽ truy cập vào đường dẫn cần lấy dữ liệu, sau đó tiến trình bóc tách để lấy dữ liệu về.

Thu thập dữ liệu từ một trang web được sử dụng với nhiều mục đích. Có thể là tổng hợp tin tức từ các trang báo mạng để tạo ra 1 trang báo đầy đủ, hoặc lấy thời gian khóa biểu từ trang đăng ký học của nhà trường,. Nhưng về luật thì điều này không được phép, chúng ta cần phải xin phép chủ sở hữu website

Bài viết này đã được đăng tại [free tuts. bọc lưới]

Có rất nhiều cách để thu thập dữ liệu từ một trang web bằng NodeJS, tùy theo mức độ phức tạp của dữ liệu mà chúng ta sẽ có những cách khác nhau

Hiện ứng dụng web này được xây dựng theo 2 loại chính đó là SPA (ứng dụng một trang) và MPA (ứng dụng nhiều trang), với mỗi loại sẽ có những cách thu thập thông tin khác nhau

Điển hình là Freetuts được xây dựng theo kiểu truyền thống đó là MPA, khi bạn xem nguồn thì chúng ta sẽ thấy tất cả dữ liệu trong nguồn

Còn Zingmp3 thì build theo kiểu SPA, khi view-source ra thì toàn thấy các script mã quỷ. Các trang SPA thì việc crawl đơn giản hơn rất nhiều vì họ sẽ nhận dữ liệu từ API, chúng ta chỉ cần gọi API là có thể lấy dữ liệu. MPA sẽ khó hơn bởi dữ liệu ở định dạng HTML nên việc bao bọc sẽ khó hơn, không những thế có những trang web dữ liệu cần lấy khá phức tạp

2. Thu thập dữ liệu trang web bằng NodeJS

Bài viết này sẽ thực hiện thu thập dữ liệu đối với các trang "hệ thống truyền tải" và điển trong ví dụ này là lấy tên và liên kết của một hướng dẫn trên trang freetuts. bọc lưới. Trước tiên, chúng ta cần chuẩn bị một vài công cụ hỗ trợ

Hỗ trợ cài đặt công cụ

Khi thực sự thu thập dữ liệu hiện tại bằng NodeJS, chúng ta phải cài đặt một số công cụ, vì trang mình muốn thu thập dữ liệu là một trang MPA và dữ liệu cần tách rời khá đơn giản nên chỉ cần một vài gói như vậy

  • cheerio - Hỗ trợ phân tích cú pháp DOM giống như jQuery, nó rất nhẹ và khá quen thuộc. Xem tài liệu về cổ vũ ở trang chủ
  • request-promise - hỗ trợ công việc lấy mã nguồn của trang cần cào, thư viện này được xây dựng dựa trên yêu cầu của thư viện và lời hứa hỗ trợ
  • Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    0 - thư viện hỗ trợ làm việc với tệp trong Node. js

Để cài đặt chúng ta chỉ cần mở thiết bị đầu cuối và nhập dòng lệnh

npm i cheerio request-promise

Sau khi cài đặt hoàn tất, chúng ta sẽ đi vào phân tích sâu hơn trang web cần gỡ dữ liệu

Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
Trình thu thập thông tin nodejs github

Phân tích trang web cần thu thập thông tin

Chúng ta sẽ thực hiện thu thập dữ liệu ở các bài viết trong phần ReactJS cơ bản, với những dữ liệu cần thu thập là tên, miêu tả của hướng dẫn và các bài viết trong mỗi chương trình đó. Sau khi phân tích, chúng ta sẽ thấy vị trí của dữ liệu chúng ta cần lấy

  • Tên hướng dẫn. nằm trong thẻ
    Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    1 có id là
    Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    2
  • Mô tả của hướng dẫn. is in class
    Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    3 with thẻ
    Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    0
  • Chương của bài viết sẽ nằm trong một bảng, với tên chương là
    Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    1 và các bài viết nằm trong thẻ
    Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
    Trình thu thập thông tin nodejs github
    2

Trình thu thập thông tin nodejs github

Tiến hành thu thập dữ liệu

Sau khi cài đặt các gói và phân tích các thành phần chúng ta sẽ tiến hành thu thập dữ liệu. Mình sẽ làm việc với file

Vì đây là một trang với dữ liệu không quá phức tạp và dữ liệu không thay đổi theo thời gian thực nên mình sử dụng request-promise và cheerio, nhưng đối với những web phức tạp thì người ta sẽ dùng puppeteer. Bạn có thể tìm hiểu thêm về nó nhé ! Pupperteer khá mạnh trong khoản crawl này nhưng cũng khá nặng vì nó "vác" luôn hẳn cái trình duyệt vào 
Trình thu thập thông tin nodejs github
3. Trước tiên, chúng ta cần nhập các mô-đun cần thiết

//file: index.js
const rp = require("request-promise");
const cheerio = require("cheerio");
const fs = require("fs");

const URL = `https://freetuts.net/reactjs/tu-hoc-reactjs`;

const options = {
  uri: URL,
  transform: function (body) {
    //Khi lấy dữ liệu từ trang thành công nó sẽ tự động parse DOM
    return cheerio.load(body);
  },
};

(async function crawler() {
  try {
    // Lấy dữ liệu từ trang crawl đã được parseDOM
    var $ = await rp(options);
  } catch (error) {
    return error;
  }

  /* Lấy tên và miêu tả của tutorial*/
  const title = $("#main_title").text().trim();
  const description = $(".entry-content > p").text().trim();

  /* Phân tích các table và sau đó lấy các posts.
     Mỗi table là một chương 
  */
  const tableContent = $(".entry-content table");
  let data = [];
  for (let i = 0; i < tableContent.length; i++) {
    let chaper = $(tableContent[i]);
    // Tên của chương đó.
    let chaperTitle = chaper.find("thead").text().trim();
  
    
    //Tìm bài viết ở mỗi chương
    let chaperData = []
    const chaperLink = chaper.find("tbody").find("a");
    for (let j = 0; j < chaperLink.length; j++) {
      const post = $(chaperLink[j]);
      const postLink = post.attr("href");
      const postTitle = post.text().trim();
      chaperData.push({
        postTitle,
        postLink,
      });
    }
    data.push({
      chaperTitle,
      chaperData,
    });
  }
  
  // Lưu dữ liệu về máy
  fs.writeFileSync('data.json', JSON.stringify(data))
})();

Như đã phân tích ở trên thì mỗi bảng sẽ là một chương trình, do đó chúng ta sẽ sử dụng cheerio để tìm và phân tích. Sau khi phân tích thành công chúng ta sẽ lưu về dưới dạng JSON. Để chạy dự án sử dụng câu lệnh

node index

Và đây là kết quả nhận được sau khi thu thập dữ liệu thành công

Trình thu thập thông tin nodejs github

Trên đây là những kiến ​​thức cơ bản về thu thập dữ liệu trang web bằng NodeJS. Mong bài viết này có thể giúp ích cho bạn trong việc lập trình với NodeJS, cảm ơn bạn đã quan tâm đến bài viết này