2010-11-15 14 views
5

में करता है तो मैं cUrl लाइब्रेरी का उपयोग करके एक स्क्रीन स्क्रैप करने की कोशिश कर रहा हूं।PHP कर्ल रिटर्न 400 खराब अनुरोध यदि लूप

मैं स्क्रैप, कुछ यूआरएल (5-10) सफलतापूर्वक स्क्रीन करने में कामयाब रहा।

हालांकि जब भी मैं पाश एक थोक (10-20) यूआरएल,

यह एक बिंदु पिछले कुछ यूआरएल होगा रिटर्न तक पहुंच जाएगा "HTTP/1.1 400 गलत अनुरोध" scraping के लिए एक में इसे चलाने के। आपके ब्राउज़र ने एक अनुरोध भेजा है कि यह सर्वर समझ नहीं सका।
अनुरोध हेडर फ़ील्ड की संख्या इस सर्वर की सीमा से अधिक है।

मुझे पूरा यकीन है कि यूआरएल सही और सही ढंग से छंटनी की जाती है और हेडर की लंबाई अलग-अलग होती है। यदि मैं स्क्रैप करने के लिए सूची के शीर्ष पर इन अंतिम कुछ यूआरएल डालता हूं, तो यह जाता है, लेकिन सूची के अंतिम कुछ को फिर से 400 खराब अनुरोध त्रुटि मिलती है। क्या समस्या हो सकती है? क्या कारण हो सकता है?

कोई सलाह?

कुछ नीचे की तरह:

 

for($i=0;$i > sizeof($url);$i++)  
$data[$i] = $this->get($url[$i]); 



function get($url) { 

$this->headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg'; 
     $this->headers[] = 'Connection: Keep-Alive'; 
     $this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'; 
     $this->user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.12) Gecko/20101026 Firefox/3.6.12 (.NET CLR 3.5.30729)'; 

set_time_limit(EXECUTION_TIME_LIMIT); 
     $default_exec_time = ini_get('max_execution_time'); 

     $this->redirectcount = 0; 
     $process = curl_init($url); 
     curl_setopt($process, CURLOPT_HTTPHEADER, $this->headers); 
     curl_setopt($process, CURLOPT_HEADER, 1); 
     curl_setopt($process, CURLOPT_USERAGENT, $this->user_agent); 
     if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEFILE, $this->cookie_file); 
     if ($this->cookies == TRUE) curl_setopt($process, CURLOPT_COOKIEJAR, $this->cookie_file); 

     //off compression for debugging's sake 
     //curl_setopt($process,CURLOPT_ENCODING , $this->compression); 

     curl_setopt($process, CURLOPT_TIMEOUT, 180); 
     if ($this->proxy) curl_setopt($process, CURLOPT_PROXY, $this->proxy); 
     if ($this->proxyauth){ 
      curl_setopt($process, CURLOPT_HTTPPROXYTUNNEL, 1); 
      curl_setopt($process, CURLOPT_PROXYUSERPWD, $this->proxyauth); 
     } 
     curl_setopt($process, CURLOPT_RETURNTRANSFER, 1); 
     curl_setopt($process, CURLOPT_FOLLOWLOCATION, TRUE); 
     curl_setopt($process,CURLOPT_MAXREDIRS,10); 

     //added 
     //curl_setopt($process, CURLOPT_AUTOREFERER, 1); 
     curl_setopt($process,CURLOPT_VERBOSE,TRUE); 
     if ($this->referrer) curl_setopt($process,CURLOPT_REFERER,$this->referrer); 

     if($this->cookies){ 
      foreach($this->cookies as $cookie){ 
       curl_setopt ($process, CURLOPT_COOKIE, $cookie); 
       //echo $cookie; 
      } 
     } 

     $return = $this->redirect_exec($process);//curl_exec($process) or curl_error($process); 
     curl_close($process); 
     set_time_limit($default_exec_time);//setback to default 

     return $return; 
    } 

    function redirect_exec($ch, $curlopt_header = false) { 

    //curl_setopt($ch, CURLOPT_HEADER, true); 
    //curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    $data = curl_exec($ch); 
    $file = fopen(DP_SCRAPE_DATA_CURL_DIR.$this->redirectcount.".html","w"); 
    fwrite($file,$data); 
    fclose($file); 

    $info = curl_getinfo($ch); 
    print_r($info);echo "
"; $http_code = $info['http_code']; if ($http_code == 301 || $http_code == 302 || $http_code == 303) { //list($header) = explode("\r\n\r\n", $data); //print_r($header); $matches = array(); //print_r($data); //Check if the response has a Location to redirect to preg_match('/(Location:|URI:)(.*?)\n/', $data, $matches); $url = trim(array_pop($matches)); //print_r($url); $url_parsed = parse_url($url); //print_r($url_parsed); if (isset($url_parsed['path']) && isset($url) && !empty($url)) { //echo "
".$url; curl_setopt($ch, CURLOPT_URL, MY_HOST.$url); //echo "
".$url; $this->redirectcount++; return $this->redirect_exec($ch); //return $this->get(MY_HOST.$url); //$this->redirect_exec($ch); } } elseif($http_code == 200){ $matches = array(); preg_match('/(/i', $data, $matches); //print_r($matches); $url = trim(array_pop($matches)); //print_r($url); $url_parsed = parse_url($url); //print_r($url_parsed); if (isset($url_parsed['path']) && isset($url) && !empty($url)) { curl_setopt($ch, CURLOPT_URL, $url); //echo "
".$url; $this->redirectcount++; sleep(SLEEP_INTERVAL); return $this->redirect_exec($ch); //return $this->get($url); //$this->redirect_exec($ch); } } //echo "data ".$data; $this->redirectcount++; return $data ; // $info['url']; }

जहां $ यूआरएल सभी GET अनुरोध

मैं curl_getinfo से महसूस किया के लिए सभी क्वेरी स्ट्रिंग युक्त यूआरएल हैं, [request_size] में अधिकाधिक महत्वपूर्ण हो रही है जो इसे नहीं होना चाहिए .. यह एक ही आकार के बारे में होना चाहिए। मैं डीबग करने के लिए अपनी http अनुरोध जानकारी कैसे प्रिंट/गूंज सकता हूं?

+0

कृपया हमें अपना कोड दिखाएं। मुझे संदेह है कि आप प्रत्येक पुनरावृत्ति के लिए उन्हें रीसेट करने के बजाय पैरामीटर पर पिलिंग रखें। – deceze

+1

हम घड़ी के बिना समय नहीं बता सकते हैं, लेकिन आप कह रहे हैं कि घड़ी टूट गई है। हमें घड़ी दिखाओ। – stillstanding

+0

मूल रूप से, मैं gET का उपयोग कर $ url पर curl_exec पर लूप के लिए एक कर रहा हूं। $ यूआरएल [0] .. $ यूआरएल [99] एक ही लंबाई का है, पैरामीटर पर पिलिंग नहीं।हालांकि वार्डों पर $ url [9 0] से, मैं 400 खराब अनुरोध त्रुटि मार रहा हूं। – flyclassic

उत्तर

5

गुणा हेडर के बारे में आपकी समस्या get विधि के शीर्ष पर है:

$this->headers[] = 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg'; 
$this->headers[] = 'Connection: Keep-Alive'; 
$this->headers[] = 'Content-type: application/x-www-form-urlencoded;charset=UTF-8'; 

प्रत्येक यात्रा पर आप वस्तु उदाहरण के headers सरणी के लिए एक ही हेडर जोड़ रहे हैं। (array[] सरणी में जोड़ता है।) आपको प्रत्येक पुनरावृत्ति पर सरणी को रीसेट करने की आवश्यकता है या शायद हेडर सेटिंग को किसी अन्य विधि में ले जाना है।

headers हमेशा और केवल get विधि में सेट किया गया है, तो आप क्रम में इस समस्या को ठीक करने के लिए इस के लिए इसे बदल सकते हैं:

$this->headers = array(
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg', 
    'Connection: Keep-Alive', 
    'Content-type: application/x-www-form-urlencoded;charset=UTF-8' 
); 

... लेकिन अगर हेडर हमेशा एक ही है और कभी नहीं बदल रहे हैं पुनरावृत्तियों के बीच, आप ऑब्जेक्ट कन्स्ट्रक्टर में हेडर के मान को भी सेट कर सकते हैं और केवल get विधि में इसे पढ़ सकते हैं, क्योंकि सरणी को उसी मान पर रीसेट करना हर समय अनावश्यक है।

+0

मुझे लगता है कि यह एक बेवकूफ गलती थी .. धन्यवाद! – flyclassic

+0

@fly: मेरी खुशी। –

0

CURLINFO_HEADER_OUT को सत्य पर सेट करने के लिए, मैं भेजी गई अनुरोध जानकारी पुनर्प्राप्त करने में सक्षम हूं।

दरअसल, अनुरोध हेडर अधिक से अधिक जानकारी

मैं विशेष रूप से इस हेडर incrementing है हो जाता है!

 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg 
Connection: Keep-Alive 
Content-type: application/x-www-form-urlencoded;charset=UTF-8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg 
Connection: Keep-Alive 
Content-type: application/x-www-form-urlencoded;charset=UTF-8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg 
Connection: Keep-Alive 
Content-type: application/x-www-form-urlencoded;charset=UTF-8 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8, image/gif, image/x-bitmap, image/jpeg, image/pjpeg 
Connection: Keep-Alive 
Content-type: application/x-www-form-urlencoded;charset=UTF-8
+0

कोई भी जानता है कि क्या हो रहा है? स्वीकार करने के लिए हेडर कैसे आते हैं और सामग्री-प्रकार प्रत्येक बार जब यह पुनरावृत्ति के माध्यम से चलता है ???? – flyclassic

+0

यदि आप इसमें अधिक जानकारी जोड़ रहे हैं, तो उत्तर न बनाएं, आपको अपना प्रश्न अपडेट करना चाहिए। समय पर आदेश दिए गए उत्तरों को हर कोई नहीं देखता है। (AFAIK डिफ़ॉल्ट ऑर्डरिंग वोटों द्वारा है।) –

संबंधित मुद्दे