Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

Bạn có thể đã thấy một trong những hướng dẫn khác của chúng tôi về cách quét các trang web, ví dụ với Ruby, JavaScript hoặc Python, và tự hỏi: Điều gì về ngôn ngữ lập trình phía máy chủ được sử dụng rộng rãi nhất cho các trang web, đồng thời là Một trong những điều đáng sợ nhất? Tự hỏi không còn nữa - Hôm nay đã đến lúc PHP!PHP 🥳!

Dù bạn có tin hay không, nhưng php và web Scraping có nhiều điểm chung: giống như PHP, việc cạo web có thể được sử dụng một cách nhanh chóng và bẩn thỉu, hoặc theo kiểu công phu hơn và được hỗ trợ với sự trợ giúp của các công cụ và dịch vụ bổ sung.

Trong bài viết này, chúng tôi sẽ xem xét một số cách để cạo web với PHP. Xin lưu ý rằng không có "cách tốt nhất" chung - mỗi cách tiếp cận có trường hợp sử dụng, tùy thuộc vào những gì bạn cần, cách bạn muốn làm mọi việc và những gì bạn muốn đạt được.

Ví dụ, chúng tôi sẽ cố gắng có được một danh sách những người có cùng ngày sinh nhật, như bạn có thể thấy, ví dụ, trên Nổi tiếngBirthDays.com. Nếu bạn muốn mã theo, vui lòng đảm bảo rằng bạn đã cài đặt phiên bản hiện tại của PHP và nhà soạn nhạc.

Tạo một thư mục mới và chạy các lệnh sau từ nó:

$ composer init --require="php >= 8.1" --no-interaction
$ composer update

Chúng tôi sắn sàng!

1. Yêu cầu HTTP

Khi nói đến việc duyệt web, một giao thức giao tiếp quan trọng, bạn cần phải quen thuộc, là HTTP, giao thức vận chuyển siêu văn bản. Nó xác định cách người tham gia trên web trên toàn thế giới giao tiếp với nhau. Có các máy chủ lưu trữ tài nguyên và khách hàng yêu cầu tài nguyên từ họ.

Trình duyệt của bạn là một máy khách như vậy và khi chúng tôi mở bảng điều khiển nhà phát triển (nhấn

GET / HTTP/1.1
Host: www.example.com
6), chọn tab "Mạng" và mở ví dụ nổi tiếng.com, chúng ta có thể thấy yêu cầu đầy đủ được gửi đến máy chủ, cũng như phản hồi đầy đủ :

Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

Tab mạng của bảng điều khiển nhà phát triển trình duyệt của bạn

Đó là một số tiêu đề yêu cầu và phản hồi, nhưng ở dạng cơ bản nhất, một yêu cầu trông như thế này:

GET / HTTP/1.1
Host: www.example.com

Chúng ta hãy cố gắng tái tạo với PHP, những gì trình duyệt vừa làm cho chúng ta!

GET / HTTP/1.1 Host: www.example.com 7

Thông thường, chúng tôi sẽ không sử dụng nhiều giao tiếp "cấp thấp" như vậy, nhưng chỉ vì lợi ích của nó, hãy tạo yêu cầu này với công cụ cơ bản nhất mà PHP phải cung cấp,

GET / HTTP/1.1
Host: www.example.com
7:

php
    # fsockopen.php

    // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
    $request = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "\r\n"; // We need to add a last new line after the last header

    // We open a connection to www.example.com on the port 80
    $connection = fsockopen('www.example.com', 80);

    // The information stream can flow, and we can write and read from it
    fwrite($connection, $request);

    // As long as the server returns something to us...
    while(!feof($connection)) {
        // ... print what the server sent us
        echo fgets($connection);
    }

    // Finally, close the connection
    fclose($connection);

Và thực sự, nếu bạn đặt đoạn mã này vào một tệp

GET / HTTP/1.1
Host: www.example.com
9 và chạy nó với
php
    # fsockopen.php

    // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
    $request = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "\r\n"; // We need to add a last new line after the last header

    // We open a connection to www.example.com on the port 80
    $connection = fsockopen('www.example.com', 80);

    // The information stream can flow, and we can write and read from it
    fwrite($connection, $request);

    // As long as the server returns something to us...
    while(!feof($connection)) {
        // ... print what the server sent us
        echo fgets($connection);
    }

    // Finally, close the connection
    fclose($connection);
0, bạn sẽ thấy cùng một HTML mà bạn nhận được khi mở http://example.com trong trình duyệt của bạn.

Bước tiếp theo: Thực hiện yêu cầu HTTP với trình biên dịch ... Đùa thôi! Nhưng trong tất cả các mức độ nghiêm trọng:

GET / HTTP/1.1
Host: www.example.com
7 thường không được sử dụng để thực hiện các yêu cầu HTTP trong PHP; Tôi chỉ muốn cho bạn thấy rằng điều đó là có thể, sử dụng ví dụ dễ nhất có thể. Mặc dù người ta có thể xử lý các tác vụ HTTP với nó, nhưng nó không thú vị và đòi hỏi nhiều mã nồi hơi mà chúng ta không cần phải viết - thực hiện các yêu cầu HTTP là một vấn đề được giải quyết và trong PHP (và nhiều ngôn ngữ khác) được giải quyết bởi

Xoăn

Nhập Curl (một máy khách cho URL)!client for URLs)!

Hãy nhảy ngay vào mã, nó khá thẳng về phía trước:

php
# curl.php

// Initialize a connection with cURL (ch = cURL handle, or "channel")
$ch = curl_init();

// Set the URL
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');

// Set the HTTP method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

// Return the response instead of printing it out
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Send the request and store the result in $response
$response = curl_exec($ch);

echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
echo 'Response Body: ' . $response . PHP_EOL;

// Close cURL resource to free up system resources
curl_close($ch);

Bây giờ, điều này đã có vẻ ít thấp hơn so với ví dụ trước của chúng tôi, phải không? Không cần phải soạn thảo thủ công yêu cầu HTTP, thiết lập và quản lý kết nối TCP hoặc xử lý phản hồi byte-byte. Thay vào đó, chúng tôi chỉ khởi tạo tay cầm Curl, vượt qua URL thực tế và thực hiện yêu cầu bằng

php
    # fsockopen.php

    // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
    $request = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "\r\n"; // We need to add a last new line after the last header

    // We open a connection to www.example.com on the port 80
    $connection = fsockopen('www.example.com', 80);

    // The information stream can flow, and we can write and read from it
    fwrite($connection, $request);

    // As long as the server returns something to us...
    while(!feof($connection)) {
        // ... print what the server sent us
        echo fgets($connection);
    }

    // Finally, close the connection
    fclose($connection);
2.

Ví dụ, nếu chúng tôi muốn Curl tự động xử lý mã chuyển hướng HTTP 30X, chúng tôi chỉ cần thêm

php
    # fsockopen.php

    // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
    $request = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "\r\n"; // We need to add a last new line after the last header

    // We open a connection to www.example.com on the port 80
    $connection = fsockopen('www.example.com', 80);

    // The information stream can flow, and we can write and read from it
    fwrite($connection, $request);

    // As long as the server returns something to us...
    while(!feof($connection)) {
        // ... print what the server sent us
        echo fgets($connection);
    }

    // Finally, close the connection
    fclose($connection);
3. Thêm vào đó, có khá nhiều tùy chọn và cờ bổ sung để hỗ trợ các trường hợp sử dụng khác.

Tuyệt quá! Bây giờ chúng ta hãy đến thực tế!

2. Chuỗi, biểu thức thường xuyên và Wikipedia

Hãy xem Wikipedia là nhà cung cấp dữ liệu đầu tiên của chúng tôi. Mỗi ngày trong năm có trang riêng cho các sự kiện lịch sử, bao gồm cả ngày sinh nhật! Ví dụ, khi chúng tôi mở, trang cho ngày 10 tháng 12 (đó là sinh nhật của tôi), chúng tôi có thể kiểm tra HTML trong bảng điều khiển nhà phát triển và xem phần "Sinh" được cấu trúc như thế nào:

Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

Cấu trúc HTML của Wikipedia

Điều này trông đẹp và có tổ chức! Chúng tôi có thể thấy điều đó:

  • Có một phần tử tiêu đề
    php
        # fsockopen.php
    
        // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Host: www.example.com\r\n";
        $request .= "\r\n"; // We need to add a last new line after the last header
    
        // We open a connection to www.example.com on the port 80
        $connection = fsockopen('www.example.com', 80);
    
        // The information stream can flow, and we can write and read from it
        fwrite($connection, $request);
    
        // As long as the server returns something to us...
        while(!feof($connection)) {
            // ... print what the server sent us
            echo fgets($connection);
        }
    
        // Finally, close the connection
        fclose($connection);
    
    4 chứa
    php
        # fsockopen.php
    
        // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Host: www.example.com\r\n";
        $request .= "\r\n"; // We need to add a last new line after the last header
    
        // We open a connection to www.example.com on the port 80
        $connection = fsockopen('www.example.com', 80);
    
        // The information stream can flow, and we can write and read from it
        fwrite($connection, $request);
    
        // As long as the server returns something to us...
        while(!feof($connection)) {
            // ... print what the server sent us
            echo fgets($connection);
        }
    
        // Finally, close the connection
        fclose($connection);
    
    5 (chỉ có một phần tử trên toàn bộ trang nên có ID có tên là "Sinh").
  • Sau đây, là danh sách các tiêu đề phụ (
    php
        # fsockopen.php
    
        // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Host: www.example.com\r\n";
        $request .= "\r\n"; // We need to add a last new line after the last header
    
        // We open a connection to www.example.com on the port 80
        $connection = fsockopen('www.example.com', 80);
    
        // The information stream can flow, and we can write and read from it
        fwrite($connection, $request);
    
        // As long as the server returns something to us...
        while(!feof($connection)) {
            // ... print what the server sent us
            echo fgets($connection);
        }
    
        // Finally, close the connection
        fclose($connection);
    
    6) cho các kỷ nguyên riêng lẻ và các yếu tố nhập danh sách của chúng (
    php
        # fsockopen.php
    
        // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Host: www.example.com\r\n";
        $request .= "\r\n"; // We need to add a last new line after the last header
    
        // We open a connection to www.example.com on the port 80
        $connection = fsockopen('www.example.com', 80);
    
        // The information stream can flow, and we can write and read from it
        fwrite($connection, $request);
    
        // As long as the server returns something to us...
        while(!feof($connection)) {
            // ... print what the server sent us
            echo fgets($connection);
        }
    
        // Finally, close the connection
        fclose($connection);
    
    7).
  • Mỗi mục nhập danh sách được đại diện bởi một mục
    php
        # fsockopen.php
    
        // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Host: www.example.com\r\n";
        $request .= "\r\n"; // We need to add a last new line after the last header
    
        // We open a connection to www.example.com on the port 80
        $connection = fsockopen('www.example.com', 80);
    
        // The information stream can flow, and we can write and read from it
        fwrite($connection, $request);
    
        // As long as the server returns something to us...
        while(!feof($connection)) {
            // ... print what the server sent us
            echo fgets($connection);
        }
    
        // Finally, close the connection
        fclose($connection);
    
    8, chứa năm, một dấu gạch ngang, tên của người, dấu phẩy và một lời trêu ghẹo về những gì người được biết đến.

Đây là một cái gì đó chúng ta có thể làm việc với, phải không? Đi nào!

php
# wikipedia.php

$html = file_get_contents('https://en.wikipedia.org/wiki/December_10');

echo $html;

Chờ những gì? Bất ngờ! Có,

php
    # fsockopen.php

    // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
    $request = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "\r\n"; // We need to add a last new line after the last header

    // We open a connection to www.example.com on the port 80
    $connection = fsockopen('www.example.com', 80);

    // The information stream can flow, and we can write and read from it
    fwrite($connection, $request);

    // As long as the server returns something to us...
    while(!feof($connection)) {
        // ... print what the server sent us
        echo fgets($connection);
    }

    // Finally, close the connection
    fclose($connection);
9 sử dụng các trình bao bọc fopen của PHP và (miễn là chúng được bật) có thể được sử dụng để tìm nạp các URL HTTP. Mặc dù, chủ yếu thực sự có ý nghĩa đối với các tệp cục bộ, có lẽ là cách dễ nhất và nhanh nhất để thực hiện các yêu cầu HTTP cơ bản và tốt cho ví dụ của chúng tôi ở đây hoặc cho các tập lệnh một lần nhanh chóng, miễn là bạn sử dụng nó một cách cẩn thận.

Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

Đầu ra tập lệnh

Bạn đã đọc tất cả các HTML mà tập lệnh đã in ra chưa? Tôi hy vọng là không, bởi vì nó rất nhiều! Điều quan trọng là chúng ta biết nơi chúng ta nên bắt đầu tìm kiếm: Chúng tôi chỉ quan tâm đến phần bắt đầu bằng

php
# curl.php

// Initialize a connection with cURL (ch = cURL handle, or "channel")
$ch = curl_init();

// Set the URL
curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');

// Set the HTTP method
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');

// Return the response instead of printing it out
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// Send the request and store the result in $response
$response = curl_exec($ch);

echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
echo 'Response Body: ' . $response . PHP_EOL;

// Close cURL resource to free up system resources
curl_close($ch);
0 và kết thúc ngay trước
php
    # fsockopen.php

    // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
    $request = "GET / HTTP/1.1\r\n";
    $request .= "Host: www.example.com\r\n";
    $request .= "\r\n"; // We need to add a last new line after the last header

    // We open a connection to www.example.com on the port 80
    $connection = fsockopen('www.example.com', 80);

    // The information stream can flow, and we can write and read from it
    fwrite($connection, $request);

    // As long as the server returns something to us...
    while(!feof($connection)) {
        // ... print what the server sent us
        echo fgets($connection);
    }

    // Finally, close the connection
    fclose($connection);
4 tiếp theo:

php
# wikipedia.php

$html = file_get_contents('https://en.wikipedia.org/wiki/December_10');

$start = stripos($html, 'id="Births"');

$end = stripos($html, '

', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

Chúng tôi đang tiến gần hơn!

Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

Kết quả sạch hơn

Đây không phải là HTML hợp lệ nữa, nhưng ít nhất chúng ta có thể thấy những gì chúng ta đang làm việc! Chúng ta hãy sử dụng một biểu thức thông thường để tải tất cả các mục trong danh sách vào một mảng để chúng ta có thể xử lý từng mục một:

preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }

    {A

    Trong những năm và tên, chúng ta có thể thấy từ đầu ra rằng số đầu tiên là năm sinh. Nó được theo sau là một thực thể HTML

    php
    # curl.php
    
    // Initialize a connection with cURL (ch = cURL handle, or "channel")
    $ch = curl_init();
    
    // Set the URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
    
    // Set the HTTP method
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    
    // Return the response instead of printing it out
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // Send the request and store the result in $response
    $response = curl_exec($ch);
    
    echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
    echo 'Response Body: ' . $response . PHP_EOL;
    
    // Close cURL resource to free up system resources
    curl_close($ch);
    
    2 (một dấu gạch ngang). Cuối cùng, tên được đặt trong phần tử
    php
    # curl.php
    
    // Initialize a connection with cURL (ch = cURL handle, or "channel")
    $ch = curl_init();
    
    // Set the URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
    
    // Set the HTTP method
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    
    // Return the response instead of printing it out
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // Send the request and store the result in $response
    $response = curl_exec($ch);
    
    echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
    echo 'Response Body: ' . $response . PHP_EOL;
    
    // Close cURL resource to free up system resources
    curl_close($ch);
    
    3 sau đây. Hãy lấy tất cả, và chúng tôi đã hoàn thành.

    php
    # wikipedia.php
    
    $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
    
    $start = stripos($html, 'id="Births"');
    
    $end = stripos($html, '

    ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; echo "Who was born on December 10th\n"; echo "=============================\n\n"; foreach ($listItems as $item) { preg_match('@(\d+)@', $item, $yearMatch); $year = (int) $yearMatch[0]; preg_match('@;\s]*>(.*?)@i', $item, $nameMatch); $name = $nameMatch[1]; echo "{$name} was born in {$year}\n"; }

    Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

    Kết quả cuối cùng

    Hoàn hảo, phải không? Nó hoạt động và chúng tôi quản lý để có được dữ liệu chúng tôi muốn, phải không? Vâng, nó hoạt động, nhưng chúng tôi không chọn một cách tiếp cận đặc biệt thanh lịch. Thay vì xử lý cây Dom, chúng tôi đã sử dụng phân tích chuỗi "vũ lực" của mã HTML và, trong đó, đã bỏ lỡ hầu hết những gì phân tích cú pháp DOM đã cung cấp ngoài hộp. Không lý tưởng.

    Chúng ta có thể làm tốt hơn! Khi? Hiện nay!

    3. GUZLE, XML, XPATH và IMDB

    Guzzle là một máy khách HTTP phổ biến cho PHP giúp dễ dàng và thú vị khi gửi các yêu cầu HTTP. Nó cung cấp cho bạn một API trực quan, xử lý lỗi rộng rãi và thậm chí khả năng mở rộng chức năng của nó với các plugin/phần mềm trung gian bổ sung. Điều này làm cho Guzz trở thành một công cụ mạnh mẽ mà bạn không muốn bỏ lỡ. Bạn có thể cài đặt Guzz từ thiết bị đầu cuối của bạn với

    php
    # curl.php
    
    // Initialize a connection with cURL (ch = cURL handle, or "channel")
    $ch = curl_init();
    
    // Set the URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
    
    // Set the HTTP method
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    
    // Return the response instead of printing it out
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // Send the request and store the result in $response
    $response = curl_exec($ch);
    
    echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
    echo 'Response Body: ' . $response . PHP_EOL;
    
    // Close cURL resource to free up system resources
    curl_close($ch);
    
    4.

    Chúng ta hãy cắt theo đuổi và xem HTML của https://www.imdb.com/search/name/?birth_monthday=12-10 (URL của Wikipedia chắc chắn đẹp hơn)

    Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

    Cấu trúc IMDB HTML

    Chúng ta có thể thấy ngay rằng chúng ta sẽ cần một công cụ tốt hơn các hàm chuỗi và các biểu thức thông thường ở đây. Thay vì một danh sách với các mục danh sách, chúng tôi thấy các

    php
    # curl.php
    
    // Initialize a connection with cURL (ch = cURL handle, or "channel")
    $ch = curl_init();
    
    // Set the URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
    
    // Set the HTTP method
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    
    // Return the response instead of printing it out
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // Send the request and store the result in $response
    $response = curl_exec($ch);
    
    echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
    echo 'Response Body: ' . $response . PHP_EOL;
    
    // Close cURL resource to free up system resources
    curl_close($ch);
    
    5 lồng nhau. Không có
    php
    # curl.php
    
    // Initialize a connection with cURL (ch = cURL handle, or "channel")
    $ch = curl_init();
    
    // Set the URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
    
    // Set the HTTP method
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    
    // Return the response instead of printing it out
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // Send the request and store the result in $response
    $response = curl_exec($ch);
    
    echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
    echo 'Response Body: ' . $response . PHP_EOL;
    
    // Close cURL resource to free up system resources
    curl_close($ch);
    
    6 mà chúng ta có thể sử dụng để nhảy vào nội dung có liên quan. Nhưng tồi tệ nhất trong tất cả: năm sinh được chôn cất trong đoạn trích tiểu sử hoặc không thể nhìn thấy được! 😱

    Chúng tôi sẽ cố gắng tìm một giải pháp cho các vị trí năm sau, nhưng bây giờ, ít nhất chúng ta hãy lấy tên của Jubilees của chúng tôi với XPath, một ngôn ngữ truy vấn để chọn các nút từ tài liệu DOM.

    Trong tập lệnh mới của chúng tôi, trước tiên chúng tôi sẽ tìm nạp trang bằng guzzle, chuyển đổi chuỗi HTML được trả về thành đối tượng

    php
    # curl.php
    
    // Initialize a connection with cURL (ch = cURL handle, or "channel")
    $ch = curl_init();
    
    // Set the URL
    curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
    
    // Set the HTTP method
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    
    // Return the response instead of printing it out
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    
    // Send the request and store the result in $response
    $response = curl_exec($ch);
    
    echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
    echo 'Response Body: ' . $response . PHP_EOL;
    
    // Close cURL resource to free up system resources
    curl_close($ch);
    
    7 và khởi tạo trình phân tích cú pháp XPath với nó:

    php
    # imdb.php
    
    require 'vendor/autoload.php';
    
    $httpClient = new \GuzzleHttp\Client();
    
    $response = $httpClient->get('https://www.imdb.com/search/name/?birth_monthday=12-10');
    
    $htmlString = (string) $response->getBody();
    
    // HTML is often wonky, this suppresses a lot of warnings
    libxml_use_internal_errors(true);
    
    $doc = new DOMDocument();
    $doc->loadHTML($htmlString);
    
    $xpath = new DOMXPath($doc);
    

    Chúng ta hãy xem xét kỹ hơn về HTML trong cửa sổ trên:

    • Danh sách được chứa trong phần tử
      php
      # curl.php
      
      // Initialize a connection with cURL (ch = cURL handle, or "channel")
      $ch = curl_init();
      
      // Set the URL
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
      
      // Set the HTTP method
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
      
      // Return the response instead of printing it out
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
      // Send the request and store the result in $response
      $response = curl_exec($ch);
      
      echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
      echo 'Response Body: ' . $response . PHP_EOL;
      
      // Close cURL resource to free up system resources
      curl_close($ch);
      
      8
    • Mỗi đứa trẻ trực tiếp của container này là
      php
      # curl.php
      
      // Initialize a connection with cURL (ch = cURL handle, or "channel")
      $ch = curl_init();
      
      // Set the URL
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
      
      // Set the HTTP method
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
      
      // Return the response instead of printing it out
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
      // Send the request and store the result in $response
      $response = curl_exec($ch);
      
      echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
      echo 'Response Body: ' . $response . PHP_EOL;
      
      // Close cURL resource to free up system resources
      curl_close($ch);
      
      5, với hai lớp được đặt trong thuộc tính
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      0,
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      1 và
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      2
    • Cuối cùng, tên có thể được tìm thấy trong một
      php
      # curl.php
      
      // Initialize a connection with cURL (ch = cURL handle, or "channel")
      $ch = curl_init();
      
      // Set the URL
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
      
      // Set the HTTP method
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
      
      // Return the response instead of printing it out
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
      // Send the request and store the result in $response
      $response = curl_exec($ch);
      
      echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
      echo 'Response Body: ' . $response . PHP_EOL;
      
      // Close cURL resource to free up system resources
      curl_close($ch);
      
      3, trong vòng
      php
          # fsockopen.php
      
          // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
          $request = "GET / HTTP/1.1\r\n";
          $request .= "Host: www.example.com\r\n";
          $request .= "\r\n"; // We need to add a last new line after the last header
      
          // We open a connection to www.example.com on the port 80
          $connection = fsockopen('www.example.com', 80);
      
          // The information stream can flow, and we can write and read from it
          fwrite($connection, $request);
      
          // As long as the server returns something to us...
          while(!feof($connection)) {
              // ... print what the server sent us
              echo fgets($connection);
          }
      
          // Finally, close the connection
          fclose($connection);
      
      6, trong vòng
      php
      # curl.php
      
      // Initialize a connection with cURL (ch = cURL handle, or "channel")
      $ch = curl_init();
      
      // Set the URL
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
      
      // Set the HTTP method
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
      
      // Return the response instead of printing it out
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
      // Send the request and store the result in $response
      $response = curl_exec($ch);
      
      echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
      echo 'Response Body: ' . $response . PHP_EOL;
      
      // Close cURL resource to free up system resources
      curl_close($ch);
      
      5 với lớp
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      6

    Nếu chúng ta nhìn gần hơn, chúng ta có thể làm cho nó thậm chí đơn giản hơn và bỏ qua các div và tên lớp con: chỉ có một

    php
        # fsockopen.php
    
        // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
        $request = "GET / HTTP/1.1\r\n";
        $request .= "Host: www.example.com\r\n";
        $request .= "\r\n"; // We need to add a last new line after the last header
    
        // We open a connection to www.example.com on the port 80
        $connection = fsockopen('www.example.com', 80);
    
        // The information stream can flow, and we can write and read from it
        fwrite($connection, $request);
    
        // As long as the server returns something to us...
        while(!feof($connection)) {
            // ... print what the server sent us
            echo fgets($connection);
        }
    
        // Finally, close the connection
        fclose($connection);
    
    6 trong một mục danh sách, vì vậy hãy nhắm mục tiêu trực tiếp đó:

    $links = $xpath->evaluate('//div[@class="lister-list"][1]//h3/a');
    
    foreach ($links as $link) {
        echo $link->textContent.PHP_EOL;
    }
    

    Hãy phá vỡ điều đó một cách nhanh chóng.

    • php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      8 Trả về thẻ đầu tiên (
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      9)
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      $start = stripos($html, 'id="Births"');
      
      $end = stripos($html, '

      ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

      0 với một thuộc tính có tên
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      echo $html;
      
      0 có giá trị chính xác
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      $start = stripos($html, 'id="Births"');
      
      $end = stripos($html, '

      ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

      2
    • Trong div đó, từ tất cả các yếu tố
      php
          # fsockopen.php
      
          // HTTP requires "\r\n" In HTTP, lines have to be terminated with "\r\n" because of
          $request = "GET / HTTP/1.1\r\n";
          $request .= "Host: www.example.com\r\n";
          $request .= "\r\n"; // We need to add a last new line after the last header
      
          // We open a connection to www.example.com on the port 80
          $connection = fsockopen('www.example.com', 80);
      
          // The information stream can flow, and we can write and read from it
          fwrite($connection, $request);
      
          // As long as the server returns something to us...
          while(!feof($connection)) {
              // ... print what the server sent us
              echo fgets($connection);
          }
      
          // Finally, close the connection
          fclose($connection);
      
      6 (
      php
      # wikipedia.php
      
      $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
      
      $start = stripos($html, 'id="Births"');
      
      $end = stripos($html, '

      ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

      4) trả về tất cả các neo (
      php
      # curl.php
      
      // Initialize a connection with cURL (ch = cURL handle, or "channel")
      $ch = curl_init();
      
      // Set the URL
      curl_setopt($ch, CURLOPT_URL, 'http://www.example.com');
      
      // Set the HTTP method
      curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
      
      // Return the response instead of printing it out
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
      
      // Send the request and store the result in $response
      $response = curl_exec($ch);
      
      echo 'HTTP Status Code: ' . curl_getinfo($ch, CURLINFO_HTTP_CODE) . PHP_EOL;
      echo 'Response Body: ' . $response . PHP_EOL;
      
      // Close cURL resource to free up system resources
      curl_close($ch);
      
      3)
    • Sau đó chúng tôi lặp lại thông qua kết quả và in nội dung văn bản của các phần tử neo

    Tôi hy vọng tôi đã giải thích nó đủ tốt cho trường hợp sử dụng này, nhưng trong mọi trường hợp, bài viết của chúng tôi "Xpath thực tế cho việc quét web" ở đây trên blog giải thích XPath tốt hơn nhiều và đi sâu hơn nhiều so với tôi có thể, vì vậy chắc chắn hãy kiểm tra nó (nhưng Hoàn thành đọc cái này trước! 💪)

    💡 Kiểm tra các công cụ trích xuất dữ liệu của ScrapingBeeCheck out ScrapingBee's data extraction tools

    Với một cuộc gọi API duy nhất, bạn có thể tìm nạp một trang và trích xuất bất kỳ dữ liệu nào, dựa trên các bộ đường dẫn tùy chỉnh.

    Guzzle là một ứng dụng khách HTTP tuyệt vời, nhưng nhiều người khác cũng tuyệt vời như nhau - nó chỉ là một trong những ứng dụng trưởng thành và được tải xuống nhiều nhất. PHP có một cộng đồng rộng lớn, tích cực; Bất cứ điều gì bạn cần, có một cơ hội tốt người khác đã viết thư viện hoặc khung cho nó và việc cạo web cũng không ngoại lệ.

    4. Goutte và IMDB

    Goutte là một ứng dụng khách HTTP được tạo ra để cạo web. Nó được tạo ra bởi Fabien Potencier, người tạo ra khung Symfony và kết hợp một số thành phần Symfony để làm cho việc quét web rất thoải mái:

    • Thành phần BrowserKit mô phỏng hành vi của trình duyệt web mà bạn có thể sử dụng theo chương trình.
    • Hãy nghĩ về thành phần Domcrawler là DomDocument và XPath trên steroid - ngoại trừ việc steroid và Domcrawler là tốt!
    • Thành phần CssSelector dịch các bộ chọn CSS sang biểu thức XPath.
    • Máy khách HTTP Symfony được phát triển và duy trì bởi nhóm Symfony và, một cách tự nhiên, dễ dàng tích hợp vào hệ sinh thái Symfony tổng thể.

    Hãy cài đặt Goutte với

    php
    # wikipedia.php
    
    $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
    
    $start = stripos($html, 'id="Births"');
    
    $end = stripos($html, '

    ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

    6 và tạo lại ví dụ XPath trước đó với nó:

    GET / HTTP/1.1
    Host: www.example.com
    
    0

    Điều này một mình đã khá tốt - chúng tôi đã lưu bước mà chúng tôi phải vô hiệu hóa rõ ràng các cảnh báo XML và không cần phải tự khởi tạo một đối tượng

    php
    # wikipedia.php
    
    $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
    
    $start = stripos($html, 'id="Births"');
    
    $end = stripos($html, '

    ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

    7. Bây giờ, chúng ta hãy sử dụng bộ chọn CSS "gốc" thay vì đánh giá XPath thủ công (nhờ thành phần CSSSselector được tích hợp vào Goutte):

    GET / HTTP/1.1
    Host: www.example.com
    
    1

    Tôi thích nơi này là đi; Kịch bản của chúng tôi ngày càng trông giống như một cuộc trò chuyện mà ngay cả một người không lập trình cũng có thể hiểu được, không chỉ là mã. Tuy nhiên, bây giờ là lúc để tìm hiểu xem bạn có mã hóa hay không 🤨: Tập lệnh này có trả về kết quả khi chạy nó không? Bởi vì đối với tôi, lúc đầu không - tôi đã dành một giờ để gỡ lỗi tại sao và cuối cùng đã phát hiện ra một giải pháp:

    GET / HTTP/1.1
    Host: www.example.com
    
    2

    Hóa ra, lý do tại sao Goutte (chính xác hơn: Domcrawler) không báo cáo cảnh báo XML là nó chỉ vứt bỏ các phần mà nó không thể phân tích được. Thư viện bổ sung giúp HTML5 cụ thể và sau khi cài đặt nó, tập lệnh chạy như mong đợi.

    Chúng ta sẽ nói nhiều hơn về điều này sau, nhưng bây giờ, chúng ta hãy nhớ rằng chúng ta vẫn còn thiếu những năm sinh của Jubilees. Đây là nơi một thư viện quét web như Goutte thực sự tỏa sáng: chúng ta có thể nhấp vào liên kết! Và thực sự: nếu chúng ta nhấp vào một trong các tên trong danh sách sinh nhật để truy cập hồ sơ của một người, chúng ta có thể thấy một dòng "Sinh ra:" và trong phần tử HTML A

    php
    # wikipedia.php
    
    $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
    
    $start = stripos($html, 'id="Births"');
    
    $end = stripos($html, '

    ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

    8 trong DIV với ID
    php
    # wikipedia.php
    
    $html = file_get_contents('https://en.wikipedia.org/wiki/December_10');
    
    $start = stripos($html, 'id="Births"');
    
    $end = stripos($html, '

    ', $offset = $start); $length = $end - $start; $htmlSection = substr($html, $start, $length); echo $htmlSection;

    9:

    Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

    IMDB HTML Stacture

    Lần này, tôi sẽ không giải thích các bước duy nhất mà chúng tôi sẽ thực hiện trước đó, nhưng chỉ trình bày cho bạn kịch bản cuối cùng; Tôi tin rằng nó có thể nói cho chính nó:

    GET / HTTP/1.1
    Host: www.example.com
    
    3

    Hướng dẫn can you scrape data with php? - bạn có thể quét dữ liệu bằng php không?

    Nhìn vào đầu ra sạch này

    Vì có 50 người trên trang, phải thực hiện 50 yêu cầu nhận thêm, vì vậy việc chạy kịch bản sẽ mất nhiều thời gian hơn một chút, nhưng bây giờ chúng tôi cũng có ngày sinh nhật cho mỗi năm mươi người này.

    Tuyệt vời, nhưng những gì về những người khác mà bạn nói? Và bạn đã đúng, có hơn 1.000 người được liệt kê trên IMDB, những người chia sẻ ngày 10 tháng 12 là sinh nhật của họ và chúng ta không nên bỏ qua họ. Hãy bước vào thế giới vui vẻ đẹp đẽ với phân trang 😳.

    Khi nội dung được chia thành các trang khác nhau, nó luôn có một chút khó khăn, vì bạn cũng cần xử lý quản lý trang và thay đổi sang trang tiếp theo, một khi bạn đã truy cập tất cả dữ liệu trên trang hiện tại. Điều này có thể đặc biệt khó khăn trong bối cảnh cuộn vô tận, nhưng may mắn thay, IMDB tuân theo cách tiếp cận truyền thống với các nút

    preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }
    0.

    Vì vậy, hãy mở rộng ví dụ mã trước đây của chúng tôi theo một cách nào đó, nó không chỉ thu thập dữ liệu trang đầu tiên mà còn tất cả các trang. Để làm như vậy, chúng tôi sẽ giới thiệu một biến

    preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }
    1 mới, chúng tôi sẽ khởi tạo với URL bắt đầu của chúng tôi, sau đó di chuyển mã trình thu thập thông tin chính của chúng tôi vào vòng lặp
    preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }
    2 và cuối cùng - kiểm tra xem mỗi lần lặp xem có liên kết tiếp theo hay không. Nếu không có, chúng tôi đã đến trang cuối cùng và có thể gọi nó một ngày sau khi đã tổng hợp một danh sách dài những người mà chúng tôi phải gửi thiệp chúc mừng sinh nhật. Tuy nhiên, nếu chúng tôi thực sự tìm thấy một liên kết tiếp theo, chúng tôi sẽ biết rằng chúng tôi chưa hoàn thành, lưu trữ URL của liên kết trong
    preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }
    1 và bắt đầu thêm một lần lặp lại vòng lặp của chúng tôi.

    Ở đây chúng tôi đi.

    GET / HTTP/1.1
    Host: www.example.com
    
    4

    Bản tóm tắt

    Tại thời điểm này, mã của chúng tôi vẫn còn khá ngắn gọn và thực hiện chính xác tất cả những gì chúng tôi đã đi làm. Nó bắt đầu tại liên kết IMDB đã cho, thu thập các hồ sơ được liệt kê cùng với ngày sinh từ các trang mà các tác nhân riêng lẻ và tiếp tục đến bộ diễn viên tiếp theo, miễn là có thêm dữ liệu.

    Khi Guzle xử lý mọi thứ theo yêu cầu mặc định, chắc chắn sẽ mất một chút thời gian để tìm nạp tất cả hơn 1.000 hồ sơ và đó chính xác là cơ hội để xây dựng để cải tiến thêm:

    • Guzle không hỗ trợ các yêu cầu đồng thời; Có lẽ chúng ta có thể tận dụng điều đó để cải thiện tốc độ xử lý.
    • IMDB có hình ảnh cho hầu hết các danh sách của họ, sẽ không đáng yêu nếu có ảnh hồ sơ của mỗi diễn viên? (Gợi ý:
      preg_match_all('@
    • (.+)
    • @'
      , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }
      4)

    5. Trình duyệt không đầu

    Đây là một điều: Khi chúng tôi nhìn vào cây HTML DOM trong bảng điều khiển nhà phát triển, chúng tôi đã không thấy mã HTML thực tế đã được gửi từ máy chủ đến trình duyệt, nhưng kết quả cuối cùng của cách giải thích của Trình duyệt về cây Dom. Nếu một trang web không sử dụng JavaScript, đầu ra đó sẽ không khác nhau nhiều, nhưng JavaScript càng chạy, thì càng có nhiều khả năng nó sẽ thay đổi cây DOM từ những gì máy chủ đã gửi ban đầu.

    Khi một trang web sử dụng AJAX để tải nội dung động hoặc khi ngay cả HTML hoàn chỉnh cũng được tạo động với JavaScript, chúng tôi không thể truy cập nó chỉ bằng cách tải xuống tài liệu HTML gốc từ máy chủ. Các công cụ như Goutte có thể mô phỏng rất nhiều khi nói đến hành vi của trình duyệt, nhưng chúng vẫn có giới hạn của chúng. Đây là nơi mà các trình duyệt không đầu được gọi là phát huy tác dụng.

    Một trình duyệt không đầu chạy một công cụ trình duyệt chính thức mà không có giao diện người dùng đồ họa và nó có thể được điều khiển theo chương trình theo cách tương tự như trước đây với trình duyệt mô phỏng.

    Symfony Panther là một thư viện độc lập cung cấp các API giống như Goutte - điều này có nghĩa là bạn có thể sử dụng nó như một sự thay thế thả vào trong các tập lệnh Goutte trước đây của chúng tôi. Một tính năng hay là nó có thể sử dụng cài đặt Chrome hoặc Firefox hiện có trên máy tính của bạn để bạn không cần cài đặt phần mềm bổ sung.

    Vì chúng tôi đã đạt được mục tiêu nhận được ngày sinh nhật từ IMDB, hãy kết thúc hành trình của chúng tôi với việc lấy ảnh chụp màn hình từ trang mà chúng tôi rất siêng năng phân tích cú pháp.

    Sau khi cài đặt Panther với

    preg_match_all('@
  • (.+)
  • @'
    , $htmlSection, $matches); $listItems = $matches[1]; foreach ($listItems as $item) { echo "{$item}\n\n"; }
    5, chúng tôi có thể viết tập lệnh của mình chẳng hạn như sau:

    GET / HTTP/1.1
    Host: www.example.com
    
    5

    Sự kết luận

    Chúng tôi đã tìm hiểu về một số cách để loại bỏ web với PHP ngày hôm nay. Tuy nhiên, có một vài chủ đề mà chúng tôi chưa nói đến - ví dụ, chủ sở hữu trang web thường thích các trang web của họ chỉ được truy cập bởi người dùng cuối và không quá hạnh phúc nếu chúng được truy cập theo bất kỳ kiểu tự động nào.

    • Khi chúng tôi sử dụng Goutte để tải tất cả các trang liên tiếp, IMDB có thể đã giải thích điều này là bất thường và có thể đã chặn địa chỉ IP của chúng tôi truy cập thêm trang web của họ.
    • Nhiều trang web có giới hạn lãi suất để ngăn chặn các cuộc tấn công từ chối dịch vụ.
    • Tùy thuộc vào quốc gia bạn sống và nơi đặt máy chủ, một số trang web có thể không có sẵn từ máy tính của bạn.
    • Quản lý các trình duyệt không đầu cho các trường hợp sử dụng khác nhau có thể mất phí hiệu suất trên máy của bạn (đôi khi tôi nghe như một động cơ phản lực).

    Đó là nơi các dịch vụ như ScrapingBee có thể giúp đỡ: Bạn có thể sử dụng API Bee Scraping để ủy thác hàng ngàn yêu cầu mỗi giây mà không sợ bị giới hạn hoặc thậm chí bị chặn để bạn có thể tập trung vào những gì quan trọng: nội dung.

    Tôi hy vọng bạn thích bài viết này, nếu bạn là trường học cũ hơn, hãy xem trang web này với bài viết của Perl

    Nếu bạn muốn sử dụng một cái gì đó miễn phí, chúng tôi cũng đã đánh giá triệt để nhà cung cấp proxy miễn phí được sử dụng nhiều nhất.

    Nếu bạn muốn đọc thêm về việc quét web mà không bị chặn, chúng tôi đã viết một hướng dẫn đầy đủ, nhưng chúng tôi vẫn sẽ rất vui mừng nếu bạn quyết định thử con ong cào, 1.000 yêu cầu đầu tiên đang ở trên chúng tôi!give Scraping Bee a try, the first 1,000 requests are on us!

    Nó có hợp pháp để quét dữ liệu không?

    Mặc dù nó hoàn toàn hợp pháp để loại bỏ dữ liệu có sẵn công khai, có hai loại thông tin mà bạn nên thận trọng. Đó là: dữ liệu có bản quyền. Thông tin cá nhân.it's completely legal to scrape publicly available data, there are two types of information that you should be cautious about. These are: Copyrighted data. Personal information.

    Có hợp pháp để cạo dữ liệu từ các trang web công cộng không?

    Đó là một quan niệm sai lầm phổ biến rằng việc cạo web là bất hợp pháp, không phải, nó cũng không phải là hack hoặc trộm cắp dữ liệu.Không có luật cụ thể nào cấm lấy dữ liệu.Những người phế liệu chuyên nghiệp tuân theo các quy tắc bảo vệ dữ liệu và chỉ truy cập dữ liệu có sẵn công khai.There are no specific laws that prohibit data scraping. Professional scrapers follow data protection rules and access only publicly available data.

    HTML có hợp pháp không?

    Cào và bò không phải là bất hợp pháp.Rốt cuộc, bạn có thể cạo hoặc bò trang web của riêng bạn, mà không gặp trở ngại.Các công ty khởi nghiệp thích nó bởi vì đó là một cách rẻ tiền và mạnh mẽ để thu thập dữ liệu mà không cần quan hệ đối tác.. After all, you could scrape or crawl your own website, without a hitch. Startups love it because it's a cheap and powerful way to gather data without the need for partnerships.

    Làm thế nào tôi có thể lấy dữ liệu từ một trang web khác trong PHP?

    Trong JavaScript, bạn có thể sử dụng AJAX để gửi yêu cầu của mình và đăng/nhận dữ liệu.Trong PHP, bạn có thể sử dụng [url = Hồi http://www.php.net/manual/en/book.curl.php,] curl hoặc phần mở rộng PECL [url = Hồi http://www.php.net/Hướng dẫn sử dụng/en/book.http.php]] http để gửi yêu cầu và nhận phản hồi.[URL=“http://www.php.net/manual/en/book.curl.php”]cURL or the PECL extension [URL=“http://www.php.net/manual/en/book.http.php”]HTTP to send requests and receive responses.