Frage

Ich möchte eine Seite aus dem Web herunterladen, es darf es tun, wenn Sie einen einfachen Browser wie Firefox verwenden, aber wenn ich "file_get_contents" verwende, lehnt der Server ab und antwortet, dass er den Befehl versteht, aber solche Downloads nicht zulassen.

Also was tun? Ich glaube, ich habe in einigen Skripten (auf Perl) eine Möglichkeit gesehen, Ihr Skript wie einen echten Browser zu machen, indem ich einen Benutzeragenten und Cookies erstellt, sodass die Server denken, dass Ihr Skript ein echter Webbrowser ist.

Hat jemand eine Vorstellung davon, wie kann es getan werden?

War es hilfreich?

Lösung

Verwenden Sie 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);     
?>

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

Andere Tipps

Ja, Curl ist ziemlich gut darin, Seiteninhalte zu erhalten. Ich benutze es mit Klassen wie Domdokument und DomxPath Um den Inhalt in eine verwendbare Form zu mahlen.

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;


                }

Letzteres ist Teil einer Klasse, die Daten von Daten abkratzt lecker.com .Not jedoch nicht sehr legal.

Diese Antwort nimmt Ihren Kommentar auf Richs Antwort vor.

Die Website prüft wahrscheinlich, ob Sie ein echter Benutzer sind oder nicht, der den HTTP -Referer oder die Benutzeragentenzeichenfolge verwendet. Versuchen Sie, diese für Ihre Locken zu setzen:

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

Eine andere Möglichkeit, dies zu tun (obwohl andere auf einen besseren Weg hingewiesen haben), besteht darin, die Fopen () -Funktion von PHP wie SO zu verwenden:

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

Es ist besonders nützlich, wenn Curl nicht verfügbar ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top