Как использовать PHP, чтобы получить веб-страницу в переменную - PullRequest
1 голос
/ 28 марта 2009

Я хочу скачать страницу из Интернета, это разрешено делать, когда вы используете простой браузер, такой как Firefox, но когда я использую «file_get_contents», сервер отказывается и отвечает, что он понимает команду, но не разрешает загрузки.

Так что же делать? Я думаю, что видел в некоторых скриптах (на Perl) способ сделать ваш скрипт похожим на настоящий браузер, создав пользовательский агент и куки, которые заставляют серверы думать, что ваш скрипт - это настоящий веб-браузер.

Кто-нибудь имеет представление об этом, как это можно сделать?

Ответы [ 4 ]

18 голосов
/ 28 марта 2009

Использовать 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);     
?>

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

1 голос
/ 28 марта 2009

Да, CUrl довольно хорош в получении содержимого страницы. Я использую его с такими классами, как DOMDocument и DOMXPath для измельчения содержимого в удобную форму.

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;


                }

Последний является частью класса, который очищает данные от tasty.com . Хотя не очень легально.

0 голосов
/ 28 марта 2009

Еще один способ сделать это (хотя другие указали на лучший способ), это использовать функцию PHP fopen (), например:

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

Это особенно полезно, если cURL недоступен.

0 голосов
/ 28 марта 2009

Этот ответ учитывает ваш комментарий к ответу Рича.

Сайт, вероятно, проверяет, являетесь ли вы реальным пользователем, используя HTTP referer или строку User Agent. попробуйте установить их для вашего локона:

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