Cómo usar PHP para obtener una página web en una variable

Quiero descargar una página de la web, está permitido hacerlo cuando estás usando un navegador simple como Firefox, pero cuando uso “file_get_contents” el servidor se niega y responde que entiende el comando pero no permite tales descargas.

¿Entonces lo que hay que hacer? Creo que vi en algunas secuencias de comandos (en Perl) una forma de hacer que tu script sea como un navegador real al crear un agente de usuario y cookies, lo que hace que los servidores piensen que tu script es un verdadero navegador web.

¿Alguien tiene una idea sobre esto, cómo se puede hacer?

Sí, CUrl es bastante bueno para obtener contenido de la página. Lo uso con clases como DOMDocument y DOMXPath para moler el contenido a una forma utilizable.

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

Este último es parte de una clase que raspa datos de delicious.com. No es muy legal.

Esta respuesta lleva su comentario a la respuesta de Rich en mente.

Probablemente el sitio verifique si usted es o no un usuario real utilizando el referer HTTP o la cadena del agente de usuario. intente configurar estos para su rizo:

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

Otra forma de hacerlo (aunque otros han señalado una mejor manera), es usar la función fopen () de PHP, así:

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

Es especialmente útil si CURL no está disponible.