Giới thiệu về Web Scraping với Node.js (JavaScript)

Cạo ,08-01-20225 phút đọc

Bạn đang tìm cách sử dụng công nghệ mới? Trích xuất web hoặc trích xuất web cung cấp cho bạn cách thu thập dữ liệu web có cấu trúc theo cách tự động. Ví dụ, trích xuất web được sử dụng trong thế giới thương mại điện tử để theo dõi giá cả của các dịch vụ và sản phẩm của đối thủ cạnh tranh. Các trường hợp sử dụng khác của trích xuất web

Mục lục

Bạn đang tìm cách sử dụng công nghệ mới? Trích xuất web hoặc trích xuất web cung cấp cho bạn cách thu thập dữ liệu web có cấu trúc theo cách tự động. Ví dụ, trích xuất web được sử dụng trong thế giới thương mại điện tử để theo dõi giá cả của các dịch vụ và sản phẩm của đối thủ cạnh tranh. Các trường hợp sử dụng khác của trích xuất web được đưa ra bên dưới.

  • Tìm dữ liệu xu hướng trên các trang mạng xã hội
  • Thu thập dữ liệu từ một trang web khác để sử dụng trên trang web của riêng bạn
  • Trích xuất địa chỉ email từ các trang web công khai email
  • Thu thập hình ảnh sản phẩm và dữ liệu bán hàng từ các cửa hàng trực tuyến

Bạn sẽ học cách thực hiện web scraping với Node.js. Nhưng trước tiên, chúng ta hãy xem Node.js là gì. Đây là một nền tảng phía máy chủ nguồn mở để phát triển các ứng dụng phía máy chủ và mạng. Thư viện của nó rất nhanh trong quá trình thực thi mã vì các ứng dụng của nó không lưu trữ bất kỳ dữ liệu nào. Chúng chỉ đơn giản là xuất dữ liệu thành từng phần. Dưới đây là một số lĩnh vực mà chúng ta có thể sử dụng Node.js.

  • Ứng dụng truyền dữ liệu
  • Ứng dụng trang đơn
  • Ứng dụng ràng buộc đầu vào/đầu ra
  • Ứng dụng thời gian thực dữ liệu chuyên sâu

Tại sao nên sử dụng Node.js để thu thập dữ liệu web?

Sau đây là những lý do nên sử dụng Node.js để thu thập dữ liệu web.

Dễ học – Javascript là ngôn ngữ lập trình phổ biến được các nhà phát triển front-end sử dụng. Họ có thể nhanh chóng học và sử dụng Node.js ở back-end vì đây là Javascript đơn giản. Vì vậy, họ không cần phải nỗ lực thêm để học Node.js.

Ngôn ngữ lập trình đơn – Bạn có thể sử dụng Node.js để viết các ứng dụng phía máy chủ bằng Javascript. Nói tóm lại, các nhà phát triển Node.js sử dụng Javascript để viết cả ứng dụng web frontend và backend. Họ không cần sử dụng bất kỳ ngôn ngữ lập trình phía máy chủ nào khác. Do đó, họ có thể dễ dàng triển khai các ứng dụng web vì hầu hết mọi trình duyệt web đều hỗ trợ Javascript. 

Khả năng mở rộng – Các nhà phát triển Node.js có thể dễ dàng mở rộng ứng dụng theo chiều ngang và chiều dọc. Họ có thể thêm các nút bổ sung vào các hệ thống hiện có để mở rộng ứng dụng theo chiều ngang. Họ có thể mở rộng ứng dụng theo chiều dọc bằng cách thêm các tài nguyên bổ sung vào các nút đơn. 

Hiệu suất cao – Node.js sử dụng công cụ Javascript V8 của Google để diễn giải mã Javascript khi biên dịch trực tiếp thành mã máy. Do đó, bạn có thể triển khai mã hiệu quả bằng công cụ này. 

Bộ nhớ đệm – Các nhà phát triển cũng có thể lưu trữ đệm các mô-đun riêng lẻ bằng môi trường thời gian chạy mã nguồn mở của Node.js. Bộ nhớ đệm cho phép các ứng dụng tải các trang web nhanh hơn, do đó các nhà phát triển không phải sử dụng lại các mã.   

Thu thập dữ liệu web bằng Node.js

Để thu thập dữ liệu web bằng Node.js, chúng tôi sẽ sử dụng hai mô-đun npm sau.

cheerio – Đây là công nghệ Javascript được sử dụng để trích xuất dữ liệu từ các trang web. Nó giúp chọn, chỉnh sửa và xem các phần tử DOM.

request-promise – Đây là một ứng dụng khách HTTP đơn giản mà bạn có thể sử dụng để thực hiện các cuộc gọi HTTP nhanh chóng và dễ dàng.

Thiết lập dự án

Bạn phải tạo một thư mục dự án mới. Tạo một tệp index.js trong thư mục đó. Sau đó, bạn phải cài đặt các phụ thuộc. Để làm điều này, hãy mở dòng lệnh và nhập lệnh sau. 

npm install --lưu yêu cầu yêu cầu -hứa hẹn chào

Bạn phải yêu cầu request-promise và cheerio trong tệp index.js của mình bằng cách sử dụng mã bên dưới.

const rp = yêu cầu( 'yêu cầu-hứa hẹn' ); const cheerio = yêu cầu( 'cheerio' );

Đặt yêu cầu

Bạn biết rằng request-promise là một 'request' của máy khách có hỗ trợ Promise. Nói cách khác, nó chấp nhận một đối tượng làm đầu vào và trả về một lời hứa. 

const options = {
 uri: `https://www.yourURLhere.com`,
 transform: function (body) {
   return cheerio.load(body);
 }
};

Trong đoạn mã trên, đối tượng tùy chọn phải thực hiện hai việc.

  • Truyền vào URL, bạn muốn thu thập
  • Tải mã HTML trả về bằng cheerio để bạn có thể sử dụng.

Khóa uri trong mã là trang web bạn muốn thu thập dữ liệu.

Phím chuyển đổi tải phần thân được trả về vào cheerio bằng cách sử dụng request-promise trước khi trả về cho chúng ta.

Đưa ra yêu cầu

Bạn có thể thực hiện yêu cầu của mình bằng cách sử dụng mã bên dưới.

rp(OPTIONS)
   .then(function (data) {
       // REQUEST SUCCEEDED: DO SOMETHING
   })
   .catch(function (err) {
       // REQUEST FAILED: ERROR OF SOME KIND
   });

Chúng ta đang truyền đối tượng options cho request-promise trong đoạn mã trên. Sau đó, chúng ta chờ xem yêu cầu của chúng ta thành công hay thất bại. 

Bây giờ, chúng ta tạo phiên bản mã riêng của mình trong đó sử dụng các hàm mũi tên như được hiển thị bên dưới.

rp(options)
 .then(($) => {
   console.log($);
 })
 .catch((err) => {
   console.log(err);
 });

Bạn phải thay thế uri giữ chỗ bằng trang web bạn muốn thu thập. Sau đó, bạn có thể mở bảng điều khiển và nhập nội dung sau vào tệp index.js.

{ [Function: initialize]
 fn:
  initialize {
    constructor: [Circular],
    _originalRoot:
     { type: 'root',
       name: 'root',
       namespace: 'http://www.w3.org/1999/xhtml',
       attribs: {},
       ...

Đây là cách bạn có thể thực hiện lần thu thập dữ liệu đầu tiên bằng Node.js. Sau đây là mã đầy đủ mà chúng tôi đã thực hiện cho đến nay.

const rp = require('request-promise');
const cheerio = require('cheerio');
const options = {
  uri: `https://www.google.com`,
  transform: function (body) {
    return cheerio.load(body);
  }
};

rp(options)
  .then(($) => {
    console.log($);
  })
  .catch((err) => {
    console.log(err);
  });

Sử dụng dữ liệu

Bạn có thể sử dụng cheerio để trích xuất dữ liệu bạn muốn. Việc triển khai bộ chọn của cheerio gần giống như của jQuery. Bạn có thể sử dụng phương thức bộ chọn để duyệt và chọn các phần tử trong tài liệu. Bạn cũng có thể sử dụng nó để lấy và đặt dữ liệu. Ví dụ, bạn muốn trích xuất HTML sau của một trang web.

< ; ul id = "thành phố" > ; < ; li class = "lớn" > ; Châu Âu < ; /li > ; < ; li id = "trung bình" > ; Thổ Nhĩ Kỳ < ; /li > ; < ; li class = "nhỏ" > ; Salem < ; /li > ; < ; /ul > ;

Chúng ta có thể sử dụng '#' để chọn id, '.' để chọn lớp. Các phần tử có thể được chọn theo tên thẻ của chúng như được hiển thị bên dưới.

$( '.large' ). text () // Châu Âu $( '#medium' ). text () // Thổ Nhĩ Kỳ $( 'li[class=small]' ).html()

Chúng ta có thể sử dụng hàm each() để lặp qua nhiều phần tử. Chúng ta có thể trả về văn bản bên trong của mục danh sách bằng cùng mã HTML như được hiển thị ở trên.

$('li').each(function(i, elem) {
 cities[i] = $(this).text();
});

Đây là cách bạn có thể trích xuất dữ liệu từ các trang web bằng Node.js. Bạn cũng có thể sử dụng các phương pháp bổ sung để trích xuất dữ liệu của các phần tử con của danh sách hoặc HTML của trang web.

Tầm quan trọng của việc sử dụng Node.js với Proxy

Bạn biết rằng proxy đóng vai trò là trung gian giữa máy khách yêu cầu tài nguyên và máy chủ cung cấp tài nguyên. Có ba loại proxy khác nhau, như được hiển thị bên dưới.

Proxy dân dụng – Proxy này chứa địa chỉ IP từ Nhà cung cấp dịch vụ Internet (ISP) địa phương, do đó trang web đích không thể xác định được đó là người thật hay trình thu thập dữ liệu đang duyệt trang web. 

Proxy trung tâm dữ liệu – Loại proxy này đến từ nhà cung cấp dịch vụ đám mây và được nhiều người sử dụng vì nó rẻ hơn proxy dân dụng.

Proxy di động – Proxy di động là IP của thiết bị di động riêng tư và hoạt động giống như proxy dân dụng. Chúng được cung cấp bởi các nhà mạng di động và rất đắt. 

Bạn có thể sử dụng proxy để thu thập dữ liệu web bằng mô-đun requests của Python. Trước tiên, bạn phải nhập mô-đun requests. Sau đó, bạn phải tạo một nhóm proxy và lặp lại chúng. Bạn có thể sử dụng requests.get() để gửi yêu cầu GET bằng cách truyền proxy làm tham số cho URL, như được hiển thị bên dưới.

import requests
proxy = 'http://114.121.248.251:8080'
url = 'https://ipecho.net/plain'
# Sending a GET request to the url and
# passing the proxy as a parameter.
page = requests.get(url,
                   proxies={"http": proxy, "https": proxy})
 # Printing the content of the requested url.
print(page.text)

Bạn sẽ nhận được kết quả như bên dưới.

Kết luận về Web Scraping sử dụng Node.js

Cho đến nay, chúng ta đã thảo luận rằng bạn có thể trích xuất dữ liệu có cấu trúc từ các trang web bằng phương pháp tự động gọi là web scraping. Bạn có thể trích xuất các trang web bằng các ngôn ngữ khác nhau, nhưng trong bài viết này, chúng ta đã học cách sử dụng Node.js để thu thập dữ liệu từ các trang web. Tất cả những gì chúng ta phải làm là thêm mã vào tệp index.js của thư mục dự án. Sau khi thiết lập dự án, chúng ta có thể thiết lập và thực hiện yêu cầu để trích xuất dữ liệu. Hơn nữa, chúng ta có thể sử dụng dữ liệu cho nhiều mục đích khác nhau. Bạn biết rằng việc trích xuất các trang web là không an toàn. Vì vậy, bạn phải sử dụng proxy để thu thập dữ liệu từ trang web mong muốn của mình. Bạn có thể sử dụng proxy dân dụng hoặc proxy trung tâm dữ liệu , nhưng tốt nhất là sử dụng proxy dân dụng vì chúng nhanh và không dễ bị phát hiện.