Sử dụng NodeJS và Puppeteer xây dựng web scrapping cách quốc gia ảnh hường COVID từ Wikipedia

Với tình hình covid hiện tại. Kết hợp học lập trình và tìm hiểu về covid. Trong bài viết này chúng ta sẽ tìm hiểu về kỹ thuật scrapping. Hãy cùng lướt qua nào


1112

Web Scrapping là gì?

Web Scrapping là một kỹ thuật trích xuất dữ liệu từ các trang web bằng cách phân tích các element HTML của các trang web. Những dữ liệu trích xuất được lưu trữ và sử dụng cho các phân tích và mục đích khác. Với bài viết này sẽ sử dụng NodeJS và Pupperteer

WEB SCRAPPING NODEJS
Web Scrapping

Mọi nội dung trong web được tạo bằng các phần tử html và chúng ta có thể phân tích các nội dung này và scrapping dữ liệu bằng NodeJS.

Đây là phần giới thiệu ngắn gọn về web scrapping, cho phép đào sâu và xem cách scrap dữ liệu khỏi bảng trong trang wikipedia.

Chúng ta sẽ làm gì?

Chúng ta sẽ trích xuất dữ liệu của các quốc gia bị ảnh hưởng covid từ wikipedia. Vì tất cả những gì chúng ta cần làm là trích xuất dữ liệu từ bảng sau đây trên trang. Mục tiêu cuối cùng là chuyển đổi từng hàng trong bảng thành một đối tượng json và tạo ra một mảng chứa tất cả các chi tiết covid của quốc gia bằng NodeJS

WEB SCRAPPING NODEJS
Web Scrapping

Hiểu những điều cơ bản

Trước khi trực tiếp nhảy vào code . Trước tiên chúng ta cần hiểu phần nào của trang chúng ta sẽ trích xuất và theo dõi đường dẫn html của phần tử cụ thể.

Để theo dõi các phần tử html, nhấp chuột phải vào bất kỳ vị trí nào trong trang và nhấp vào kiểm tra cửa sổ công cụ dev của Google xuất hiện, bạn có thể tìm thấy HTML của toàn bộ trang.

WEB SCRAPPING NODEJS
Kiểm tra trang web

Bạn có thể di chuột qua nội dung của trang và phần tử html của nội dung tương ứng sẽ được chọn. Trong hình ảnh bên dưới, bạn có thể tìm thấy cách theo dõi đường dẫn (cha mẹ & con) của phần tử html nội dung cụ thể.

Image for post
Di chuột qua trang wikipedia

Ở đây, có khoảng hơn 100 hàng, tất cả những gì chúng ta cần làm là lặp qua từng hàng và trích xuất dữ liệu từ phần tử con của hàng cụ thể đó.

Bắt đầu code bằng Puppeteer & NodeJS

Điều kiện tiên quyết

  1. NodeJS – cài đặt bằng lệnh sau
sudo apt install nodejs

2. npm

sudo apt install npm

Khởi tạo Project NodeJS

  1. Tạo một thư mục project
  2. Khởi tạo dự án với npm init trong terminal
npm init

3.Bạn có thể cài đặt puppeteer theo hai cách

npm i puppeteer

Tại đây, nó tải xuống một phiên bản Chromium (~ 170 MB Mac, ~ 282 MB Linux, ~ 280 MB Win) được đảm bảo để hoạt động với API.

npm i puppeteer-core

Puppeteer-core là phiên bản nhẹ của Puppeteer không cài đặt chromium theo mặc định và sử dụng trình duyệt hiện có.

Đó là điều để sử dụng bất kỳ một trong những điều trên, tôi sẽ tiến hành với ‘npm i puppeteer.

Sử dụng Puppeteer & Trích xuất dữ liệu

  1. Import puppeteer
Image for post
Import puppeteer

2. Tiếp theo chọn to Launch browser -> Open new page -> Go to the respective page.

{headless : false} : mở trình duyệt chromium

{headless : true} : không mở trình duyệt chromium

{waitUntil : ‘domContentloaded’} : chờ cho đến khi tải trang hoàn toàn

Image for post

3. Scrapping dữ liệu covid từ bảng của wikipedia

Chúng ta cần lặp lại qua tất cả các hàng và trích xuất dữ liệu phù hợp cho từng quốc gia.

Image for post
Wikipedia

page.$$eval(selector, pageFunction[, …args]) trả về một mảng gồm tất cả các phần tử khớp với tham số bộ chọn và chúng ta có thể đánh giá bằng cách xác định hàm riêng . ( để biết thêm chi tiết kiểm tra liên kết này puppeteer)

selector : chuyển danh sách đường dẫn / cha mẹ như trong hình dưới đây.

WEB SCRAPPING NODEJS

div#covid19-container table#thetable tbody tr’ là selector cho các hàng trong bảng. (lưu ý: phải cẩn thận với selector, bất kỳ bảng nào khác có tr cùng đường dẫn thì cũng có thể trả về các hàng của bảng đó)

id — sử dụng‘#’ và nối thêm id của phần tử cha..
class —sử dụng‘.’ nối thêm class của phần tử cha.

Khi các hàng được trích xuất, chúng được lặp lại từng cái một. Tên quốc gia hiện diện trong phần tử <a> và các chi tiết đếm khác có trong <td> được trích xuất tương ứng.

querySelector() trả về phần tử đầu tiên khớp với selector.
querySelectorAll() trả về tất cả các phần tử phù hợp với selector.

Các dữ liệu được trích xuất được lưu trữ trong một dict và đẩy đến một mảng.

Lưu trữ dữ liệu covid trong một tập tin

Image for post
Lưu trữ

JSON.stringfy() —cái này chuyển đổi một mảng các đối tượng json thành chuỗi .Và sau đó được ghi vào một tệp bằng mô-đun fs.

Đây là cách chúng ta trích xuất dữ liệu từ web. Dưới đây bạn có thể tìm thấy toàn bộ code . code link.

const puppeteer =  require('puppeteer')
const fs = require('fs')
const scrap = async () =>{
    const browser = await puppeteer.launch({headless : false}); //browser initiate
    const page = await browser.newPage();  // opening a new blank page
    await page.goto('https://en.wikipedia.org/wiki/2019%E2%80%9320_coronavirus_pandemic_by_country_and_territory', {waitUntil : 'domcontentloaded'}) // navigate to url and wait until page loads completely
    const recordList = await page.$$eval('div#covid19-container table#thetable tbody tr',(trows)=>{
        let rowList = []
        trows.forEach(row => {
                let record = {'country' : '','cases' :'', 'death' : '', 'recovered':''}
                record.country = row.querySelector('a').innerText; // (tr < th < a) anchor tag text contains country name
                const tdList = Array.from(row.querySelectorAll('td'), column => column.innerText); // getting textvalue of each column of a row and adding them to a list.
                record.cases = tdList[0];       // first column contains number of cases
                record.death = tdList[1];       // second column contains number of deaths
                record.recovered = tdList[2];   // third column contains number of recovered
                if(tdList.length >= 3){         // push only valid rows.
                    rowList.push(record)
                }
            });
        return rowList;
    })
    console.log(recordList)
    await page.screenshot({ path: 'screenshots/wikipedia.png' }); //screenshot
    browser.close();
    // writting to a file
    fs.writeFile('covid-19.json',JSON.stringify(recordList, null, 2),(err)=>{
        if(err){console.log(err)}
        else{console.log('Saved Successfully!')}
    })
};
scrap();

Kết luận

Qua bài viết chúng ta đã tìm hiểu được về xây dựng web scrapping bằng cách sử dụng NodeJS và Pupperteer

Tham khảo thêm về NodeJS : Unit test là gì – Jest testing NodeJS cho người mới bắt đầu


Like it? Share with your friends!

1112