2013-02-19 13 views
23

Vorrei racimolare il contenuto di questo Google search result page usando l'arricciatura. Ho provato a impostare diversi programmi utente e ad impostare altre opzioni, ma non riesco a ottenere il contenuto di quella pagina, perché spesso mi viene reindirizzato o ottengo un errore di "pagina spostata".Come ottenere il contenuto della pagina usando cURL?

Credo che abbia qualcosa a che fare con il fatto che la stringa di query viene codificata da qualche parte ma non sono proprio sicuro di come aggirarlo.

//$url is the same as the link above 
    $ch = curl_init(); 
    $user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0' 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent); 
    curl_setopt ($ch, CURLOPT_HEADER, 0); 
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch,CURLOPT_CONNECTTIMEOUT,120); 
    curl_setopt ($ch,CURLOPT_TIMEOUT,120); 
    curl_setopt ($ch,CURLOPT_MAXREDIRS,10); 
    curl_setopt ($ch,CURLOPT_COOKIEFILE,"cookie.txt"); 
    curl_setopt ($ch,CURLOPT_COOKIEJAR,"cookie.txt"); 
    echo curl_exec ($ch); 

Che cosa devo fare per ottenere il mio codice php per mostrare l'esatto contenuto della pagina come vorrei vederlo il mio browser? Cosa mi manca? Qualcuno può indicarmi la giusta direzione?

Ho visto domande simili su SO, ma nessuna con una risposta che potrebbe aiutarmi.

EDIT:

ho provato ad aprire solo il collegamento mediante il selenio WebDriver, che dà gli stessi risultati come cURL. Sto ancora pensando che questo abbia a che fare con il fatto che ci sono caratteri speciali nella stringa di query che vengono incasinati da qualche parte nel processo.

+0

$ output = curl_exec ($ ch); echo $ output; –

+0

@BojanKovacevic Ho modificato il codice per mostrare che sto facendo 'echo curl_exec ($ ch);' Ricevo una pagina restituita ma non quella che sto richiedendo. – 7usam

+0

Non puoi analizzare i risultati di ricerca di Google - I risultati di Google sono il loro IP principale, non lo daranno via! - indipendentemente da ciò che fai al tuo codice, dovrai affrontare molti (MOLTI!) altri problemi, tra i quali almeno un IP in lista nera. Se stai cercando di monitorare i risultati di ricerca o SEO o simili, utilizza un software di monitoraggio adeguato come http://www.seomoz.org/ – LuckySpoon

risposta

42

questo è quanto:

/** 
    * Get a web file (HTML, XHTML, XML, image, etc.) from a URL. Return an 
    * array containing the HTTP server response header fields and content. 
    */ 
    function get_web_page($url) 
    { 
     $user_agent='Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20100101 Firefox/8.0'; 

     $options = array(

      CURLOPT_CUSTOMREQUEST =>"GET",  //set request type post or get 
      CURLOPT_POST   =>false,  //set to GET 
      CURLOPT_USERAGENT  => $user_agent, //set user agent 
      CURLOPT_COOKIEFILE  =>"cookie.txt", //set cookie file 
      CURLOPT_COOKIEJAR  =>"cookie.txt", //set cookie jar 
      CURLOPT_RETURNTRANSFER => true,  // return web page 
      CURLOPT_HEADER   => false, // don't return headers 
      CURLOPT_FOLLOWLOCATION => true,  // follow redirects 
      CURLOPT_ENCODING  => "",  // handle all encodings 
      CURLOPT_AUTOREFERER => true,  // set referer on redirect 
      CURLOPT_CONNECTTIMEOUT => 120,  // timeout on connect 
      CURLOPT_TIMEOUT  => 120,  // timeout on response 
      CURLOPT_MAXREDIRS  => 10,  // stop after 10 redirects 
     ); 

     $ch  = curl_init($url); 
     curl_setopt_array($ch, $options); 
     $content = curl_exec($ch); 
     $err  = curl_errno($ch); 
     $errmsg = curl_error($ch); 
     $header = curl_getinfo($ch); 
     curl_close($ch); 

     $header['errno'] = $err; 
     $header['errmsg'] = $errmsg; 
     $header['content'] = $content; 
     return $header; 
    } 

Esempio

//Read a web page and check for errors: 

$result = get_web_page($url); 

if ($result['errno'] != 0) 
    ... error: bad url, timeout, redirect loop ... 

if ($result['http_code'] != 200) 
    ... error: no page, no permissions, no service ... 

$page = $result['content']; 
+0

No, vengo reindirizzato alla pagina principale di ricerca di Google (non i risultati di ricerca che sono nel mio url). Come quello che avevo – 7usam

+0

@ 7usam Ho risolto la mia risposta per utilizzare solo in GET! prova ora! –

+0

cURL utilizza GET per impostazione predefinita, a meno che non si specifichi 'CURLOPT_POST' o' CURLOPT_POSTFIELDS'. Ho provato il tuo codice comunque, nessun cambiamento. – 7usam

4

Try This:

$url = "http://www.google.com/search?q=".$strSearch."&hl=en&start=0&sa=N"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_VERBOSE, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); 
    curl_setopt($ch, CURLOPT_URL, urlencode($url)); 
    $response = curl_exec($ch); 
    curl_close($ch); 
+0

L'URL della mia richiesta è un po 'più complicato del tuo. Il codice funziona per una semplice query come quella che hai fornito, ma non per il mio. Vedi il link nella domanda. – 7usam

+0

@ 7usam hai problemi con il link come lo fai? cosa cerchi di trovare? –

+0

@ 7usam posso risolvere il mio risposta da utilizzare urlencode ($ url) –

8

Per un approccio realistico che emula il comportamento più umano, si può vuoi pubblicare d un referente nelle opzioni di arricciatura. Si potrebbe anche voler aggiungere un follow_location alle opzioni di arricciatura. Fidati di me, chiunque abbia affermato che l'armonizzazione dei risultati di Google è impossibile, è un completo fallimento e dovrebbe buttare il suo computer contro il muro nella speranza di non tornare più su Internetz. Tutto ciò che puoi fare "IRL" con il tuo browser può essere emulato usando PHP cURL o libCURL in Python. Hai solo bisogno di fare più cURLS per ottenere buff. Allora vedrai cosa intendo. :)

$url = "http://www.google.com/search?q=".$strSearch."&hl=en&start=0&sa=N"; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_HEADER, 0); 
    curl_setopt($ch, CURLOPT_VERBOSE, 0); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible;)"); 
    curl_setopt($ch, CURLOPT_URL, urlencode($url)); 
    $response = curl_exec($ch); 
    curl_close($ch); 
+2

Non ho provato il codice reale, ma ottimo post lol. – Manachi

+1

Con 'urlencode()' attorno all'intero '$ url', si finisce con l'escape di": // "ecc., A cui cURL non piace. Per farlo funzionare, basta "urlencode ($ strSearch)" in "$ url" e rimuovi "urlencode()" dalla riga "CURLOPT_URL". –

1

Suppongo che Avete notato che il tuo link è in realtà un collegamento HTTPS .... Sembra che i parametri CURL non includono alcun tipo di manipolazione SSH ... forse questo potrebbe essere il vostro problema . Perché non provi con un link non HTTPS per vedere cosa succede (cioè il motore di ricerca personalizzato di Google) ...?

+0

Benvenuti in StackOverflow. Devi imparare [come scrivere una buona risposta] (http://stackoverflow.com/help/how-to-answer). Devi prima visitare [Centro assistenza] (http://stackoverflow.com/help). Anche se non c'è niente di sbagliato, ma stai rispondendo a una domanda che è stata fatta quasi 2 anni fa. – afzalex

1

contenuti Ottenere con Curl php

richiesta di supporto del server funzione Curl, attivare in httpd.conf nella cartella Apache


function UrlOpener($url) 
    global $output; 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $output = curl_exec($ch); 
    curl_close($ch);  
    echo $output; 

Se ottenere contenuti con l'uso della cache google Curl è possibile utilizzare questo URL: http://webcache.googleusercontent.com/search?q=cache:Put tua url Esempio: http://urlopener.mixaz.net/

Problemi correlati