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

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

Bạn đang tìm cách để sử dụng các công nghệ mới? Trích xuất web hoặc quét web cung cấp cho bạn một cách để thu thập dữ liệu web có cấu trúc một cách tự động. Ví dụ: quét web được sử dụng trong thế giới thương mại điện tử để theo dõi giá 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 web scraping

Mục lục

Bạn đang tìm cách để sử dụng các công nghệ mới? Trích xuất web hoặc quét web cung cấp cho bạn một cách để thu thập dữ liệu web có cấu trúc một cách tự động. Ví dụ: quét web được sử dụng trong thế giới thương mại điện tử để theo dõi giá 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 web scraping được đưa ra dưới đây.

  • Tìm dữ liệu thịnh hành 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 xuất bản email công khai
  • Cạo các cửa hàng trực tuyến để tìm hình ảnh sản phẩm và dữ liệu bán hàng

Bạn sẽ học cách quét web với Node.js. Nhưng trước tiên, chúng ta xem xét Node.js là gì. Nó là một nền tảng phía máy chủ mã nguồn mở để phát triển các ứng dụng mạng và phía máy chủ. Thư viện của nó rất nhanh trong việc thực thi mã vì các ứng dụng của nó không đệm bất kỳ dữ liệu nào. Họ chỉ đơn giản là xuất dữ liệu theo khối. 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
  • Các ứng dụng ràng buộc đầu vào / đầu ra
  • Các ứng dụng thời gian thực sử dụng nhiều dữ liệu

Tại sao nên sử dụng Node.js để quét web?

Sau đây là những lý do để sử dụng Node.js để quét web.

Dễ học - Javascript là một ngôn ngữ lập trình phổ biến được sử dụng bởi các nhà phát triển frontend. Họ có thể nhanh chóng tìm hiểu và sử dụng Node.js ở phần phụ trợ vì nó là một Javascript đơn giản. Vì vậy, họ không phải nỗ lực thêm vào việc 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 tất cả các 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 các ứng dụng theo hướng ngang và 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 các ứng dụng theo chiều ngang. Họ có thể mở rộng các ứng dụng theo chiều dọc bằng cách thêm 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 để giải thích mã Javascript khi nó biên dịch trực tiếp vào mã máy. Do đó, bạn có thể triển khai mã một cách hiệu quả bằng cách sử dụng công cụ này. 

Caching– Các nhà phát triển cũng có thể lưu trữ các mô-đun đơn lẻ bằng cách sử dụng môi trường thời gian chạy 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, vì vậy các nhà phát triển không phải sử dụng lại mã.   

Quét web bằng Node.js

Đối với web scraping sử dụng Node.js, chúng ta sẽ sử dụng hai mô-đun npm sau.

cổ vũ - Nó là một 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.

yêu cầu-hứa hẹn - Nó là một máy 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 tệp index.js trong thư mục đó. Sau đó, bạn phải cài đặt các phụ thuộc. Đối với điều này, mở dòng lệnh của bạn và nhập lệnh sau. 

Cài đặt npm --Lưu yêu cầu yêu cầu-Promise Cheerio

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ã dưới đây.

const rp = yêu cầu ('yêu cầu-lời hứa');
const cheerio = yêu cầu ('cheerio');

Đặt yêu cầu

Bạn biết rằng request-promise là một 'yêu cầu' của khách hàng với sự hỗ trợ của 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 code trên, đối tượng options phải làm hai việc.

  • Đi qua URL, bạn muốn cạo
  • Tải HTML trả về bằng cheerio để bạn có thể sử dụng nó.

Khóa uri trong mã là trang web bạn muốn cạo.

Phím biến đổi tải cơ thể trả về vào cheerio bằng cách sử dụng request-promise trước khi trả lại cho chúng tôi.

Đư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 vào request-promise trong đoạn code trên. Sau đó, chúng tôi chờ xem yêu cầu của chúng tôi thành công hay thất bại. 

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

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 cạo. Sau đó, bạn có thể mở bảng điều khiển của mình 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ể tạo ra vết xước đầu tiên của mình bằng cách sử dụng Node.js. Đây là mã đầy đủ mà chúng tôi đã làm 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ư jQuery. Bạn có thể sử dụng phương pháp 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à thiết lập dữ liệu. Ví dụ: bạn muốn cạo HTML sau của một trang web.

<;ul id="cities">;
 <;li class="large">;Europe<;/li>;
 <;li id="medium">;Turkey<;/li>;
 <;li class="small">;Salem<;/li>;
<;/ul>;

Chúng ta có thể sử dụng '#' để chọn id's, '.' để chọn class. Các phần tử có thể được chọn theo tên thẻ của chúng như hình dưới đây.

$('.large'). văn bản()
 Châu Âu
$('#medium'). văn bản()
 Gà tây
$('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ách sử dụng cùng một 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ể cạo dữ liệu từ các trang web bằng cách sử dụ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ò trung gian giữa khách hàng 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 cư - Proxy này chứa địa chỉ IP từ Nhà cung cấp dịch vụ Internet địa phương (ISP), vì vậy trang web mục tiêu không thể xác định xem đó là người thật hay người quét duyệt trang web. 

Proxy trung tâm dữ liệu - Loại proxy này là từ một nhà cung cấp dịch vụ đám mây và được sử dụng bởi một số lượng lớn người vì nó rẻ hơn so với proxy dân cư.

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

Bạn có thể sử dụng proxy để quét web bằng cách sử dụng mô-đun yêu cầu của Python. Đầu tiên, bạn phải nhập mô-đun yêu cầu. 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ố đến 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ả dưới đây.

Kết luận về quét web bằng cách sử dụng Node.js

Cho đến nay, chúng tôi đã 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 được gọi là quét web. Bạn có thể cạo 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 tôi đã 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à đưa ra 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 các mục đích khác nhau. Bạn biết nó không an toàn để cạo các trang web. 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 trung tâm dữ liệu , nhưng ưu tiên sử dụng proxy dân dụng vì chúng nhanh và không thể dễ dàng phát hiện.