Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tutorial perangkak asas: Program PHP melaksanakan rangkak data satu benang dan berbilang benang

Tutorial perangkak asas: Program PHP melaksanakan rangkak data satu benang dan berbilang benang

WBOY
WBOYasal
2023-06-13 11:39:121062semak imbas

Tutorial perangkak asas: Program PHP melaksanakan rangkak satu utas dan pelbagai utas data

Dengan perkembangan teknologi Internet, teknologi perangkak semakin meluas digunakan dalam pelbagai senario pemerolehan data. Ringkasnya, teknologi perangkak mensimulasikan tingkah laku penyemak imbas, memulakan permintaan untuk menyasarkan tapak web, mendapatkan kandungan web dan melakukan pengekstrakan dan analisis data.

Dalam program PHP, teknologi perangkak boleh dilaksanakan dengan bantuan komponen pihak ketiga, seperti cURL dan Simple HTML DOM, yang sangat memudahkan beban kerja rangkak data. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan penangkapan data berbenang tunggal dan berbilang benang.

1. Merangkak data berutas tunggal

Merangkak data berutas tunggal bermaksud merangkak setiap halaman tapak sasaran secara berurutan dalam satu urutan, kemudian mengekstrak dan menghuraikan data pada halaman .

Dalam PHP, anda boleh menggunakan komponen cURL untuk mendapatkan data satu halaman Berikut ialah contoh mudah.

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

?>

Melalui kod di atas, anda boleh mendapatkan kandungan halaman utama tapak web yang ditentukan. Seterusnya, anda boleh menggunakan komponen DOM HTML Mudah untuk menganalisis kandungan halaman dan mendapatkan data yang diperlukan.

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

?>

Melalui kod di atas, anda boleh mendapatkan kandungan teks nod dengan id kandungan pada halaman utama tapak web yang ditentukan.

2. Penangkapan data berbilang benang

Penghadan penangkapan data berbenang tunggal ialah kelajuannya yang perlahan, tetapi ia boleh memenuhi keperluan dalam senario pemerolehan data yang mudah, tetapi jika anda perlu mendapatkannya lagi Jika anda mempunyai banyak data, anda perlu mempertimbangkan untuk menggunakan multi-threading untuk menangkapnya.

Prinsip penangkapan data berbilang benang adalah untuk membahagikan permintaan data dan pemprosesan data kepada berbilang rangkaian dan melaksanakannya secara serentak, yang boleh meningkatkan kecekapan keseluruhan pemerolehan dan analisis data. Dalam PHP, anda boleh menggunakan berbilang kaedah untuk melaksanakan penangkapan data berbilang benang, seperti menggunakan berbilang komponen curl, menggunakan kaedah berbilang proses, dsb. Berikut ialah contoh penggunaan curl multi-threading.

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

?>

Melalui kod di atas, anda boleh menghantar berbilang permintaan pada masa yang sama, dengan itu merealisasikan fungsi penangkapan data berbilang benang. Kemudian, anda boleh menggunakan komponen DOM HTML Mudah untuk menghuraikan kandungan halaman dan mendapatkan data yang diperlukan.

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

?>

Kod di atas memperoleh kandungan halaman dalam cara berbilang benang, dan kemudian memproses data setiap halaman melalui fungsi tersuai handle_page_data.

Ringkasan

Artikel ini memperkenalkan kaedah single-thread dan multi-threaded menggunakan PHP untuk melaksanakan teknologi crawler adalah mudah dan mudah digunakan, tetapi lebih perlahan dan berbilang benang adalah lebih pantas, tetapi memerlukan Pertimbangkan interaksi dan pemprosesan data antara komponen. Dalam aplikasi praktikal, adalah perlu untuk memilih penyelesaian yang sesuai untuk penangkapan dan analisis data berdasarkan keperluan khusus untuk memaksimumkan nilai data.

Atas ialah kandungan terperinci Tutorial perangkak asas: Program PHP melaksanakan rangkak data satu benang dan berbilang benang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn