Cách lấy dữ liệu từ website khác bằng PHP

PHP $_GET là một biến siêu toàn cầu PHP được sử dụng để thu thập dữ liệu biểu mẫu sau khi gửi biểu mẫu HTML với method="get"

$_GET cũng có thể thu thập dữ liệu được gửi trong URL

Giả sử chúng ta có một trang HTML chứa một siêu liên kết với các tham số


Kiểm tra $GET


Khi người dùng nhấp vào liên kết "Test $GET", các thông số "subject" và "web" được gửi đến "test_get. php", và sau đó bạn có thể truy cập các giá trị của chúng trong "test_get. php" với $_GET

Internet là một nơi rộng lớn với hơn 4. 7 tỷ người dùng và không ngừng tăng lên. Nói một cách dễ hiểu, hơn 50% dân số trái đất sử dụng Internet tính đến năm 2018

Tất nhiên, nhiều người dùng hơn có nghĩa là dữ liệu cũng vậy. Ngay bây giờ, Internet lớn đến mức người ta ước tính rằng chỉ riêng Google, Amazon, Microsoft và Facebook đã lưu trữ ở đâu đó khoảng 1. 2 triệu terabyte

Ngay cả một phần thông tin đó cũng có thể tạo ra các cơ hội kinh doanh mới. Với ý nghĩ đó, không có gì lạ khi việc quét web đã trở nên phổ biến như thế nào

Sự giàu có về dữ liệu của Internet được trải mỏng một cách đáng tiếc trên hàng tỷ trang web. Do đó, các nhà phát triển cần một cách để thu thập và xử lý nó, để cung cấp cho người dùng những sản phẩm sáng tạo mới. Tuy nhiên, thu thập thông tin thủ công chắc chắn không phải là một ý tưởng hay vì khối lượng thường quá lớn và dữ liệu thay đổi liên tục

Giải pháp tự động giải nén nó. Đó là những gì quét web làm một cách ngắn gọn

Với nhiều thông tin hơn sẽ mang lại nhiều ý tưởng, cơ hội và lợi ích hơn. Sau khi được xử lý, nó có thể là vô giá đối với bạn hoặc khách hàng của bạn. Đây chỉ là một vài cách quét web có thể được sử dụng

  • Công cụ so sánh giá - Quét nhiều trang web để có cái nhìn tổng quan về cách định giá một loại sản phẩm
  • Nghiên cứu thị trường - Tìm hiểu xem ai là đối thủ cạnh tranh quan trọng nhất của bạn và họ đang làm gì
  • Machine Learning - Thu thập tập dữ liệu đào tạo và thử nghiệm cho mô hình học máy
  • Bất kỳ ý tưởng nào yêu cầu quyền truy cập vào một lượng dữ liệu đáng kể

Ví dụ: một trường hợp sử dụng khả thi là xây dựng một ứng dụng dinh dưỡng cho phép người dùng thêm các bữa ăn của họ. Lý tưởng nhất là người dùng chỉ cần mở ứng dụng, tìm kiếm các sản phẩm họ đã ăn, thêm chúng vào công cụ và theo dõi xem họ có thể ăn thêm bao nhiêu calo sau đó

Tuy nhiên, công cụ cần cung cấp một danh sách đầy đủ tất cả các sản phẩm có thể có và giá trị dinh dưỡng của chúng. Danh sách này có thể được tạo và cập nhật tự động bằng cách lấy thông tin dinh dưỡng từ nhiều trang web

Mặc dù việc quét web rất hữu ích cho bất kỳ ai đang sử dụng bot, nhưng đôi khi các trang web không vui khi chia sẻ nội dung của họ và họ có thể cố gắng ngăn bạn. Một số cách họ có thể chọn để làm như vậy là

  1. Mã Captcha - Bất kỳ trang nào cũng có thể sử dụng Captcha, ngay cả khi nó không hiển thị. Khi bạn thực hiện nhiều yêu cầu, mã captcha có thể hiển thị và làm hỏng trình quét web của bạn
  2. Chặn IP - Một số trang web chọn chặn IP của bạn khi họ thấy lưu lượng truy cập quá nhiều đến từ phía bạn
  3. Chặn địa lý - Một số nội dung có thể chỉ khả dụng ở các quốc gia cụ thể hoặc bạn có thể nhận được dữ liệu cụ thể cho một khu vực khi bạn muốn có thông tin về một khu vực khác
  4. Javascript - Hầu hết các trang web ngày nay đều sử dụng javascript theo cách này hay cách khác. Một số có thể hiển thị nội dung của chúng một cách linh hoạt, làm phức tạp thêm vấn đề do nguồn trang không giống với nội dung trang được hiển thị

Vượt qua những thách thức này có thể đòi hỏi rất nhiều công sức, nhưng vẫn có những lựa chọn. Để giúp bạn, chúng tôi đã tạo WebscrapingAPI, xử lý tất cả những vấn đề này đồng thời giúp bạn xây dựng giải pháp của mình nhanh hơn và ít đau đầu hơn

Mỗi khi người dùng Internet truy cập vào một trang web, trình duyệt sẽ tạo một yêu cầu HTTP (Hypertext Transfer Protocol). Bạn có thể coi một yêu cầu là một tin nhắn từ máy khách (máy tính của người dùng) đến máy chủ (máy tính chứa trang web), nơi khách hàng chỉ định những gì anh ta muốn nhận

Đối với mỗi yêu cầu được gửi, bạn sẽ nhận được phản hồi. Phản hồi có thể thành công hoặc có lỗi, chẳng hạn như mã lỗi 'không tìm thấy trang 404' nổi tiếng. Nội dung của một trang web thường được tìm thấy trong phần thân của phản hồi nhận được từ máy chủ

blog-image

Cả yêu cầu và phản hồi đều chứa phần đầu và phần thân được sử dụng để trao đổi thông tin. Ngoài ra, các yêu cầu có thể có nhiều phương thức, phổ biến nhất là GET (được sử dụng khi truy cập một trang web). Các phương thức này chỉ ra hành động mà khách hàng muốn thực hiện

Ví dụ: khi đăng ký hoặc cập nhật mật khẩu của bạn trên một trang web, bạn muốn ẩn dữ liệu của mình trong trình duyệt và các trang web có thể sử dụng phương thức POST hoặc PUT cho loại yêu cầu này

Phần đầu của một yêu cầu chứa nhiều thuộc tính. Hãy đi qua những cái quan trọng nhất

  • Host - Tên miền của máy chủ
  • Tác nhân người dùng - Chi tiết về ứng dụng khách đã thực hiện yêu cầu, chẳng hạn như trình duyệt và hệ điều hành
  • Cookie - Một tập hợp các thuộc tính được liên kết với máy khách
  • Chấp nhận - Tham số được sử dụng để nhận phản hồi cho máy chủ ở một loại cụ thể, chẳng hạn như văn bản/đơn giản hoặc ứng dụng/json

Tuy nhiên, các yêu cầu chỉ dành riêng cho các trang web. Chúng cũng được tạo cho hình ảnh, kiểu và mã javascript, riêng biệt với trang. Bạn có thể xem qua tất cả các yêu cầu mà trình duyệt Google Chrome của bạn thực hiện khi truy cập một trang web bằng cách nhấn F12 trên một trang, chọn tab “Mạng” và làm mới trang bạn đang truy cập. Bạn sẽ thấy ở cuối một cái gì đó như thế này

blog-image

PHP là một trong những ngôn ngữ lập trình web lâu đời nhất và phổ biến nhất được sử dụng cho phụ trợ ứng dụng. Nó đã có từ năm 1995, và bây giờ là phiên bản thứ 8

Các lập trình viên chọn ngôn ngữ lập trình này vì cú pháp đơn giản và cách chạy dễ dàng, vì tất cả những gì bạn cần để chạy mã PHP là một máy có cài đặt PHP. Hơn nữa, vì nó đã tồn tại quá lâu nên có rất nhiều tài nguyên và hỗ trợ để giải quyết và gỡ lỗi các lỗi PHP

PHP cũng có nhiều framework và CMS (Hệ thống quản lý nội dung) phổ biến được xây dựng trên ngôn ngữ lập trình này. Các ví dụ nổi tiếng là WordPress, Drupal, Magento và Laravel

Tuy nhiên, cũng có một số nhược điểm. Ví dụ: khó cạo nội dung động hơn so với Python hoặc Javascript. Tuy nhiên, nếu bạn chỉ cần thông tin từ các trang đơn giản, PHP chắc chắn là một giải pháp tốt và nó có thể giúp bạn lưu hoặc lưu trữ dữ liệu đã cạo dễ dàng hơn nhiều

Tất cả tốt cho đến nay? . Bạn có thể chọn máy chủ Apache/Nginx có cài đặt PHP và chạy mã trực tiếp từ trình duyệt của mình hoặc bạn có thể chạy mã từ dòng lệnh của mình

Hãy làm cho cuộc sống của chúng ta dễ dàng hơn bằng cách sử dụng thư viện để xử lý nội dung cóp nhặt. Một số thư viện cạo PHP phổ biến là Goutte, Simple HTML DOM, Panther và htmlSQL. Ngoài ra, bạn có thể chọn xử lý nội dung bằng biểu thức chính quy

Đối với hướng dẫn này, chúng tôi sẽ sử dụng DOM HTML đơn giản. Tuy nhiên, đối với các yêu cầu nâng cao hơn, chúng tôi cũng sẽ sử dụng thư viện PHP có tên là CURL

Simple HTML Dom nó là một thư viện được phát triển cho các phiên bản PHP từ 5. 6 trở lên và nó cho phép chúng tôi truy cập nội dung của trang theo cách dễ dàng hơn nhiều — với bộ chọn. Bạn có thể tải xuống thư viện từ đây và bạn cũng nên đọc tài liệu

Từ tệp zip trong liên kết tải xuống, bạn sẽ chỉ cần simple_html_dom. php mà bạn nên đặt trong cùng một thư mục nơi bạn sẽ viết mã cho trình quét

Để đưa thư viện vào mã, bạn chỉ cần một dòng mã này

include 'simple_html_dom.php'; // If the library is in another folder you should do include 'path_to_library/simple_html_dom.php'

Mặc dù không phải lúc nào cũng cần thiết, nhưng bạn sẽ cần gửi các tiêu đề khác nhau cho các yêu cầu nâng cao hơn. Sử dụng thư viện PHP-CURL sẽ giúp

Để cài đặt nó trên máy Ubuntu, bạn có thể sử dụng lệnh sau

sudo apt-get install php-curl

Sau khi cài đặt thư viện, đừng quên khởi động lại máy chủ Apache/Nginx của bạn

Bây giờ chúng tôi có tất cả những gì chúng tôi cần, đã đến lúc trích xuất dữ liệu. Trước tiên, bạn nên quyết định trang web và nội dung bạn muốn cạo. Đối với bài viết này, chúng tôi sẽ trích xuất nội dung từ Danh sách phim được xếp hạng cao nhất của IMDB

Hầu hết nội dung web được hiển thị bằng HTML. Vì chúng tôi cần trích xuất nội dung cụ thể từ nguồn HTML, nên cũng cần phải hiểu nội dung đó. Trước tiên, chúng tôi cần kiểm tra nguồn trang trông như thế nào để biết những yếu tố nào cần trích xuất từ ​​​​trang

Bạn có thể thực hiện việc này trong Google Chrome bằng cách nhấp chuột phải vào phần tử bạn muốn trích xuất, sau đó chọn “Kiểm tra phần tử”. Thao tác này sẽ mở một cửa sổ trong trình duyệt của bạn với nguồn trang và kiểu hiển thị của các thành phần. Từ cửa sổ này, tab duy nhất mà chúng ta cần kiểm tra là “Elements”, tab này sẽ cho chúng ta biết cách cấu trúc dom HTML của trang

blog-image

Ví dụ: trang chứa một bảng có lớp “biểu đồ” và “toàn chiều rộng” trong hình trên. Trong bảng này, mỗi ô có một lớp riêng (posterColumn, titleColumn, v.v.) mà chúng ta có thể sử dụng để tạo bộ chọn. Sau đó, chúng tôi chỉ có thể truy cập dữ liệu cần thiết

Bối rối?

Gửi yêu cầu, trong trường hợp này, về cơ bản có nghĩa là truy cập trực tiếp vào HTML của trang bằng mã PHP. Có hai cách để làm điều đó

Đầu tiên, chúng ta có thể sử dụng thư viện PHP-CURL, thư viện này cũng cho phép chúng ta sửa đổi các tiêu đề và nội dung mà chúng ta gửi trong yêu cầu của mình

header("Content-Type: text/plain"); // We choose to display the content as plain text

$ch = curl_init("https://www.imdb.com/chart/top/");
curl_setopt($ch, CURLOPT_HEADER, 0);
$response = curl_exec($ch); // Running the request

if (curl_error($ch)) {
echo curl_error($ch); // Displaying possible errors from the request
} else {
echo $response; // Displaying the content of the response
}

curl_close($ch);
?>

Một tùy chọn khác là một lớp lót, sử dụng phương thức file_get_contents($url), nhưng điều này có thể không đủ trong một số trường hợp. Để gửi tiêu đề cho yêu cầu này, bạn cần sử dụng ngữ cảnh được tạo bằng phương thức stream_context_create

header("Content-Type: text/plain"); // We choose to display the content as plain text

echo file_get_contents('https://www.imdb.com/chart/top/'); // We retrieve and display the contents of the response in a single line

?>

Bạn nên quyết định sử dụng phương pháp nào dựa trên độ phức tạp của máy cạp mà bạn muốn xây dựng

Hai đoạn mã ở trên sẽ hiển thị mã nguồn HTML của trang mà chúng tôi đang tìm kiếm, mã nguồn này sẽ hiển thị khi bạn kiểm tra trang web. Chúng tôi sẽ sử dụng dòng mã đầu tiên để hiển thị kết quả dưới dạng văn bản/đơn giản. Nếu không, nó sẽ được hiển thị trực tiếp dưới dạng html

Nếu có bất kỳ sự khác biệt nào trong cấu trúc HTML, thì có nghĩa là mã javascript đang chạy trên trang web và thay đổi nội dung khi người dùng truy cập vào trang web. Chúng tôi đã chuẩn bị một mẹo về cách giải quyết vấn đề đó ở phần sau của bài viết

Từ trang đã chọn, chúng tôi sẽ chỉ trích xuất tiêu đề của phim và xếp hạng liên quan đến từng phim. Như chúng ta đã thấy trước đó, nội dung được hiển thị trong một bảng trong đó mỗi ô có lớp của nó

Sử dụng cái này, chúng ta có thể chọn trích xuất tất cả các hàng của bảng. Sau đó, chúng tôi xem qua từng hàng riêng lẻ để tìm các ô mà chúng tôi quan tâm

Đoạn mã sau đây sẽ làm điều đó

header("Content-Type: text/plain"); // We choose to display the content as plain text

include 'simple_html_dom.php';

$html_dom = file_get_html('https://www.imdb.com/chart/top/'); // We retrieve the contents using file_get_html from simple_html_dom
$table_rows = $html_dom->find('table.chart tbody tr'); // Getting all of the table rows
foreach($table_rows as $table_row) {
$title_element = $table_row->find('.titleColumn a', 0);
$rating_element = $table_row->find('.ratingColumn strong', 0);
if (!is_null($title_element) && !is_null($rating_element)) { // Checking if the row has a title and a rating column
echo $title_element->innertext . ' has rating ' . $rating_element->innertext . PHP_EOL; // If it does then we print it
}
}

?>

Bạn có thể nhận thấy rằng chúng tôi đã sử dụng bộ chọn “bảng. chart tbody tr” để trích xuất tất cả các hàng của bảng. Thật tốt khi sử dụng các bộ chọn càng cụ thể càng tốt để bạn có thể phân biệt các yếu tố bạn cần với các yếu tố còn lại

Sau khi truy xuất các hàng, chúng tôi lặp qua chúng, tìm kiếm các phần tử có tiêu đề lớpColumn hoặc ratingColumn. Nếu tìm thấy bất kỳ mã nào, nó sẽ hiển thị thuộc tính InternalText của chúng

Điều quan trọng cần lưu ý là chúng tôi đã sử dụng file_get_html thay vì file_get_contents cho ví dụ này. Đó là bởi vì chức năng này đến từ thư viện simple_html_dom và nó hoạt động như một trình bao bọc cho chức năng file_get_contents

Trong các ví dụ trên, chúng tôi đã thu thập dữ liệu trang web và hiển thị trực tiếp trên màn hình. Tuy nhiên bạn cũng có thể lưu dữ liệu bằng PHP khá dễ dàng

Bạn có thể lưu dữ liệu cạo trong một. txt, dưới dạng JSON, dưới dạng CSV hoặc thậm chí gửi trực tiếp đến cơ sở dữ liệu. PHP nó rất giỏi việc đó. Chúng ta chỉ cần lưu trữ nó trong một mảng và đặt nội dung của mảng vào một tệp mới

include 'simple_html_dom.php';

$scraped_data = [];

$html_dom = file_get_html('https://www.imdb.com/chart/top/'); // We retrieve the contents using file_get_html from simple_html_dom
$table_rows = $html_dom->find('table.chart tbody tr'); // Getting all of the table rows
foreach($table_rows as $table_row) {
$title_element = $table_row->find('.titleColumn a', 0);
$rating_element = $table_row->find('.ratingColumn strong', 0);
if (!is_null($title_element) && !is_null($rating_element)) { // Checking if the row has a title and a rating column
$scraped_data[] = [
'title' => $title_element->innertext,
'rating' => $rating_element->innertext,
];
}
}

file_put_contents('file.json', json_encode($scraped_data)); // Saving the scraped data in a .json file

// Saving the scraped data as a csv
$csv_file = fopen('file.csv', 'w');
fputcsv($csv_file, array_keys($scraped_data[0]));

foreach ($scraped_data as $row) {
fputcsv($csv_file, array_values($row));
}

fclose($csv_file);

?>

Mã ở trên lấy cùng một nội dung mà chúng tôi đã trích xuất trước đó và tạo hai tệp, csv và json, với tất cả các bộ phim được xếp hạng cao nhất và xếp hạng của chúng

Khi mã hóa bằng PHP và thu thập dữ liệu từ các trang web có thể thay đổi bất kỳ lúc nào, việc xuất hiện lỗi là điều bình thường. Một đoạn mã tốt mà bạn có thể sử dụng để gỡ lỗi là ba dòng sau, được đặt ở đầu bất kỳ tập lệnh PHP nào

ini_set('display_errors', '1');
ini_set('display_startup_errors', '1');
error_reporting(E_ALL);

Những điều này sẽ giúp bạn xác định các vấn đề trong mã của mình nhanh hơn và cập nhật tập lệnh của bạn khi cần thiết

Đôi khi khi đưa ra yêu cầu, bạn cũng có thể cần gửi một số tiêu đề. Ví dụ: khi làm việc với API, có thể cần có mã thông báo ủy quyền hoặc bạn có thể muốn nội dung xuất hiện dưới dạng JSON thay vì văn bản thuần túy. Bạn có thể thêm cả hai tiêu đề bằng curl và file_get_contents. Đây là cách thực hiện với curl

$ch = curl_init("http://httpbin.org/ip");
curl_setopt($ch, CURLOPT_HEADER, [
'accept: application/json'
]);
$response = curl_exec($ch); // Running the request

Và đối với file_get_contents

________số 8_______

Khi chúng tôi trích xuất nội dung từ IMDB, chúng tôi đã sử dụng hàm file_get_html từ simple_html_dom để cạo. Cách tiếp cận này hoạt động cho các yêu cầu đơn giản nhưng không nhất thiết cho những yêu cầu phức tạp hơn. Nếu bạn cần gửi tiêu đề, tốt hơn bạn nên sử dụng một trong các phương pháp được sử dụng trong mẹo trước

Để sử dụng chúng thay vì file_get_html, chỉ cần giải nén nội dung và sau đó sử dụng str_get_html để chuyển đổi nó thành một đối tượng dom, như thế này

$opts = [
"http" => [
"method" => "GET",
"header" => "accept: text/html\r\n"
]
];
$context = stream_context_create($opts);
$result = file_get_contents("https://www.imdb.com/chart/top/", false, $context);
$html_dom = str_get_html($result);

Ngoài ra, hãy nhớ rằng theo mặc định, simple_html_dom có ​​một số giới hạn (có thể tìm thấy trong Simple_html_dom. tệp php). Ví dụ: nội dung của trang web có thể có tới 600.000 ký tự. Nếu bạn muốn thay đổi giới hạn này, bạn chỉ cần xác định nó ở đầu mã của mình trước khi thêm thư viện simple_html_dom

sudo apt-get install php-curl
0

Nếu bạn đang tìm kiếm một trang web động, bạn sẽ cần truy cập nó như một trình duyệt. Nếu không, bạn sẽ không thể trích xuất dữ liệu thực tế và thay vào đó sẽ nhận được mã js

Bạn sẽ cần cài đặt trình điều khiển trình duyệt, chẳng hạn như chromium-chromedriver hoặc firefox-geckodriver. Trích xuất nội dung động trong PHP là một bài học nâng cao hơn, nhưng nếu quan tâm, bạn có thể thử thực hiện bằng cách đọc tài liệu của thư viện panther

Ngoài ra, một giải pháp đơn giản hơn nhiều là sử dụng WebScrapingAPI, giải pháp này giúp giải quyết hầu hết các vấn đề. API khắc phục các khối IP và Captcha bằng cách sử dụng mạng proxy của chúng tôi đồng thời hiển thị javascript. Kết quả. bạn ngay lập tức có một công cụ cạp nâng cao, cắt giảm thời gian phát triển và chờ đợi

Đây là một mẫu mã sẽ hiển thị nội dung từ https. //httpbin. org/ip trực tiếp bằng PHP, thông qua API của chúng tôi

sudo apt-get install php-curl
1

Chúc mừng bạn đã đến đích. Bây giờ bạn sẽ có tất cả những gì bạn cần để xây dựng Web Scraper của mình bằng PHP. Mặc dù chúng ta chỉ khám phá thư viện simple_html_dom trong bài viết này, nhưng bạn có thể thử các thư viện phổ biến khác và tự mình xem cái nào phù hợp với mình hơn

Hãy nhớ rằng các trang web luôn thay đổi và dữ liệu của chúng có thể cập nhật qua đêm. Để giải quyết vấn đề này, bạn có thể sử dụng các bộ chọn cụ thể hơn. Tất nhiên, không có gì đảm bảo rằng máy cạp của bạn sẽ hoạt động mãi mãi, nhưng đó là một sự khởi đầu. Đó là lý do tại sao trình quét web yêu cầu cập nhật liên tục, tốn thời gian

Nếu bạn không muốn dành toàn bộ thời gian đó để nghiên cứu và điều chỉnh mã của mình, bạn luôn có thể dùng thử bản dùng thử miễn phí WebScrapingAPI

Làm cách nào để đọc dữ liệu từ một trang web trong PHP?

$url = "http. //www. anh trai. com/nhà xuất bản/xtracomponents. html"; $page = file_get_contents($url); $outfile = "xtracomponents. html"; file_put_contents($outfile, $page); Đoạn mã trên chỉ là một ví dụ và thiếu bất kỳ (. ) kiểm tra và xử lý lỗi

Làm cách nào để cạo dữ liệu từ một trang web PHP?

Tạo trình quét web của riêng bạn .
Kiểm tra nội dung trang web. Hầu hết nội dung web được hiển thị bằng HTML. .
Gửi yêu cầu từ PHP. Gửi yêu cầu, trong trường hợp này, về cơ bản có nghĩa là truy cập trực tiếp vào HTML của trang bằng mã PHP. .
Trích xuất dữ liệu. .
Xuất dữ liệu

Làm cách nào để tạo trình thu thập dữ liệu web trong PHP?

1. Đầu tiên tạo url của trang mà chúng ta phải thu thập thông tin. 3. Hàm crawl dùng để thu thập dữ liệu trang web và lấy tất cả các liên kết của trang web .