🥳Hãy tham gia Cộng đồng ScrapelessYêu cầu dùng thử miễn phí để truy cập Bộ công cụ quét web mạnh mẽ của chúng tôi!
Quay lại Blog

Cách Web Scraping với Cheerio

Sophia Martinez
Sophia Martinez

Specialist in Anti-Bot Strategies

01-Nov-2024

Web scraping cho phép chúng ta thu thập thông tin từ các trang web để phân tích và sử dụng trong nhiều ứng dụng, từ theo dõi giá cả của đối thủ cạnh tranh đến trích xuất các tập dữ liệu lớn. Trong hướng dẫn này, chúng tôi sẽ tập trung vào Cheerio, một công cụ mạnh mẽ để thu thập dữ liệu và phân tích cú pháp HTML, đặc biệt phù hợp với các trang tĩnh. Tại đây, chúng tôi sẽ hướng dẫn bạn cách thiết lập một trình thu thập dữ liệu dựa trên Cheerio, đi sâu vào các kỹ thuật phân tích cú pháp cần thiết và sử dụng một ví dụ thực tế để giới thiệu các ứng dụng thực tế của nó.

Cheerio là gì?

Cheerio là một thư viện Node.js mạnh mẽ và linh hoạt dựa trên htmlparser2, cung cấp API theo phong cách jQuery để xử lý và thao tác các phần tử DOM ở phía máy chủ. Điều này làm cho nó trở thành một lựa chọn phổ biến cho web scraping, vì nó cung cấp các phương thức hiệu quả cho phân tích cú pháp HTML và trích xuất dữ liệu. Các API đơn giản, linh hoạt của nó làm cho Cheerio trở thành lựa chọn hàng đầu cho các tác vụ thu thập dữ liệu trên web trên nhiều dự án do dễ sử dụng và tốc độ xử lý.

Tại sao nên chọn Cheerio để thu thập dữ liệu trên web?

Cheerio được ưa chuộng rộng rãi cho web scraping trong Node.js, đặc biệt là khi xử lý nội dung HTML tĩnh. Tính chất nhẹ và nhanh của nó làm cho nó trở nên lý tưởng cho các trường hợp mà hiển thị JavaScript không được yêu cầu. Không giống như các công cụ dựa trên trình duyệt như Puppeteer hoặc Playwright, Cheerio trực tiếp phân tích cú pháp HTML mà không cần tải toàn bộ trang, điều này giúp tiết kiệm tài nguyên và tăng tốc quá trình thu thập dữ liệu.

Một lợi thế đáng kể của Cheerio là cú pháp giống jQuery, cho phép các nhà phát triển tương tác với các phần tử HTML bằng cách sử dụng các trình chọn kiểu CSS quen thuộc. Sự dễ sử dụng này, kết hợp với hiệu quả của nó, làm cho Cheerio trở thành giải pháp hàng đầu cho các tác vụ trích xuất dữ liệu đơn giản.

Dưới đây là một so sánh Cheerio với các thư viện phổ biến khác:

Thư viện Thực thi JavaScript Sử dụng tài nguyên Tốc độ Trường hợp sử dụng
Cheerio Không Thấp Nhanh Thu thập dữ liệu HTML tĩnh
Puppeteer Cao Trung bình Thu thập dữ liệu động
Axios Không Thấp Nhanh Lấy HTML thô
Playwright Cao Trung bình Tương tác với các trang SPA

Đối với các nhà phát triển tập trung vào việc thu thập dữ liệu tĩnh hiệu quả, Cheerio là một công cụ mạnh mẽ nhưng đơn giản. Nó đặc biệt hữu ích để nhanh chóng truy xuất và phân tích cú pháp dữ liệu mà không cần chi phí hiển thị JavaScript, làm cho nó trở nên lý tưởng cho các dự án yêu cầu giải pháp hợp lý và nhanh chóng.

Thiết lập Cheerio cho web scraping

Trước khi bạn bắt đầu thu thập dữ liệu bằng Cheerio, bạn cần thiết lập môi trường phát triển của mình. Quá trình này bao gồm cài đặt Node.js, đây là một thời gian chạy JavaScript cho phép bạn chạy mã JavaScript bên ngoài trình duyệt web. Sau khi Node.js được cài đặt, bạn có thể sử dụng Node Package Manager (npm) để cài đặt Cheerio cùng với Axios, một trình khách HTTP phổ biến để thực hiện yêu cầu đến các trang web.

Bước 1: Cài đặt Node.js

Nếu bạn chưa cài đặt Node.js, bạn có thể tải xuống từ trang web chính thức của Node.js. Làm theo hướng dẫn cài đặt cho hệ điều hành của bạn.

Bước 2: Tạo một dự án mới

Mở thiết bị đầu cuối hoặc dấu nhắc lệnh của bạn và tạo một thư mục mới cho dự án của bạn. Điều hướng đến thư mục và khởi tạo một dự án Node.js mới bằng cách chạy:

bash Copy
mkdir cheerio-scraping
cd cheerio-scraping
npm init -y

Lệnh này sẽ tạo một tệp package.json để quản lý các phụ thuộc của dự án.

Bước 3: Cài đặt Cheerio và Axios

Bây giờ dự án của bạn đã được thiết lập, bạn có thể cài đặt Cheerio và Axios bằng cách chạy lệnh sau:

bash Copy
npm install cheerio axios

Lệnh này sẽ tải xuống và cài đặt cả hai thư viện, giúp chúng có sẵn để sử dụng trong kịch bản của bạn.

Bước 4: Tạo kịch bản của bạn

Tiếp theo, tạo một tệp JavaScript mới trong thư mục dự án của bạn. Bạn có thể đặt tên cho nó là scrape.js. Tệp này sẽ chứa mã thu thập dữ liệu trên web của bạn.

Cấu trúc cơ bản của một kịch bản thu thập dữ liệu trên web Cheerio

Bây giờ bạn đã cài đặt Cheerio và Axios, hãy xem xét cấu trúc cơ bản của một kịch bản thu thập dữ liệu trên web bằng cách sử dụng các thư viện này. Dưới đây là một đoạn mã mẫu minh họa cách thu thập dữ liệu sản phẩm từ một trang web thương mại điện tử ví dụ.

Kịch bản ví dụ

javascript Copy
const axios = require('axios');
const cheerio = require('cheerio');

// URL của trang web bạn muốn thu thập dữ liệu
const url = 'https://example.com/products';

// Hàm để lấy nội dung HTML
async function fetchHTML(url) {
    try {
        const { data } = await axios.get(url);
        return data;
    } catch (error) {
        console.error(`Không thể lấy URL: ${error}`);
    }
}

// Hàm để thu thập dữ liệu sản phẩm
async function scrapeProductData() {
    const html = await fetchHTML(url);
    const $ = cheerio.load(html);
    
    // Mảng để lưu trữ dữ liệu đã thu thập
    const products = [];

    // Chọn các phần tử và trích xuất dữ liệu
    $('.product-item').each((index, element) => {
        const productName = $(element).find('.product-name').text().trim();
        const productPrice = $(element).find('.product-price').text().trim();

        products.push({
            name: productName,
            price: productPrice
        });
    });

    console.log(products);
}

// Chạy hàm thu thập dữ liệu
scrapeProductData();

Giải thích mã

  1. Nhập: Kịch bản bắt đầu bằng cách nhập các thư viện cần thiết, Axios cho các yêu cầu HTTP và Cheerio để phân tích cú pháp HTML.

  2. Hàm fetchHTML: Hàm bất đồng bộ này nhận một URL làm đối số, thực hiện một yêu cầu GET đến URL đó và trả về nội dung HTML. Nếu có lỗi xảy ra trong quá trình yêu cầu, nó sẽ ghi nhật ký thông báo lỗi vào bảng điều khiển.

  3. Hàm scrapeProductData: Hàm này đầu tiên lấy nội dung HTML bằng cách sử dụng fetchHTML. Sau đó, nó tải HTML vào Cheerio bằng cách sử dụng cheerio.load().

  4. Trích xuất dữ liệu: Nó chọn các phần tử có lớp .product-item và lặp qua mỗi phần tử. Đối với mỗi sản phẩm, nó trích xuất tên sản phẩm và giá, loại bỏ khoảng trắng và đẩy kết quả vào một mảng.

  5. Đầu ra: Cuối cùng, nó ghi nhật ký mảng dữ liệu sản phẩm vào bảng điều khiển.

Phân tích cú pháp HTML bằng Cheerio: Các kỹ thuật cốt lõi

Với Cheerio, việc phân tích cú pháp HTML rất đơn giản. Dưới đây là cách trích xuất các loại dữ liệu khác nhau:

Trích xuất văn bản từ các phần tử

Trích xuất nội dung văn bản từ các thẻ HTML bằng cách sử dụng .text(). Ví dụ, để lấy tất cả các đoạn văn:

javascript Copy
$('p').each((index, element) => {
    console.log(`Đoạn ${index + 1}:`, $(element).text());
});

Trích xuất giá trị thuộc tính

Để thu thập dữ liệu hình ảnh hoặc liên kết, bạn sẽ cần phương thức attr():

javascript Copy
$('img').each((index, element) => {
    const imgSrc = $(element).attr('src');
    console.log(`Hình ảnh ${index + 1}:`, imgSrc);
});

Duyệt DOM

Cheerio cũng hỗ trợ các phương thức như .parent(), .children().find() để điều hướng DOM. Điều này rất hữu ích khi dữ liệu được lồng nhau.

javascript Copy
$('.article').children('h2').each((index, element) => {
    console.log('Tiêu đề phụ:', $(element).text());
});

Ví dụ: Thu thập tiêu đề tin tức từ một blog

Hãy lấy một ví dụ thực tế bằng cách thu thập tiêu đề bài viết gần đây từ một blog công nghệ phổ biến. Giả sử chúng ta muốn trích xuất tất cả tiêu đề bài viết từ https://example-blog.com.

Các bước:

  1. Kiểm tra cấu trúc HTML của blog để xác định thẻ HTML chứa tiêu đề bài viết (ví dụ: <h2 class="post-title">).
  2. Sử dụng Cheerio để chọn và truy xuất các phần tử này.

Mã ví dụ:

javascript Copy
const axios = require('axios');
const cheerio = require('cheerio');

async function scrapeBlogTitles() {
    try {
        const { data } = await axios.get('https://example-blog.com');
        const $ = cheerio.load(data);

        // Chọn tất cả tiêu đề bài viết
        $('h2.post-title').each((index, element) => {
            const title = $(element).text();
            console.log(`Bài viết ${index + 1}:`, title);
        });

    } catch (error) {
        console.error('Lỗi khi lấy tiêu đề blog:', error);
    }
}

scrapeBlogTitles();

Trong ví dụ này:

  • axios.get() lấy nội dung HTML của blog.
  • cheerio.load(data) tải nội dung vào Cheerio.
  • $('h2.post-title') chọn tất cả các tiêu đề dựa trên thẻ và lớp.
  • $(element).text() trích xuất và ghi nhật ký mỗi tiêu đề.

Xử lý các thách thức phổ biến với Cheerio

Dưới đây là phần sửa đổi về các thách thức phổ biến với Cheerio, hiện chỉ có hai trang web thực tế cho các ví dụ và bao gồm các siêu liên kết:

Những thách thức phổ biến với Cheerio là gì

Mặc dù Cheerio là một công cụ mạnh mẽ và linh hoạt cho web scraping, nhưng nó không phải là không có những thách thức. Người dùng thường phải đối mặt với một số trở ngại có thể làm phức tạp quá trình trích xuất dữ liệu.

Một trong những thách thức lớn nhất là xử lý nội dung động. Nhiều trang web hiện đại sử dụng khung JavaScript, có nghĩa là HTML ban đầu được phục vụ có thể không chứa tất cả thông tin bạn cần. Ví dụ, khi thu thập dữ liệu từ một trang web thương mại điện tử phổ biến như Amazon, HTML ban đầu có thể chỉ bao gồm các phần tử bố cục cơ bản, trong khi chi tiết sản phẩm, đánh giá và giá được tải không đồng bộ. Nếu kịch bản Cheerio của bạn chạy trước khi tất cả JavaScript được thực thi, bạn có thể nhận được dữ liệu không đầy đủ.

Một thách thức khác là giới hạn tốc độ và chặn IP. Các trang web thường theo dõi lưu lượng truy cập đến và có thể chặn hoặc điều tiết các yêu cầu vượt quá một ngưỡng nhất định. Ví dụ, một trang web như eBay có thể chỉ cho phép một số lượng yêu cầu nhất định mỗi phút từ một địa chỉ IP duy nhất. Nếu kịch bản thu thập dữ liệu của bạn gửi yêu cầu quá nhanh, bạn có thể nhận được phản hồi HTTP 403 Forbidden, hiệu quả là dừng nỗ lực trích xuất dữ liệu của bạn. Để khắc phục điều này, hãy xem xét triển khai điều tiết trong kịch bản của bạn, thêm độ trễ giữa các yêu cầu hoặc sử dụng proxy luân phiên để phân phối tải.

Bằng cách hiểu và chủ động giải quyết các thách thức phổ biến này, bạn có thể nâng cao các dự án thu thập dữ liệu trên web của mình bằng cách sử dụng Cheerio, đảm bảo quá trình trích xuất dữ liệu hiệu quả và thành công hơn.

Bạn gặp khó khăn với các thách thức thu thập dữ liệu trên web và các khối liên tục trên dự án bạn đang làm?

Hãy xem xét sử dụng Scrapeless để làm cho việc trích xuất dữ liệu dễ dàng và hiệu quả, tất cả trong một công cụ mạnh mẽ.

Hãy thử miễn phí ngay hôm nay!

Xử lý lỗi

Các vấn đề về mạng hoặc thay đổi trang bất ngờ có thể gây ra lỗi. Sử dụng khối try-catch để xử lý những lỗi này một cách thanh lịch:

javascript Copy
try {
    // Mã thu thập dữ liệu của bạn ở đây
} catch (error) {
    console.error('Lỗi khi thu thập dữ liệu:', error);
}

Các thực tiễn tốt nhất để sử dụng Cheerio trong web scraping

Để đảm bảo web scraping hiệu quả và tuân thủ với Cheerio, hãy ghi nhớ những điều sau:

  • Mục tiêu các phần tử cụ thể: Sử dụng các trình chọn chính xác để giảm thời gian phân tích cú pháp.
  • Xử lý các trường hợp ngoại lệ: Chuẩn bị cho những thay đổi trong cấu trúc HTML.
  • Tôn trọng chính sách của trang web: Chỉ thu thập dữ liệu khi được phép và tôn trọng các chính sách sử dụng.
  • Tối ưu hóa yêu cầu: Sử dụng tiêu đề yêu cầu và quản lý phiên để giảm nguy cơ phát hiện.

Kết luận

Cheerio là một công cụ mạnh mẽ để phân tích cú pháp HTML và thu thập dữ liệu từ các trang web tĩnh. Tính linh hoạt, hiệu quả và cú pháp dễ học của nó làm cho nó hoàn hảo cho nhiều tác vụ thu thập dữ liệu. Bằng cách tuân theo các thực tiễn tốt nhất và xem xét các hướng dẫn đạo đức và kỹ thuật, bạn có thể tận dụng Cheerio để thu thập dữ liệu có ý nghĩa từ các trang web một cách hiệu quả.

Cho dù để nghiên cứu, phân tích SEO hay thông tin cạnh tranh, Cheerio có thể xử lý nhiều nhu cầu thu thập dữ liệu trên web. Hãy nhớ thu thập dữ liệu một cách có trách nhiệm và giữ cho các kịch bản của bạn có khả năng thích ứng để xử lý các thay đổi động trong cấu trúc HTML.

Tại Scrapeless, chúng tôi chỉ truy cập dữ liệu có sẵn công khai trong khi tuân thủ nghiêm ngặt các luật, quy định hiện hành và chính sách bảo mật của trang web. Nội dung trong blog này chỉ nhằm mục đích trình diễn và không liên quan đến bất kỳ hoạt động bất hợp pháp hoặc vi phạm nào. Chúng tôi không đảm bảo và từ chối mọi trách nhiệm pháp lý đối với việc sử dụng thông tin từ blog này hoặc các liên kết của bên thứ ba. Trước khi tham gia vào bất kỳ hoạt động thu thập dữ liệu nào, hãy tham khảo ý kiến ​​cố vấn pháp lý của bạn và xem lại các điều khoản dịch vụ của trang web mục tiêu hoặc có được các quyền cần thiết.

Bài viết phổ biến nhất

Danh mục