ホームページ >バックエンド開発 >PHPチュートリアル >クローラーの基本チュートリアル: PHP プログラムはシングルスレッドおよびマルチスレッドのデータ クロールを実装します。

クローラーの基本チュートリアル: PHP プログラムはシングルスレッドおよびマルチスレッドのデータ クロールを実装します。

WBOY
WBOYオリジナル
2023-06-13 11:39:121104ブラウズ

基本的なクローラ チュートリアル: PHP プログラムはシングルスレッドおよびマルチスレッドのデータ キャプチャを実装します

インターネット テクノロジの発展に伴い、クローラ テクノロジはさまざまなデータ取得シナリオでますます広く使用されています。簡単に言えば、クローラー テクノロジーはブラウザーの動作をシミュレートし、ターゲット Web サイトへのリクエストを開始し、Web コンテンツを取得し、データの抽出と分析を実行します。

PHP プログラムでは、cURL や Simple HTML DOM などのサードパーティ コンポーネントを利用してクローラ テクノロジを実装できます。これらのコンポーネントにより、データ クローリングのワークロードが大幅に簡素化されます。この記事では、PHP を使用してシングルスレッドおよびマルチスレッドのデータ キャプチャを実装する方法を紹介します。

1. シングル スレッド データ クロール

シングル スレッド データ クロールとは、ターゲット サイトの各ページを 1 つのスレッドで順番にクロールし、ページ上のデータを抽出して解析することを意味します。

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);

?>

上記のコードを通じて、指定された Web サイトのホームページ コンテンツを取得できます。次に、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;

?>

上記のコードを通じて、指定された Web サイトのホームページ上のコンテンツ ID を持つノードのテキスト コンテンツを取得できます。

2. マルチスレッド データ キャプチャ

シングルスレッド データ キャプチャの制限は速度が遅いことですが、単純なデータ取得シナリオのニーズを満たすことができますが、大量のデータがある場合は、マルチスレッドを使用してデータをキャプチャすることを検討する必要があります。

マルチスレッド データ キャプチャの原理は、データ要求とデータ処理を複数のスレッドに分割し、同時に実行することです。これにより、データの取得と分析全体の効率が向上します。 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。