web-dev-qa-db-fra.com

Comment obtenir le contenu de la page en utilisant cURL?

Je voudrais gratter le contenu de cette page de résultats de recherche Google en utilisant curl. J'ai essayé de définir différents agents utilisateurs et d'autres options, mais je n'arrive tout simplement pas à obtenir le contenu de cette page, car je suis souvent redirigé ou une erreur "page déplacée".

Je pense que cela a quelque chose à voir avec le fait que la chaîne de requête est encodée quelque part mais je ne sais pas vraiment comment contourner cela.

    //$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);

Que dois-je faire pour que mon code php affiche le contenu exact de la page tel que je le verrais sur mon navigateur? Qu'est-ce que je rate? Quelqu'un peut-il m'indiquer la bonne direction?

J'ai vu des questions similaires sur SO, mais aucune avec une réponse qui pourrait m'aider.

MODIFIER:

J'ai essayé d'ouvrir le lien à l'aide du Selenium WebDriver, qui donne les mêmes résultats que cURL. Je pense toujours que cela est dû au fait qu'il y a des caractères spéciaux dans la chaîne de requête qui sont perturbés quelque part dans le processus.

37
7usam

c'est ainsi:

   /**
     * 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;
    }

Exemple

//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'];
60
user2068793

Pour une approche réaliste qui imite le comportement le plus humain, vous pouvez ajouter un référent dans vos options de boucle. Vous pouvez également ajouter un follow_location à vos options curl. Croyez-moi, qui a dit que cURLING Google résultats est impossible, est un idiot complet et devrait jeter son ordinateur contre le mur dans l'espoir de ne plus jamais revenir à l'internetz. Tout ce que vous pouvez faire "IRL" avec votre propre navigateur peut être émulé avec PHP cURL ou libCURL en Python. Il vous suffit de faire plus de CURLS pour obtenir un buff. Ensuite, vous verrez ce que je signifier. :)

  $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);
11
712011m4n

Essayez ceci:

$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);
5
One Man Crew

Obtenir du contenu avec Curl php

demande serveur support fonction Curl, activer dans httpd.conf dans le dossier 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;

Si vous obtenez du contenu via Google, utilisez Curl dans le cache, vous pouvez utiliser cette URL: http://webcache.googleusercontent.com/search?q=cache:Put votre url Exemple: http: // urlopener.mixaz.net/

1
user5746128

Je suppose que vous avez remarqué que votre lien est en fait un lien HTTPS ... Il semble que les paramètres CURL n'incluent aucun type de traitement SSH ... peut-être que cela pourrait être votre problème. Pourquoi n'essayez-vous pas avec un lien non-HTTPS de voir ce qui se passe (moteur de recherche personnalisé de Google) ...?

1
George Vasiliou