2015-05-13 58 views
0

嗨!我正在使用PHP制作网络爬虫。起初,当我刚得到 网页内容(使用函数get_links)时,它很快,但在添加了所有其他函数后,它变得非常缓慢。 我的网络爬虫是从字面上爬行。当我检查Inspector中的网络监视器 时,我根本没有收到任何回应。什么可能是 的问题?互联网速度是一个因素吗?为什么 加载时间太长?如果你可能会问,我的flatform是Ubuntu 15.4,我只是使用一个 本地主机作为服务器。这是我的代码。什么让我的网络爬虫慢?

<?php 
    error_reporting(E_ALL); 
    ini_set('display_errors', '1'); 


    $to_crawl = "http://bestspace.com"; 
    $c = array(); 
    $i = 0; 

    function get_links($url) { 
     global $c; 
     $input = @file_get_contents($url); 
     $regexp = "<a\s[^>]*href=(\"??)([^\">]*?)\\1[^>]*>(.*)<\/a>"; 
     preg_match_all("/$regexp/siU", $input, $matches); 
     $base_url = parse_url($url, PHP_URL_HOST); 
     $l = $matches[2]; 

     foreach($l as $link) { 

      if (strpos($link, "#")) { 
       $link = substr($link, 0, strpos($link, "#")); 
      } 
      if (substr($link,0,1) == ".") { 
       $link = substr($link, 1); 
      } 
      if (substr($link,0,7) == "http://") { 
       $link = $link; 
      } 
      else if (substr($link,0,8) == "https://") { 
       $link = $link; 
      } 
      else if (substr($link,0,2) == "//") { 
       $link = substr($link, 2); 
      } 
      else if (substr($link,0,1) == "#") { 
       $link = $url; 
      } 
      else if (substr($link,0,7) == "mailto:") { 
       $link = "[".$link."]"; 
      } 
      else { 
       if (substr($link, 0, 1) != "/") { 
        $link = $base_url."/".$link; 
       } 
       else { 
        $link = $base_url.$link; 
       } 
      } 

      if (substr($link, 0, 7) != "http://" && substr($link, 0, 8) != "https://" && substr($link, 0, 1) != "[") { 
       if (substr($link, 0, 8) == "https://") { 
        $link = "https://".$link; 
       } 
       else { 
        $link = "http://".$link; 
       } 
      } 
      //echo $link."<br/>"; 
      if (!in_array($link, $c)) { 
       array_push($c, $link); 
      } 

     } 
    } 

    get_links($to_crawl); 
    //echo "ARRAY <br />"; 
    foreach ($c as $page) { 
     # code... 
     get_links($page); 
     //echo $page."<br />"; 
    } 


    function get_domain($url) 
    { 
     $host = @parse_url($url, PHP_URL_HOST); 
     if (!$host) 
      $host = $url; 

     if (substr($host, 0, 4) == "www.") 
      $host = substr($host, 4); 

     if (strlen($host) > 50) 
      $host = substr($host, 0, 47) . '...'; 

     return $host; 
    } 


    function content_type($url) { 

     $ch = curl_init($url); 
     curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1) ; 
     $content = curl_exec($ch); 
     if(!curl_errno($ch)) 
      { 
       $info = curl_getinfo($ch, CURLINFO_CONTENT_TYPE); 

      } 
    return $info; 
    curl_close($ch); 

    } 


     echo "<table class = 'table table-striped'>"; 
     echo "<tbody>"; 
     echo "<tr>"; 
     echo "<th>#</th><th>DOMAIN NAME</th><th>CATEGORY</th><th>URL</th>"; 
     echo "</tr>"; 
    foreach ($c as $page) { 
     $i++; 
     echo "<tr>"; 
     echo "<td >".$i."</td><td>".get_domain($to_crawl)."</td><td>".content_type($page)."</td><td>".$page; 
     echo "</td>"; 

     echo "</tr>"; 
     } 
     echo "</tbody>"; 
     echo "</table>"; 

    ?> 

+0

嗨@RealJho你试过simplehtmldom?它会帮助你不重新发明轮子和使用你的自定义函数,但简单的jQuery,如从链接,表格等获取信息的函数。:) –

+0

@oserk这是否意味着解析使它变慢? – RealJho

+0

它可能是你的正则表达式太多匹配或循环太多是你get_doman或get_links函数,使您的脚本缓慢工作,我不知道没有复制你的代码,所以我不能调试它,,但你应该重新考虑我发给你的simplehtmldom lib链接到.. –

回答

0

我要送你链接到彻底调查,因为它只是像jQuery的网页。这是高质量的网络爬行软件,你会更高效,相信我!

看看例子,感谢我后来:)

http://simplehtmldom.sourceforge.net/

心连心,K