首頁 >後端開發 >php教程 >爬蟲基礎教學:PHP 程式實作單執行緒和多執行緒抓取數據

爬蟲基礎教學:PHP 程式實作單執行緒和多執行緒抓取數據

WBOY
WBOY原創
2023-06-13 11:39:121104瀏覽

爬蟲基礎教學:PHP 程式實作單一執行緒和多執行緒抓取資料

隨著網路技術的發展,爬蟲技術也越來越被廣泛應用於各種資料擷取場景。爬蟲技術簡單地說,就是模擬瀏覽器行為,對目標網站發起請求,取得網頁內容,並進行資料擷取與分析。

在 PHP 程式中,實作爬蟲技術可以藉助第三方元件,例如 cURL 和 Simple HTML DOM,這些元件大大簡化了資料抓取的工作量。本篇文章將介紹如何使用 PHP 實作單執行緒和多執行緒方式進行資料抓取。

一.單執行緒資料抓取

單執行緒資料抓取簡單來說就是在一個執行緒中依序抓取目標網站的每個頁面,然後對頁面進行資料提取和解析。

在 PHP 中,可以使用 cURL 元件實作單頁資料的獲取,這裡提供一個簡單的範例。

<?php

// 进行 cURL 初始化
$ch = curl_init();

// 设置 URL 和其他参数
curl_setopt($ch, CURLOPT_URL, "http://example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

// 获取页面内容
$page_data = curl_exec($ch);

// 关闭 cURL 
curl_close($ch);

?>

透過以上程式碼,就可以取得指定網站的首頁內容。接下來就可以透過 Simple HTML DOM 元件對頁面內容進行分析,以取得所需的資料。

<?php
// 引入 Simple HTML DOM 组件
require_once('simple_html_dom.php');

// 获取页面内容
$page_data = file_get_html('http://example.com/');

// 获取某个节点
$node = $page_data->find('#content', 0);

// 获取节点文本
$text = $node->plaintext;

?>

透過上述程式碼,就可以取得指定網站首頁中 id 為 content 的節點文字內容。

二. 多執行緒資料抓取

單執行緒資料抓取的限制是速度慢,但在簡單的資料擷取場景中是可以滿足需求的,但如果需要取得更多的數據,就需要考慮使用多執行緒方式進行抓取。

多線程資料抓取的原理是把資料請求和資料處理分成多個線程,同時進行,這樣可以提高整個資料獲取和分析的效率。在 PHP 中,可以使用多種方法實作多執行緒資料抓取,例如使用多個 curl 元件、使用多進程方式等。這裡提供一個使用 curl 多線程方式的範例。

<?php 

// 定义目标 URL 列表
$urls = array(
    'http://example.com/1.html',
    'http://example.com/2.html',
    'http://example.com/3.html',
    'http://example.com/4.html',
    'http://example.com/5.html'
);

// 线程数
$max_threads = 5;

$curlopt_array = array();

// 创建多个 cURL 组件
for ($i = 0; $i < $max_threads; $i++) {
    $ch[$i] = curl_init();
}

// 设置 cURL 参数
foreach ($urls as $index => $url) {
    $ch_index = $index % $max_threads;
    curl_setopt($ch[$ch_index], CURLOPT_URL, $url);
    curl_setopt($ch[$ch_index], CURLOPT_RETURNTRANSFER, 1);
    $curlopt_array[$ch_index][] = $ch[$ch_index];
}

// 处理所有 cURL 请求
$mh = curl_multi_init();

foreach ($curlopt_array as $ch_array) {
    foreach ($ch_array as $ch) {
        curl_multi_add_handle($mh,$ch);
    }
}

// 执行多线程请求
$running = NULL;
do {
    usleep(10000);
    curl_multi_exec($mh, $running);
} while ($running > 0);

// 关闭所有 cURL
foreach ($ch as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// 关闭 cURL 多线程 handler
curl_multi_close($mh);

?>

透過上述程式碼,就可以同時傳送多個請求,從而實現多執行緒抓取資料的功能。然後,可以使用 Simple HTML DOM 元件對頁面內容進行解析,以取得所需的資料。

<?php

// 定义目标 URL 列表
$urls = array(
    'http://example.com/'
);

// 定义线程数
$max_threads = 5;

// 定义处理函数
function handle_page_data($page_data) {
    // 解析 HTML 页面
    $html = str_get_html($page_data);
    // 获取节点
    $node = $html->find('#content', 0);
    // 获取节点文本
    $text = $node->plaintext;
    // 处理数据
    // ...
}

// 创建多个 cURL 组件
$ch = array();
for ($i = 0; $i < $max_threads; $i++) {
    $ch[$i] = curl_init();
}

// 设置 cURL 参数
$curlopt_array = array();
foreach ($urls as $index => $url) {
    $ch_index = $index % $max_threads;
    curl_setopt($ch[$ch_index], CURLOPT_URL, $url);
    curl_setopt($ch[$ch_index], CURLOPT_RETURNTRANSFER, 1);
    $curlopt_array[$ch_index][] = $ch[$ch_index];
}

// 处理 cURL 请求
$mh = curl_multi_init();

foreach ($curlopt_array as $ch_array) {
    foreach ($ch_array as $ch) {
        curl_multi_add_handle($mh,$ch);
    }
}

// 处理多线程请求
$running = NULL;
do {
    usleep(10000);
    curl_multi_exec($mh, $running);

    // 处理数据
    while ($done = curl_multi_info_read($mh)) {
        $info = curl_getinfo($done['handle']);
        $page_data = curl_multi_getcontent($done['handle']);
        handle_page_data($page_data);
        curl_multi_remove_handle($mh, $done['handle']);
        curl_close($done['handle']);
    }   
    
} while ($running > 0);

// 关闭所有 cURL 组件
foreach ($ch as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

// 关闭 cURL 多线程 handler
curl_multi_close($mh);

?>

以上程式碼是多執行緒方式取得頁面內容,然後透過自訂函數 handle_page_data 對每頁資料進行處理。

總結

本篇文章介紹了使用PHP 實現爬蟲技術的單線程和多線程方式,單線程方便易用,但速度較慢,多線程速度更快,但需要考慮組件之間的資料互動和處理。在實際應用中,需要根據具體需求選擇適合的方案進行資料抓取和分析,以最大化資料價值。

以上是爬蟲基礎教學:PHP 程式實作單執行緒和多執行緒抓取數據的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn