Función PHP para obtener código fuente de una web

Snippet PHP para obtener el código fuente de cualquier web con solo indicar la url.

Tag PHP

El siguiente snippet php te servirá para obtener en formato texto el código fuente de cualquier URL que se le pase. 

Este código es perfecto para crear, por ejemplo, crawlers php para rastrear patrones en un contenido web y posteriormente procesarlos. Por ejemplo, podrías guardar cierto contenido como imagenes, enlaces o textos.

El siguiente snippet se compone de una función PHP preparada para que la copies y uses de inmediato.

function display_sourcecode($url)
{
	$lineas = file($url);
	$output = "";
	foreach ($lineas as $line_num => $linea) { 
		//recorremos todas las líneas HTML devueltas por la página
		$output.= "Line #{$line_num} : " . htmlspecialchars($linea) . "
\n"; } return $output; }

¿Cómo leemos el código fuente de una página en php?

Puede que te estés haciendo esta pregunta si has leído o probado anterior la anterior función php. Si es así, sigue leyendo, a continuación te explico que es exactamente lo que hace esta función para obtener códigos fuente y te propongo mejoras.

Lo primero es ver que hace esta función exactamente paso a paso:

  1. Mediante la función file se recupera un Array con cada una de las líneas del fichero. ¿De dónde se obtiene el fichero? De la URL indicada como ruta.
  2. Se recorren una a una todas las filas del contenido del fichero y se incorporan en una variable de tipo texto. Cada línea se enumera adecuadamente en negrita y los caracteres HTML son parseados con la función php funcion htmlspecialchars() de forma que se interpreten como texto. 

Cómo ves, el funcionamiento es simple, y esta función, tal como está, no realiza ninguna tarea en especial más allá de montar el contenido de la página indicada como url.

 A continuación te propongo un par de mejoras a esta función, entre ellas recuperar todas las urls de la página o descargar todas las imagenes de una url.

Recuperar todas las urls de una página web

En la siguiente versión deste snippet busco y recupero todas las URLS que se encuentran en la url web indicada. Esta mejora podría ser el principio de un crawler php o un posible bot automatizado.

La función procesará todas las urls encontradas en la página y devolverá un Array con todas ellas.

function display_sourcecode($url)
{
	$lineas = file($url);
	$urls= [];
	foreach ($lineas as $line_num => $linea) { 
		//recorremos todas las líneas HTML devueltas por la página
		preg_match_all('#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $linea, $match);
		//sumamos los resultados (urls) encontradas a nuestro array de urls
		$urls = $urls + $match;
	}
       return $urls;
}

Esta función, a pesar de seguir obteniendo el código fuente de una página, difiere de la primera en que utilizo la función php preg_match_all() para obtener, mediante un patrón de expresiones regulares, todas las urls que se encuentran en una línea. Además, todas estas urls las acumulo en un array, que al finalizar, contendrá todas las URLS completas (con dominio, etc) que se encuentren en el código html de la url deseada.

Recuerda que este array tan solo recupera urls completas, así que si en la página destino no  se hubieran incluído urls en el código fuente estas no se recuperarían. Para esto habría que cambiar la expresión regular.

Recuperar solo enlaces que aparecen en href

Otra forma alternativa de recoger los enlaces de una página pero solo aquellos que aparecen en una etiqueta HTML de enlace ( A ) sería con un objeto PHP de tipo DOMDocument. También habría que sustituir el recorrido línea a línea de la función file() por otra que recupere todo el código fuente como texto. 

A continuación te dejo una propuesta:

function display_sourcecode($url)
{
	$html= file_get_contents($url);
	$dom = new DOMDocument;

	//Parse the HTML. The @ is used to suppress any parsing errors
	//that will be thrown if the $html string isn't valid XHTML.
	@$dom->loadHTML($html);

	//Get all links. You could also use any other tag name here,
	//like 'img' or 'table', to extract other tags.
	$links = $dom->getElementsByTagName('a');
	$urls = [];
	//Iterate over the extracted links and display their URLs
	foreach ($links as $link){
    		//Extract and show the "href" attribute.
    		$urls[] = $link->getAttribute('href');
	}
	return $urls;
}

Sobre el autor

Javier Gómez Redactor en Srcodigofuente.es

Javier Gómez

Ingeniero técnico en informática de gestión. Desarrollador web freelance y profesor de desarrollo web a partes iguales. Testarudo autodidacta, creativo, perfeccionista y alma libre.

Cargando comentarios

Utilizamos "cookies" para información estadística. Si continúas navegando aceptas su uso.