Contents
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

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

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.

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ể.

Ở đâ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
- 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
- Tạo một thư mục project
- 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
- 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

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.

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.

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

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

Bài viết này được sưu tầm và tổng hợp từ nhiều nguồn trên Internet.
Nếu có gì không hiểu thì inbox messenger bên dưới mình hỗ trợ thêm nhé.