>  기사  >  백엔드 개발  >  기본 크롤러 튜토리얼: PHP 프로그램은 단일 스레드 및 다중 스레드 데이터 크롤링을 구현합니다.

기본 크롤러 튜토리얼: PHP 프로그램은 단일 스레드 및 다중 스레드 데이터 크롤링을 구현합니다.

WBOY
WBOY원래의
2023-06-13 11:39:121079검색

기본 크롤러 튜토리얼: PHP 프로그램은 단일 스레드 및 다중 스레드 데이터 크롤링을 구현합니다.

인터넷 기술이 발전함에 따라 크롤러 기술은 다양한 데이터 수집 시나리오에서 점점 더 널리 사용되고 있습니다. 간단히 말해서 크롤러 기술은 브라우저 동작을 시뮬레이션하고, 대상 웹사이트에 대한 요청을 시작하고, 웹 콘텐츠를 획득하고, 데이터 추출 및 분석을 수행합니다.

PHP 프로그램에서 크롤러 기술은 cURL 및 Simple HTML DOM과 같은 타사 구성 요소의 도움으로 구현될 수 있어 데이터 크롤링 작업 부하를 크게 단순화합니다. 이 기사에서는 PHP를 사용하여 단일 스레드 및 다중 스레드 데이터 캡처를 구현하는 방법을 소개합니다.

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

?>

위 코드를 사용하면 지정된 웹사이트의 홈페이지 콘텐츠를 가져올 수 있습니다. 다음으로 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를 가진 노드의 텍스트 콘텐츠를 가져올 수 있습니다.

2. 멀티 스레드 데이터 캡처

단일 스레드 데이터 캡처의 한계는 느린 속도이지만 간단한 데이터 수집 시나리오의 요구 사항을 충족할 수 있습니다. 그러나 더 많은 데이터를 얻으려면 고려해야 합니다. 이를 사용하여 멀티스레드 방식으로 가져옵니다.

멀티 스레드 데이터 캡처의 원리는 데이터 요청과 데이터 처리를 여러 스레드로 나누어 동시에 수행하는 것이며, 이는 전체 데이터 수집 및 분석의 효율성을 향상시킬 수 있습니다. PHP에서는 다중 컬 구성 요소 사용, 다중 프로세스 메서드 사용 등과 같은 다중 스레드 데이터 캡처를 구현하기 위해 여러 메서드를 사용할 수 있습니다. 다음은 컬 멀티스레딩을 사용하는 예입니다.

<?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으로 문의하세요.