2012-09-04 3 views
0

웹 페이지에있는 모든 링크를 찾아서 인쇄하는 프로그램을 PHP로 작성했습니다. 그것은 또한 발견 한 모든 링크 내부로 들어가고 똑같이합니다. 내 문제는 일부 사이트 (예 : 유튜브)에서 링크를 인쇄하거나 내부를 따르지 않는다는 것입니다. 여기 내 링크 크롤러 코즈가 특정 웹 페이지에서 작동하지 않습니다.

내 주요 코드 :

function echo_urls($site_address){ 

    if(check_valid_url($site_address)){ 
     $site = new site(); 
     $site->address = $site_address; 
     $site->full_address = "<a href=\"$site_address\">$site_address</a>"; 
     $site->depth = 0; 

     $queue = new queue(); 

     $queue->push($site); 
     array_push($queue->seen,$site->address); 

     $depth = 0; 

     while(($site = $queue->get_first())){ 
      $depth++; 
      echo $site->depth." : ".$site->full_address."<br>"; 
      $queue = push_links($site->address,$queue,$depth); 
     } 
    } 
    else; 
} 
function push_links($site_address,$queue,$depth){ 
if($depth<4){ 
     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_URL,$site_address); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 30); //timeout after 30 seconds 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); 
     $result=curl_exec ($ch); 
     curl_close ($ch); 

     if($result){ 
      preg_match_all('/<a\s[^>]*href=([\"\']??)([^\" >]*?)\\1[^>]*>(.*)<\/a>/siU', $result, $list); 

      $list = $list[0]; 

      foreach($list as $item) { 
       if(!(empty($item))) 
       if($result = get_all_string_between($item,"href=\"","\"")){ 
        if((array_search($result[0],$queue->seen))==false){ 
         $site = new site(); 
         $site->address = $result[0]; 
         $site->full_address = $item; 
         $site->depth = $depth; 
         $queue->push($site); 
         array_push($queue->seen,$site->address); 
        } 
       } 
      } 
     } 
    } 

    return $queue; 
} 
+0

가 정확하게 작동하지 않는 것에 문제를 좁힐 수 있습니다 매우 간단? 그리고 answer_wow't가 의미하는 바를 정확히 설명해주십시오. 문제는 cURL, DOM 파서, 다른 문제입니까? 오류 메시지가 나타 납니까? – Tchoupi

+0

모든 페이지를 크롤링 할 수 없습니다. - 자바 스크립트를 실행하지 않으므로 해당 경로를 통해 콘텐츠를로드하는 모든 페이지가 크롤러에 보이지 않습니다. –

+0

감사합니다. Mathieu Imbert http : \\ google.com과 같은 echo_urls 함수에 주소를 보내면 모두 인쇄됩니다. 링크는 google에 있지만 http : \\ youtube.com을 보내면 어떤 링크도 인쇄되지 않을 것입니다. – Kibo

답변

1

그것은 기능의 몇 가지보고 말할 어렵지만, 내 생각은 다음과 같습니다

  1. 유튜브는 당신에게
  2. 이 부분을 차단 if($depth<4){ FALSE를 반환 할 수 있기 때문에 push_links이 실행되지 않습니다.

또한 RegEx를 사용하지 마십시오. The DOMDocument class

관련 문제