Để xây dựng một ứng dụng website chuyên nghiệp, các nhà phát triển web thường phải thực hiện thao tác lấy nội dung web (HTML/XML) từ các website khác để làm cho website của mình phong phú hơn và có những dữ liệu mới nhất. Chẳng hạn, bạn muốn có mục nội dung luôn cập nhật thông tin về thời tiết, giá vàng, tỉ giá ngoại tệ, giá trị chứng khoán mới nhất hay tin tức lĩnh vực nào đó. Thay vì bạn phải xây dựng các chức năng này cho web của mình bạn có thể sử dụng phương pháp bóc tách lấy nội dung từ web khác. Điều đó tiết kiệm công sức bạn phải thường xuyên cập nhật thông tin và không phải xây dựng module (plugin) từ đầu.
Để lấy nội dung cho website, bạn hãy chọn nguồn dữ liệu từ các website lớn, có các API để xuất ra dữ liệu dưới dạng XML (RSS) hay JSON. Chẳng hạn, bạn có thể lấy tin tức cập nhật hàng ngày của báo điện tử VnExpress ở địa chỉ: https://vnexpress.net/rss/.
Nếu không thể tìm các định dạng này, bạn có thể bóc tách dữ liệu trực tiếp từ HTML nhưng phức tạp hơn và luôn phải thay đổi hàm lấy dữ liệu nếu website bạn lấy thay đổi giao diện.
Có 6 cách bạn có thể lấy nội dung web (HTML, XML, JSON) trong PHP được sử dụng mà bài viết này sẽ trình bày sau đây.
1. Dùng hàm file() trong PHP
Bạn có thể dùng hàm PHP trong HTML để thực hiện chức năng lấy dữ liệu từ URL nào đó. Ví dụ lấy dữ liệu từ website dammio.com và hiển thị trên màn hình.
<?php $url='https://www.dammio.com'; // tạo biến url cần lấy $lines_array=file($url); // dùng hàm file() lấy dữ liệu theo url $lines_string=implode('',$lines_array); // chuyển dữ liệu lấy được kiểu mảng thành một biến string echo $lines_string; // hiển thị dữ liệu ?>
Ví dụ tiếp theo là lấy dữ liệu từ mục Số hóa của báo điện tử VnExpress với đường dẫn RSS.
<?php $url='https://vnexpress.net/rss/so-hoa.rss'; $lines_array=file($url); $lines_string=implode('',$lines_array); $xml = simplexml_load_string($lines_string); if ($xml === false) { echo "Failed loading XML: "; foreach(libxml_get_errors() as $error) { echo "<br>", $error->message; } } else { foreach ($xml->xpath('//channel/item') as $items) { echo "<a target='_blank' href='" . $items->link . "'>" . $items->title . "</a><br/>"; echo $items->description . "<br/><br/>"; } } ?>
2. Dùng hàm file_get_contents()
Ngoài cách dùng hàm file(), bạn có thể dùng hàm file_get_contents() để lấy nội dung web. Trước hết, bạn phải chắn chắn chức năng “allow_url_fopen” được kích hoạt trong tập tin php.ini, bằng cách thiết lập dòng allow_url_fopen = On. Lưu ý, nếu dòng này không được thiết lập thì 2 hàm fopen và file_get_contents sẽ không làm việc.
<?php $url = 'https://www.dammio.com'; $lines_string = file_get_contents($url); echo htmlspecialchars($lines_string); // hiển thị dữ liệu ?>
3. Dùng hàm fopen(), fread() và fclose
Ba hàm này có chức năng lần lượt là mở tập tin (nguồn dữ liệu), đọc nguồn dữ liệu, hiển thị và đóng tập tin (nguồn hiển thị). Bạn có thể lấy dữ liệu từ trang dammio.com như sau:
<?php $url='https://www.dammio.com'; $handle = fopen($url,"rb"); // mở tập tin theo đường dẫn, "rb" có nghĩa là mở tập tin (đường dẫn) không phải là dạng văn bản. $lines_string=""; // đọc nội dung do{ $data=fread($handle,1024); if(strlen($data)==0) { break; } $lines_string.=$data; }while(true); fclose($handle); // đóng nguồn dữ liệu sau khi đọc xong echo $lines_string; // hiển thị dữ liệu kết quả ?>
4. Sử dụng cURL
Để sử dụng cURL, bạn cần phải kích hoạt chức năng này ở tập tin php.ini. Sau đó, bạn bỏ chú thích dòng này extension=php_curl.dll và cài đặt gói cURL ở Linux. Nếu bạn dùng gói XAMPP ở Windows, bạn làm theo các bước sau.
Bước 1
Tìm và mở 3 tập tin:
- C:\Program Files\xampp\apache\bin\php.ini
- C:\Program Files\xampp\php\php.ini
- C:\Program Files\xampp\php\php4\php.ini
Bước 2
Bỏ chú thích (;) dòng sau ở tập tin php.ini.
;extension=php_curl.dll
thành
extension=php_curl.dll
Bước 3
Sau đó khởi động server Apache và dùng hàm phpinfo() để kiểm tra cURL được kích hoạt hay chưa. Sau đây là ví dụ cách lấy.
<?php $url='https://www.dammio.com'; $ch=curl_init(); $timeout=5; // thời gian đợi để lấy dữ liệu curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); $lines_string=curl_exec($ch); // lấy nội dung theo URL curl_close($ch); // giải phóng tài liệu sau khi lấy dữ liệu echo $lines_string; // hiển thị dữ liệu ?>
5. Dùng hàm fsockopen()
Bạn cũng có thể dùng hàm fsockopen() để lấy dữ liệu từ nguồn web thông qua cổng 80.
<?php $fp = fsockopen("dammio.com", 80, $errno, $errstr, 30); // mở socket lấy dữ liệu từ server if (!$fp) { echo "$errstr ($errno) n"; } else { $out = "GET / HTTP/1.1rn"; $out .= "Host: t.qq.comrn"; $out .= "Connection: Closernrn"; fwrite($fp, $out); // lấy dữ liệu while (!feof($fp)) { echo fgets($fp, 128); // hiển thị dữ liệu } fclose($fp); } ?>
6. Dùng thư viện snoopy
Ngoài các cách trên, bạn cũng có dùng thư viện snoopy. Bạn có thể tải snoopy ở địa chỉ https://sourceforge.net/projects/snoopy/.
<?php require('Snoopy.class.php'); // nhúng thư viện snoopy từ gói tải về $snoopy = new Snoopy; // tạo đối tượng $url = "https://www.dammio.com"; $snoopy->fetch($url); // đọc nội dung $lines_string = $snoopy->results; // lưu theo các dòng echo $lines_string; // hiển thị dữ liệu ?>
Ngoài ra, cũng có vài cách khác để lấy dữ liệu từ web bằng PHP. Bài này chủ yếu trình bày các ví dụ cơ bản. Để bóc tách HTML, JSON hay XML ra dữ liệu cần thiết, bạn cần dùng một số kỹ thuật, hàm xử lý chuỗi, dữ liệu nữa để đáp ứng nhu cầu website thực tế. Chúc bạn may mắn!
- APA:
Dammio. (2018). Các phương pháp lấy nội dung web HTML bằng PHP. https://www.dammio.com/2018/07/07/cac-phuong-phap-lay-noi-dung-web-html-bang-php.
- BibTeX:
@misc{dammio,
author = {Dammio},
title = {Các phương pháp lấy nội dung web HTML bằng PHP},
year = {2018},
url = {https://www.dammio.com/2018/07/07/cac-phuong-phap-lay-noi-dung-web-html-bang-php},
urldate = {2024-12-05}
}