Maison  >  Article  >  développement back-end  >  Tutoriel de base sur le robot d'exploration : le programme PHP implémente l'exploration de données monothread et multithread

Tutoriel de base sur le robot d'exploration : le programme PHP implémente l'exploration de données monothread et multithread

WBOY
WBOYoriginal
2023-06-13 11:39:121030parcourir

Tutoriel de base sur les robots d'exploration : le programme PHP implémente l'exploration de données monothread et multithread

Avec le développement de la technologie Internet, la technologie des robots d'exploration est de plus en plus largement utilisée dans divers scénarios d'acquisition de données. En termes simples, la technologie des robots d'exploration simule le comportement du navigateur, lance des requêtes pour cibler des sites Web, obtient du contenu Web et effectue l'extraction et l'analyse des données.

Dans les programmes PHP, la technologie des robots d'exploration peut être implémentée à l'aide de composants tiers, tels que cURL et Simple HTML DOM, qui simplifient considérablement la charge de travail d'exploration des données. Cet article explique comment utiliser PHP pour implémenter la capture de données monothread et multithread.

1. Exploration de données monothread

L'exploration de données monothread signifie simplement explorer chaque page du site cible de manière séquentielle dans un seul thread, puis extraire et analyser les données sur la page.

En PHP, vous pouvez utiliser le composant cURL pour obtenir des données d'une seule page. Voici un exemple simple.

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

?>

Avec le code ci-dessus, vous pouvez obtenir le contenu de la page d'accueil du site Web spécifié. Ensuite, vous pouvez utiliser le composant Simple HTML DOM pour analyser le contenu de la page et obtenir les données requises.

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

?>

Avec le code ci-dessus, vous pouvez obtenir le contenu texte du nœud avec l'identifiant du contenu sur la page d'accueil du site Web spécifié.

2. Capture de données multithread

La limitation de la capture de données monothread est sa vitesse lente, mais elle peut répondre aux besoins dans des scénarios d'acquisition de données simples. Cependant, si vous avez besoin d'obtenir plus de données, vous devez en tenir compte. en l'utilisant. Récupération de manière multithread.

Le principe de la capture de données multithread est de diviser la demande de données et le traitement des données en plusieurs threads et de les exécuter simultanément, ce qui peut améliorer l'efficacité de l'ensemble de l'acquisition et de l'analyse des données. En PHP, vous pouvez utiliser plusieurs méthodes pour implémenter la capture de données multithread, comme l'utilisation de plusieurs composants curl, l'utilisation de méthodes multi-processus, etc. Voici un exemple d'utilisation du multi-threading 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);

?>

Avec le code ci-dessus, vous pouvez envoyer plusieurs requêtes en même temps, réalisant ainsi la fonction de capture de données multithread. Ensuite, vous pouvez utiliser le composant Simple HTML DOM pour analyser le contenu de la page et obtenir les données requises.

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

?>

Le code ci-dessus obtient le contenu de la page de manière multithread, puis traite les données de chaque page via une fonction personnalisée handle_page_data.

Résumé

Cet article présente les méthodes monothread et multithread d'utilisation de PHP pour implémenter la technologie des robots. Le monothread est pratique et facile à utiliser, mais plus lent, et le multithread est plus rapide, mais l'interaction des données entre. Les composants doivent être pris en compte. Dans les applications pratiques, il est nécessaire de choisir une solution adaptée pour la capture et l’analyse des données en fonction de besoins spécifiques afin de maximiser la valeur des données.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn