2009-03-28 4 views
1

Je veux télécharger une page sur le Web, c'est autorisé lorsque vous utilisez un simple navigateur comme Firefox, mais quand j'utilise "file_get_contents" le serveur refuse et répond qu'il comprend la commande mais ne permet pas de tels téléchargements.Comment utiliser PHP pour obtenir une page Web dans une variable

Alors que faire? Je pense avoir vu dans certains scripts (sur Perl) un moyen de faire de votre script un vrai navigateur en créant un agent utilisateur et des cookies, ce qui fait penser aux serveurs que votre script est un vrai navigateur web.

Est-ce que quelqu'un a une idée à ce sujet, comment cela peut-il être fait?

Répondre

18

Utilisez CURL.

<?php 
     // create curl resource 
     $ch = curl_init(); 

     // set url 
     curl_setopt($ch, CURLOPT_URL, "example.com"); 

     //return the transfer as a string 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 


     // set the UA 
     curl_setopt($ch, CURLOPT_USERAGENT, 'My App (http://www.example.com/)'); 

     // Alternatively, lie, and pretend to be a browser 
     // curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'); 

     // $output contains the output string 
     $output = curl_exec($ch); 

     // close curl resource to free up system resources 
     curl_close($ch);  
?> 

(De http://uk.php.net/manual/en/curl.examples-basic.php)

+0

Bon! Encore ne fonctionne pas si j'ai besoin du script pour dire au serveur que j'utilise un navigateur –

+0

Oh, désolé - il suffit d'ajouter un curl_setopt pour l'UA - je l'ai ajouté dans ma réponse. –

0

Cette réponse prend votre commentaire à la réponse de Rich à l'esprit.

Le site vérifie probablement si vous êtes un utilisateur réel utilisant le référant HTTP ou la chaîne User Agent. Essayez de régler ceux-ci pour votre boucle:

//pretend you came from their site already 
curl_setopt($ch, CURLOPT_REFERER, 'http://domainofthesite.com'); 
//pretend you are firefox 3.06 running on windows Vista 
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.6'); 
0

Une autre façon de le faire (bien que d'autres ont signalé une meilleure façon), est d'utiliser la fonction fopen() de PHP, comme ceci:

$handle = fopen("http://www.example.com/", "r");//open specified URL for reading 

Il est particulièrement utile si cURL n'est pas disponible.

1

Oui, CUrl est assez bon pour obtenir le contenu de la page. Je l'utilise avec des classes comme DOMDocument et DOMXPath pour moudre le contenu à un formulaire utilisable.

function __construct($useragent,$url) 
    { 
     $this->useragent='Firefox (WindowsXP) - Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.'.$useragent; 
     $this->url=$url; 


     $ch = curl_init(); 
     curl_setopt($ch, CURLOPT_USERAGENT, $useragent); 
     curl_setopt($ch, CURLOPT_URL,$url); 
     curl_setopt($ch, CURLOPT_FAILONERROR, true); 
     curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($ch, CURLOPT_AUTOREFERER, true); 
     curl_setopt($ch, CURLOPT_RETURNTRANSFER,true); 
     curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
     $html= curl_exec($ch); 
     $dom = new DOMDocument(); 
     @$dom->loadHTML($html); 
     $this->xpath = new DOMXPath($dom); 
    } 
... 
public function displayResults($site) 
$data=$this->path[0]->length; 
    for($i=0;$i<$data;$i++) 
    { 
    $delData=$this->path[0]->item($i); 

    //setting the href and title properties 
$urlSite=$delData->getElementsByTagName('a')->item(0)->getAttribute('href'); 
       $titleSite=$delData->getElementsByTagName('a')->item(0)->nodeValue; 

    //setting the saves and additoinal 
        $saves=$delData->getElementsByTagName('span')->item(0)->nodeValue; 
    if ($saves==NULL) 
    { 
     $saves=0; 
    } 

    //build the array 
    $this->newSiteBookmark[$i]['source']='delicious.com'; 
    $this->newSiteBookmark[$i]['url']=$urlSite; 
    $this->newSiteBookmark[$i]['title']=$titleSite; 
    $this->newSiteBookmark[$i]['saves']=$saves; 


       } 

Ce dernier est une partie d'une classe qui racler les données de delicious.com .Non très bien juridique.

+0

C'est parfaitement légal, les données sont déjà disponibles, juste un moyen inefficace de le faire (HTML n'est pas le meilleur format pour les données). Été souhaitant délicieux fourni plus de données (à savoir les résultats de recherche) en XML récemment. – Ross

+0

Eh bien, je souhaite délicieux fourni une méthode à leur API qui peut réellement accéder à des signets qui ne viennent pas de votre propre profil comme la méthode "bookmark_find" ma.gnolia.org. Cela aurait sauvé quelques nuits de sommeil en faisant ma thèse: =) – chosta

Questions connexes