2013-10-31 7 views
0

웹 사이트를 크롤링하기 위해 컬 스크립트를 실행하려고했지만 시간이 초과되었습니다. 로컬에서는 작동하지만이 서버에서는 작동하지 않습니다. 내가 아는 한 모든 것이 올바르게 설정됩니다.PHP curl crawl에 이상한 시간 초과가 발생했습니다.

참고이 코드 샘플에서는 사이트 전체 이름을 XXXXX (으)로 바꿨습니다.

[email protected]:~# wget http://xxxxx.eu 
--2013-10-31 10:30:02-- http://xxxxx.eu/ 
Resolving xxxxxx.eu (xxxxxx.eu)... 31.7.58.171, 31.7.58.172, 31.7.58.170 
Connecting to xxxxxx.eu (xxxxxx.eu)|31.7.58.171|:80... 

아이디어 :

<?php 
error_reporting(E_ALL); 
$url = "http://xxxxx.eu/search?f=b" ; 

$header = getHeaders(0); 
$request = array(); 
$request['url'] = $url ; 
$request['method'] = 'get' ; 
$request['header'] = $header ; 
echo getPageCURL($request); 

die(); 


function getHeaders($content_length=0) 
{ 

    $header = array(); 
    $header[] = "Host: xxxxx.eu"; 
    $header[] = "Accept-Language: en-us,en;q=0.5"; 
    $header[] = "Accept-Encoding: gzip, deflate"; 
    $header[] = "User-Agent: Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0"; 
    $header[] = "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; 

    if($content_length>10) $header[] = "Content Size: ".$content_length; 
    $header[] = "Content-Type: text/html; charset=utf-8"; 
    $header[] = "Content-Encoding: gzip"; 
    $header[] = "Vary: Accept-Encoding"; 
    $header[] = "Content-Length: 22"; 
    $header[] = "Connection: keep-alive"; 


    return $header; 
} 


function getPageCURL($request) 
{ 

    $page = ''; 
    $verified = ''; 
    $page_type = 'O'; 
    $filter = true; 
    $page_header = 0; 
    $followlocation = true; 
    $cookies = true; 
    $bad_url = false; 
    if(is_array($request)) 
    { 
     foreach($request as $request_key=>$request_value) 
      $$request_key = $request_value; 
    } 
    else $url = $request; 
    if(empty($url)) return ''; 
    $url = str_replace(' ', '+', $url); 

    //echo "\nCalling : ".$url; 

    for($i=1; $i<=10; $i++) 
    { 
     $curl = curl_init(); 
     if(isset($header) && is_array($header)) 
      curl_setopt($curl, CURLOPT_HTTPHEADER, $header); 
     if(isset($referer) && !empty($referer)) 
      curl_setopt($curl, CURLOPT_REFERER, $referer); 
     if(isset($ssl)) 
      curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE); 
     if(isset($method) && $method=='post') 
     { 
      curl_setopt($curl, CURLOPT_POST, true); 
      if(isset($post_data) && $post_data!='') 
      { 
       curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data); 
      } 
     } 

     if($cookies) 
     { 
      curl_setopt($curl, CURLOPT_COOKIEFILE, 'cookie.txt'); 
      curl_setopt($curl, CURLOPT_COOKIEJAR, 'cookie.txt'); 
     } 

     curl_setopt($curl, CURLOPT_TIMEOUT, 120); 

     curl_setopt($curl, CURLOPT_URL, $url);       
     curl_setopt($curl, CURLOPT_ENCODING, 'gzip,deflate'); 
     curl_setopt($curl, CURLOPT_HEADER, $page_header); 
     curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"); 
     curl_setopt($curl, CURLOPT_FOLLOWLOCATION, $followlocation); 


     $page = curl_exec($curl); 


     if(($page===false || trim($page) == '' || empty($page)) && (curl_errno($curl) == 6 || curl_errno($curl) == 7)) 
     { 
      curl_close ($curl); 
      //echo "\nNetwork problem..."; 
      sleep(10); 
      $i--; 
      continue; 
     } 
     else if(curl_errno($curl) == 6) 
     { 
      file_put_contents('cu_failed-'.time().'.txt', $page, FILE_APPEND); 
     } 


     curl_close ($curl); 
    } 
    $page = str_replace(array("\n", "\r", "\t"), " ", $page); 
    return $page; 
} 


?> 

난 그냥 해당 사이트에 기본 wget을 수행하려고하면

나는이 repsonse를 얻을? 나는 다른 사이트를 말리거나 wget 할 수 있지만이 일이 일어나지 않았습니까?

+0

명령 프롬프트에 IP 주소로 핑 (ping)을 시도하십시오. 시간 초과 문제가 있는지 확인하십시오. – Shudmeyer

+0

ping이 심각하게 나를 괴롭히는 경우 : – Fredrick

+1

방화벽 문제가 서버 측에 있습니까? – Shudmeyer

답변

1

컬링을 걸면 인증이 필요합니다. curl 초기화 후 코드 아래에 있습니다. curl_setopt ($ curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt ($ curl, CURLOPT_USERPWD, 'username : password');

더 자세히 알려면 알려주세요.

관련 문제