Web scraping đã trở thành một công cụ thiết yếu cho các nhà phát triển và nhà phân tích dữ liệu cần trích xuất và phân tích thông tin từ web. Cho dù bạn đang theo dõi giá sản phẩm, thu thập dữ liệu để nghiên cứu hay xây dựng bảng điều khiển tùy chỉnh, web scraping cung cấp vô số khả năng.
Nếu bạn là người đam mê PHP, Goutte là một thư viện tuyệt vời để cân nhắc cho nhu cầu thu thập dữ liệu web của bạn. Goutte nhẹ, thân thiện với người dùng và mạnh mẽ, kết hợp khả năng của máy khách HTTP của Guzzle với DomCrawler của Symfony để thu thập dữ liệu web mượt mà và hiệu quả.
Hướng dẫn này sẽ hướng dẫn bạn những điều cơ bản về thu thập dữ liệu web bằng PHP sử dụng Goutte —từ cài đặt và tập lệnh đầu tiên cho đến các kỹ thuật nâng cao như xử lý biểu mẫu và phân trang.
Goutte đã trở nên phổ biến trong giới phát triển vì một số lý do, khiến nó trở thành một trong những thư viện thu thập dữ liệu cần thiết cho PHP:
Cho dù bạn là người mới làm quen với PHP hay là một nhà phát triển dày dạn kinh nghiệm, Goutte đều mang đến sự cân bằng lý tưởng giữa tính đơn giản và sức mạnh.
Trước khi bắt đầu viết mã, hãy đảm bảo đã có đủ các điều kiện tiên quyết cần thiết:
Để cài đặt Goutte , bạn chỉ cần chạy lệnh sau trong terminal:
nhà soạn nhạc yêu cầu fabpot/goutte
Sau khi cài đặt, hãy xác minh rằng thư viện có thể truy cập được bằng cách yêu cầu trình tải tự động của Composer trong dự án của bạn:
yêu cầu 'vendor/autoload.php' ;
Bây giờ bạn đã sẵn sàng để bắt đầu thu thập dữ liệu!
Hãy bắt đầu bằng một ví dụ đơn giản. Chúng ta sẽ trích xuất tiêu đề của một trang web bằng Goutte. Dưới đây là đoạn mã cơ bản:
<?php
require 'vendor/autoload.php';
use Goutte\Client;
// Initialize Goutte Client
$client = new Client();
// Send a GET request to the target URL
$crawler = $client->request('GET', 'https://books.toscrape.com/');
// Extract the title of the page
$title = $crawler->filter('title')->text();
echo "Page Title: $title\n";
// Extract the titles of the first 5 books
echo "First 5 Book Titles:\n";
$crawler->filter('.product_pod h3 a')->slice(0, 5)->each(function ($node) {
echo "- " . $node->attr('title') . "\n";
});
?>
Đầu ra:
Tiêu đề trang : Tất cả sản phẩm | Sách để cạo - Sandbox 5 tựa sách đầu tiên : - Ánh sáng trên gác xép - Tipping the Velvet - Soumission - Vật sắc nhọn - Sapiens: Lược sử loài người
Thật dễ dàng! Chỉ với một vài dòng mã, bạn có thể lấy và hiển thị tiêu đề
thẻ của bất kỳ trang web nào.
Sau khi đã học cách lấy trang web, bước tiếp theo là trích xuất dữ liệu cụ thể như liên kết hoặc nội dung từ các phần tử HTML cụ thể.
Đoạn mã sau đây trích xuất href
thuộc tính của tất cả <a>
thẻ trên một trang web:
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');
// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
return $node->attr('href');
});
// Print all extracted links
foreach ($links as $link) {
echo $link . "\n";
}
Thao tác này sẽ trả về tất cả các siêu liên kết có trên trang.
Goutte giúp trích xuất hoặc phân tích dữ liệu từ HTML dễ dàng bằng cách sử dụng lớp học
hoặc NHẬN DẠNG
bộ chọn. Đối với ví dụ này, chúng tôi sẽ sử dụng Trang web Books to Scrape. Cụ thể, chúng tôi sẽ thu thập thông tin về từng cuốn sách vì tất cả chúng đều có cùng một lớp, sản phẩm_pod
. Sau đây là cách nó xuất hiện trên trang web:
Sau đây là một ví dụ về cách bạn có thể đạt được điều này bằng cách sử dụng Goutte:
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');
// Extract all <a> tags
$links = $crawler->filter('a')->each(function ($node) {
return $node->attr('href');
});
// Print all extracted links
foreach ($links as $link) {
echo $link . "\n";
}
// Extract elements with class 'product_pod'
$products = $crawler->filter('.product_pod')->each(function ($node) {
return $node->text();
});
// Print all extracted product details
foreach ($products as $product) {
echo $product . "\n";
}
Bây giờ, chúng ta hãy khám phá cách điều hướng hoặc phân trang giữa các trang. Trong trang ví dụ chúng ta đang sử dụng, có một nút "Tiếp theo" cho phép phân trang sang trang tiếp theo. Chúng ta sẽ tận dụng nút này để triển khai phân trang.
Đầu tiên, chúng ta sẽ xác định vị trí nút bằng cách sử dụng nó lớp học
thuộc tính có giá trị Kế tiếp
. Trong phần tử này, có một <a>
thẻ chứa URL cho trang tiếp theo. Bằng cách trích xuất URL này, chúng ta có thể sử dụng nó để gửi yêu cầu mới và chuyển sang trang tiếp theo một cách liền mạch. Sau đây là giao diện và cấu trúc HTML của Kế tiếp
nút trên trang.
Mã thực hiện chức năng này trông như thế này:
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://books.toscrape.com/');
// Handle pagination using the 'next' button
while ($crawler->filter('li.next a')->count() > 0) {
$nextLink = $crawler->filter('li.next a')->attr('href');
$crawler = $client->request('GET', 'https://books.toscrape.com/catalogue/' . $nextLink);
// Extract and print the current page URL
echo "Currently on: " . $crawler->getUri() . "\n";
}
Với cách tiếp cận này, bạn có thể tự động điều hướng giữa các trang và tiếp tục thu thập dữ liệu.
Goutte cũng có khả năng xử lý các biểu mẫu. Để chứng minh chức năng này, chúng tôi sẽ sử dụng trang web này, có một trường nhập liệu duy nhất, như được hiển thị trong hình ảnh bên dưới:
Mã để gửi biểu mẫu này trông như thế này:
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
$crawler = $client->request('GET', 'https://www.scrapethissite.com/pages/forms/');
// Submit the search form with a query
$form = $crawler->selectButton('Search')->form();
$form['q'] = 'Canada';
$crawler = $client->submit($form);
// Extract and print the results
$results = $crawler->filter('.team')->each(function ($node) {
return $node->text();
});
foreach ($results as $result) {
echo $result . "\n";
}
Tập lệnh này điền vào một trường biểu mẫu có tên q
với giá trị quét web
và gửi nó. Từ đây, bạn có thể trích xuất nội dung từ trang kết quả tìm kiếm giống như trong các ví dụ trước đó.
Luôn thêm chức năng xử lý lỗi để quản lý các tình huống bất ngờ như kết nối mạng bị lỗi hoặc URL không tồn tại.
<?php
require 'vendor/autoload.php';
use Goutte\Client;
$client = new Client();
try {
$crawler = $client->request('GET', 'https://invalid-url-example.com');
echo "Page title: " . $crawler->filter('title')->text();
} catch (Exception $e) {
echo "An error occurred: " . $e->getMessage();
}
}
Việc trích xuất dữ liệu web luôn phải được thực hiện một cách có đạo đức và có trách nhiệm. Tệp `robots.txt` là một tệp văn bản đơn giản được các trang web sử dụng để giao tiếp với trình thu thập dữ liệu web, phác thảo những phần nào của trang web có thể hoặc không thể truy cập được. Trước khi trích xuất, điều quan trọng là phải kiểm tra tệp ` robots.txt` để đảm bảo bạn đang tuân thủ các quy tắc của trang web và tôn trọng các điều khoản của họ. Việc bỏ qua các hướng dẫn này có thể dẫn đến các vấn đề về pháp lý và đạo đức, vì vậy hãy luôn ưu tiên bước này trong quy trình trích xuất dữ liệu của bạn.
Đọc thêm về robots.txt
đây.
Hãy lịch sự và tránh gửi quá nhiều yêu cầu trong một thời gian ngắn, vì điều này có thể làm quá tải máy chủ và làm gián đoạn hiệu suất của máy chủ đối với những người dùng khác. Một cách làm tốt là bao gồm một khoảng thời gian trễ ngắn giữa mỗi yêu cầu để giảm thiểu tải trên máy chủ và đảm bảo máy chủ có thể xử lý lưu lượng truy cập hiệu quả. Thực hiện các bước này không chỉ giúp duy trì sự ổn định của máy chủ mà còn thể hiện việc sử dụng có trách nhiệm và chu đáo các tài nguyên được chia sẻ.
sleep ( 1 ); // Chờ 1 giây giữa các yêu cầu
Web scraping là một công cụ mạnh mẽ để thu thập dữ liệu hiệu quả, nhưng nó đòi hỏi một cách tiếp cận có trách nhiệm và chu đáo để tránh những cạm bẫy phổ biến và đảm bảo sử dụng có đạo đức. Bằng cách tuân thủ các biện pháp thực hành tốt nhất như tôn trọng các điều khoản dịch vụ của trang web, thực hiện các khoảng thời gian trễ phù hợp giữa các yêu cầu và sử dụng các công cụ có khả năng xử lý nội dung động, bạn có thể tạo ra một trình thu thập dữ liệu hoạt động hiệu quả trong khi giảm thiểu tác động đến máy chủ. Ngoài ra, việc xác minh chứng chỉ HTTPS và luôn lưu ý đến các cân nhắc về bảo mật sẽ bảo vệ trình thu thập dữ liệu của bạn và bất kỳ dữ liệu nào mà nó thu thập. Với kế hoạch và thực hiện phù hợp, web scraping có thể trở thành một nguồn tài nguyên vô giá cho nghiên cứu, phân tích và đổi mới.