Question

Je souhaite télécharger une page sur le Web, il est autorisé à faire lorsque vous utilisez un navigateur simple comme Firefox, mais lorsque j'utilise "File_get_Contents", le serveur refuse et répond qu'il comprend la commande mais n'autorise pas de tels téléchargements.

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

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

Était-ce utile?

La solution

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)

Autres conseils

Oui, Curl est assez bon pour obtenir du contenu de page. Je l'utilise avec des cours comme Domdocument et Domxpath pour moudre le contenu sous une forme 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 fait partie d'une classe qui gratte les données de Delicious.com . Pas très légal cependant.

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

Le site vérifie probablement si vous êtes un véritable utilisateur à l'aide du référence HTTP ou de la chaîne d'agent utilisateur. Essayez de les définir 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');

Une autre façon de le faire (bien que d'autres aient souligné une meilleure façon), consiste à utiliser la fonction FOPEN () de PHP, comme ainsi:

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

C'est particulièrement utile si Curl n'est pas disponible.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top