Scraping web là một kỹ thuật mạnh mẽ để trích xuất dữ liệu từ các trang web, được sử dụng rộng rãi trong phân tích dữ liệu, nghiên cứu thị trường và tổng hợp nội dung. Đến năm 2026, việc sử dụng Cheerio và Node.js cho scraping web vẫn tiếp tục là một phương pháp phổ biến và hiệu quả. Bài viết này sẽ đi sâu vào quy trình sử dụng Cheerio và Node.js cho scraping web, cung cấp hướng dẫn toàn diện và một ví dụ thực tế.
Mục lục
Cheerio là gì?
Yêu cầu tiên quyết
Thiết lập dự án
API chọn phần tử của Cheerio
Viết script scraping
Chạy script
Thách thức trong scraping web với Cheerio
Xử lý CAPTCHA trong scraping web
Xử lý trang động
Kết luận
Cheerio là gì?
Cheerio là một triển khai nhanh, linh hoạt và nhẹ của jQuery, được thiết kế đặc biệt cho các ứng dụng phía máy chủ. Nó cho phép các nhà phát triển phân tích và thao tác các tài liệu HTML bằng cách sử dụng cú pháp giống jQuery quen thuộc trong môi trường Node.js. Khác với các công cụ dựa trên trình duyệt, Cheerio không thực hiện việc hiển thị web thực tế mà thao tác trực tiếp trên chuỗi HTML, giúp nó trở nên hiệu quả đặc biệt cho nhiều nhiệm vụ scraping. Bên cạnh đó Puppeteer là một lựa chọn thay thế tuyệt vời cho scraping với Cheerio.
Yêu cầu tiên quyết
Trước khi bắt đầu với mã, hãy đảm bảo rằng bạn đã cài đặt Node.js và npm (Node Package Manager) trên hệ thống của mình. Nếu chưa cài đặt, bạn có thể tải và cài đặt chúng từ trang web chính thức của Node.js.
Thiết lập dự án
Bước 1: Tạo một thư mục dự án mới
Trước tiên, tạo một thư mục mới cho dự án của bạn và khởi tạo nó thành một dự án Node.js:
bashCopy
mkdir web-scraping
cd web-scraping
npm init -y
Cờ -y tự động trả lời "có" cho tất cả các lời nhắc, tạo ra một tệp package.json mặc định.
Bước 2: Cài đặt các phụ thuộc
Tiếp theo, cài đặt các phụ thuộc cần thiết, bao gồm axios để thực hiện các yêu cầu HTTP và cheerio để phân tích HTML:
bashCopy
npm install axios cheerio
Vướng mắc với việc thất bại lặp đi lặp lại trong việc giải CAPTCHA khó chịu?
Khám phá công nghệ giải CAPTCHA tự động liền mạch với Capsolver công nghệ Auto Web Unblock được hỗ trợ bởi AI!
Yêu cầu mã thưởng của bạn Mã thưởng để có được giải pháp CAPTCHA hàng đầu; CapSolver. |: WEBS. Sau khi sử dụng, bạn sẽ nhận thêm 5% thưởng sau mỗi lần nạp tiền, Không giới hạn
API chọn phần tử của Cheerio
Cheerio là một triển khai nhanh, linh hoạt và nhẹ của jQuery cốt lõi, được thiết kế đặc biệt cho phía máy chủ. Nó cho phép bạn sử dụng cú pháp giống jQuery để thao tác các tài liệu HTML trong môi trường Node.js.
Dưới đây là giải thích chi tiết về API chọn phần tử của Cheerio với các ví dụ mã:
Tải tài liệu HTML:
javascriptCopy
const cheerio = require('cheerio');
const html = `
<html>
<head>
<title>Ví dụ</title>
</head>
<body>
<h1 class="title">Xin chào, thế giới!</h1>
<div id="content">
<p>Đây là một đoạn văn.</p>
<a href="https://example.com">Liên kết</a>
</div>
</body>
</html>
`;
const $ = cheerio.load(html);
Chọn phần tử:
Chọn phần tử:
javascriptCopy
const h1 = $('h1'); // Chọn tất cả các phần tử <h1>
console.log(h1.text()); // Đầu ra: Xin chào, thế giới!
Chọn lớp:
javascriptCopy
const title = $('.title'); // Chọn các phần tử có lớp "title"
console.log(title.text()); // Đầu ra: Xin chào, thế giới!
Chọn ID:
javascriptCopy
const content = $('#content'); // Chọn phần tử có id="content"
console.log(content.html()); // Đầu ra: <p>Đây là một đoạn văn.</p><a href="https://example.com">Liên kết</a>
Chọn thuộc tính:
javascriptCopy
const link = $('a[href="https://example.com"]'); // Chọn phần tử <a> với thuộc tính href cụ thể
console.log(link.text()); // Đầu ra: Liên kết
Duyệt và thao tác phần tử:
Duyệt phần tử:
javascriptCopy
$('p').each((index, element) => {
console.log($(element).text()); // Đầu ra nội dung văn bản của mỗi phần tử <p>
});
Thay đổi nội dung phần tử:
javascriptCopy
$('h1.title').text('Tiêu đề mới'); // Thay đổi nội dung văn bản của phần tử <h1>
console.log($('h1.title').text()); // Đầu ra: Tiêu đề mới
Thêm và xóa phần tử:
javascriptCopy
$('#content').append('<p>Một đoạn văn khác.</p>'); // Thêm một phần tử <p> mới bên trong #content
console.log($('#content').html()); // Đầu ra: <p>Đây là một đoạn văn.</p><a href="https://example.com">Liên kết</a><p>Một đoạn văn khác.</p>
$('a').remove(); // Xóa tất cả các phần tử <a>
console.log($('#content').html()); // Đầu ra: <p>Đây là một đoạn văn.</p><p>Một đoạn văn khác.</p>
Những ví dụ này minh họa cách bạn có thể sử dụng API chọn phần tử của Cheerio để chọn, duyệt và thao tác các phần tử HTML theo cách tương tự như jQuery, nhưng trong môi trường Node.js.
Viết script scraping
Tạo một tệp có tên scraper.js trong thư mục dự án của bạn. Tệp này sẽ chứa script để trích xuất dữ liệu từ trang web đích. Thêm đoạn mã sau vào scraper.js:
javascriptCopy
const axios = require('axios');
const cheerio = require('cheerio');
// URL đích
const url = 'https://example.com';
async function fetchData() {
try {
// Gửi yêu cầu HTTP để lấy nội dung HTML
const { data } = await axios.get(url);
// Tải tài liệu HTML vào Cheerio
const $ = cheerio.load(data);
// Trích xuất dữ liệu từ HTML
const title = $('title').text();
const headings = [];
$('h1, h2, h3').each((index, element) => {
headings.push($(element).text());
});
// Hiển thị dữ liệu trích xuất
console.log('Tiêu đề:', title);
console.log('Tiêu đề:', headings);
} catch (error) {
console.error('Lỗi trích xuất dữ liệu:', error);
}
}
fetchData();
Giải thích mã
Nhập module: Script bắt đầu bằng cách nhập các module axios và cheerio.
Định nghĩa URL đích: URL của trang web cần scraping được định nghĩa.
Trích xuất dữ liệu: Hàm fetchData gửi yêu cầu HTTP GET đến URL đích bằng axios. Dữ liệu phản hồi (nội dung HTML) sau đó được tải vào Cheerio.
Phân tích HTML: Sử dụng cú pháp giống jQuery của Cheerio, script trích xuất nội dung của thẻ <title> và tất cả các thẻ <h1>, <h2>, <h3>.
Hiển thị kết quả: Dữ liệu trích xuất được ghi vào console.
Chạy script
Để chạy script scraping, thực hiện lệnh sau trong terminal của bạn:
bashCopy
node scraper.js
Nếu mọi thứ được thiết lập đúng, bạn nên thấy tiêu đề trang web được trích xuất và nội dung của tất cả các thẻ tiêu đề được in ra console.
Thách thức trong scraping web với Cheerio
Mặc dù Cheerio mang lại nhiều lợi ích cho scraping web, nó cũng có những thách thức riêng mà các nhà phát triển có thể gặp phải:
Trang web động và JavaScript: Một trong những thách thức chính với Cheerio là xử lý các trang web động dựa trên JavaScript. Các trang web hiện đại thường sử dụng JavaScript để tải nội dung động sau lần tải trang ban đầu. Vì Cheerio phân tích HTML tĩnh, nó có thể không bắt được nội dung được tạo động, điều này có thể làm giảm hiệu quả của việc scraping.
Các biện pháp chống scraping: Các trang web triển khai nhiều biện pháp chống scraping để ngăn chặn việc trích xuất dữ liệu tự động:
CAPTCHA: Vấn đề lớn bạn có thể gặp phải khi scraping được thiết kế để phân biệt giữa người dùng và bot, CAPTCHA yêu cầu người dùng hoàn thành các nhiệm vụ như nhận diện hình ảnh hoặc nhập văn bản.
Chặn IP: Các trang web có thể chặn các địa chỉ IP liên quan đến hoạt động scraping để ngăn chặn yêu cầu quá mức.
Phát hiện User-Agent: Phát hiện User-Agent không chuẩn hoặc đáng ngờ giúp các trang web xác định và chặn các bot scraping.
Trang web động: Các trang web sử dụng nội dung JavaScript động có thể gây khó khăn vì nội dung có thể không truy cập được trực tiếp thông qua phân tích HTML tĩnh của Cheerio.
Là một nhà phát triển scraping web, việc hiểu rõ những thách thức này là rất quan trọng để giải quyết chúng hiệu quả. Có nhiều chiến lược để giảm thiểu các vấn đề này, và trong các phần tiếp theo, chúng tôi sẽ giải thích cách giải quyết hai vấn đề lớn nhất trong scraping: giải CAPTCHA và xử lý trang động:
Xử lý CAPTCHA trong scraping web
CAPTCHA tạo ra thách thức lớn trong scraping web vì chúng được thiết kế để phân biệt giữa người dùng và bot. Khi gặp phải, script scraping của bạn phải giải CAPTCHA để tiếp tục hiệu quả. Đối với các dự án scraping quy mô lớn, các giải pháp như CapSolver cung cấp khả năng giải CAPTCHA chính xác cao và nhanh chóng.
Tích hợp các công cụ giải CAPTCHA
Nhiều dịch vụ giải CAPTCHA có thể được tích hợp vào script scraping của bạn. Dưới đây, chúng tôi tập trung vào CapSolver:
Sau khi đăng ký, hãy lấy khóa API của bạn từ trang chủ.
Mã mẫu tích hợp CapSolver
Việc tích hợp CapSolver vào dự án scraping hoặc tự động hóa của bạn là đơn giản. Dưới đây là ví dụ bằng Python cho thấy cách sử dụng API của CapSolver:
pythonCopy
# pip install requests
import requests
import time
# TODO: thiết lập cấu hình của bạn
api_key = "KHÓA_API_CỦA_BẠN" # khóa API của CapSolver
site_key = "6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-" # khóa site reCAPTCHA của trang đích
site_url = "" # URL của trang đích
def solve_captcha():
payload = {
"clientKey": api_key,
"task": {
"type": 'ReCaptchaV2TaskProxyLess',
"websiteKey": site_key,
"websiteURL": site_url
}
}
res = requests.post("https://api.capsolver.com/createTask", json=payload)
resp = res.json()
task_id = resp.get("taskId")
if not task_id:
print("Không thể tạo nhiệm vụ:", res.text)
return
print(f"Nhận taskId: {task_id} / Đang lấy kết quả...")
while True:
time.sleep(3) # thời gian chờ
payload = {"clientKey": api_key, "taskId": task_id}
res = requests.post("https://api.capsolver.com/getTaskResult", json=payload)
resp = res.json()
status = resp.get("status")
if status == "ready":
return resp.get("solution", {}).get('gRecaptchaResponse')
if status == "failed" or resp.get("errorId"):
print("Giải CAPTCHA thất bại! Trả lời:", res.text)
return
captcha_token = solve_captcha()
print(captcha_token)
Script này minh họa cách sử dụng API của CapSolver để giải các thách thức reCAPTCHA. Việc tích hợp giải pháp này vào dự án scraping của bạn sẽ tăng hiệu quả bằng cách tự động hóa việc giải CAPTCHA, từ đó làm cho quy trình trích xuất dữ liệu trở nên mượt mà hơn.
Xử lý trang động
Đối với các trang web tải nội dung động thông qua JavaScript, bạn có thể cần sử dụng trình duyệt không đầu (headless browser) như puppeteer. Puppeteer có thể mô phỏng hành vi của người dùng duyệt web, cho phép bạn trích xuất nội dung chỉ xuất hiện sau khi thực thi JavaScript.
Ví dụ với Puppeteer
Dưới đây là một ví dụ ngắn về cách sử dụng Puppeteer cùng với Cheerio:
Script này khởi chạy trình duyệt không đầu, điều hướng đến URL đích và lấy nội dung HTML sau khi thực thi JavaScript. Sau đó, nó sử dụng Cheerio để phân tích HTML và trích xuất dữ liệu mong muốn.
Kết luận
Scraping web với Cheerio và Node.js là sự kết hợp mạnh mẽ để trích xuất dữ liệu từ trang web một cách hiệu quả. Cú pháp giống jQuery của Cheerio giúp bạn dễ dàng duyệt và thao tác tài liệu HTML, trong khi Node.js cung cấp môi trường vững chắc để xử lý yêu cầu HTTP và xử lý dữ liệu.
Tuy nhiên, các nhà phát triển cần nhận thức về các thách thức do nội dung động và các biện pháp chống scraping như CAPTCHA. Việc tích hợp các giải pháp như CapSolver có thể giúp vượt qua những trở ngại này, đảm bảo script scraping của bạn vẫn hiệu quả và đáng tin cậy.
Tôi hy vọng bài viết này giúp bạn bắt đầu với scraping web vào năm 2026 và cung cấp dữ liệu hữu ích cho các dự án của bạn!
Tuyên bố Tuân thủ: Thông tin được cung cấp trên blog này chỉ mang tính chất tham khảo. CapSolver cam kết tuân thủ tất cả các luật và quy định hiện hành. Việc sử dụng mạng lưới CapSolver cho các hoạt động bất hợp pháp, gian lận hoặc lạm dụng là hoàn toàn bị cấm và sẽ bị điều tra. Các giải pháp giải captcha của chúng tôi nâng cao trải nghiệm người dùng trong khi đảm bảo tuân thủ 100% trong việc giúp giải quyết các khó khăn về captcha trong quá trình thu thập dữ liệu công khai. Chúng tôi khuyến khích việc sử dụng dịch vụ của chúng tôi một cách có trách nhiệm. Để biết thêm thông tin, vui lòng truy cập Điều khoản Dịch vụ và Chính sách Quyền riêng tư.