2013-03-10 101 views
0

我已經開始學習關於網絡爬蟲的知識,並藉助於我在下面構建這個簡單的文章的幫助。使用多線程來改進網絡爬蟲/蜘蛛

它建議使用多線程來改進和使網絡爬蟲更快。

我想知道是否有人可以幫助我瞭解有關多線程的更多信息,甚至可能將其應用於下面的抓取工具。

此外,如果您有任何其他建議或改進來改進此爬蟲,請隨時分享。

下面是代碼:

error_reporting(E_ERROR); 

define("CRAWL_LIMIT_PER_DOMAIN", 50); 

$domains = array(); 

$urls = array(); 

function crawl($url) 
{ 
    global $domains, $urls; 
    $parse = parse_url($url); 
    $domains[ $parse['host'] ]++; 
    $urls[] = $url; 

    $content = file_get_contents($url); 
    if ($content === FALSE) 
     return; 
    else { 
     // do something with content. 
    } 

    $content = stristr($content, "body"); 
    preg_match_all('/http:\/\/[^ "\']+/', $content, $matches); 

    foreach($matches[0] as $crawled_url) { 
     $parse = parse_url($crawled_url); 
     if (count($domains[ $parse['host'] ]) < CRAWL_LIMIT_PER_DOMAIN && !in_array($crawled_url, $urls)) { 
      sleep(1); 
      crawl($crawled_url); 
     } 
    } 
} 

感謝您在高級 - 我想感謝所有和任何幫助。

回答

2

幸運的是,PHP不支持多線程。你可以做的是實現異步模式,但這意味着你必須忘記漂亮的一行功能,如file_get_contents,並切換到最低級別的頁面讀取(使用fsockopen,然後在非阻塞模式下手動執行所有寫入和讀取操作,其他人在工作時需要等待),請參閱示例代碼here

+0

啊,好的。感謝您的解釋和幫助! – IMUXIxD 2013-03-10 06:13:59