Cómo Procesar Páginas Web para Obtener Metadatos
Spanish (Español) translation by James Kolce (you can also view the original English article)



Introducción
Recientemente comencé a construir un sitio web comunitario encima de la plataforma Yii sobre el cual escribí en Programming With Yii2: Building Community with Comments, Sharing and Voting (Envato Tuts+). Quería que fuera simple agregar enlaces relacionados al contenido del sitio. Aunque es fácil para las personas el pegar URLs en formularios, se vuelve una pérdida de tiempo proveer también el título y fuente de la información.
En el tutorial de hoy, voy a mostrarte cómo hacer uso de PHP para procesar metadatos comunes de una página web y hacer más fácil para tus usuario participar y así construir servicios más interesantes.
Recuerda que participo en el hilo de comentarios abajo, ¡así que dime lo que piensas! También puedes encontrarme en Twitter @lookahead_io.
Comenzando
Primero, construí un formulario para que las personas agreguen enlaces pegando la URL. También creé un botón Lookup que usa AJAX para solicitar el procesamiento de la página web para información de metadatos.



Al presionar Lookup se llama a la función Link::grab() via ajax:
1 |
$(document).on("click", '[id=lookup]', function(event) { |
2 |
$.ajax({ |
3 |
url: $('#url_prefix').val()+'/link/grab', |
4 |
data: {url: $('#url').val()}, |
5 |
success: function(data) { |
6 |
$('#title').val(data); |
7 |
return true; |
8 |
}
|
9 |
});
|
10 |
});
|
Procesando la Página
El código Link::grab() llama a fetch_og(). Esto imita a un rastreador para capturar la página y obtener los metadatos con DOMXPath:
1 |
public static function fetch_og($url) |
2 |
{
|
3 |
$options = array('http' => array('user_agent' => 'facebookexternalhit/1.1')); |
4 |
$context = stream_context_create($options); |
5 |
$data = file_get_contents($url,false,$context); |
6 |
$dom = new \DomDocument; |
7 |
@$dom->loadHTML($data); |
8 |
$xpath = new \DOMXPath($dom); |
9 |
# query metatags with og prefix
|
10 |
$metas = $xpath->query('//*/meta[starts-with(@property, \'og:\')]'); |
11 |
$og = array(); |
12 |
foreach($metas as $meta){ |
13 |
# get property name without og: prefix
|
14 |
$property = str_replace('og:', '', $meta->getAttribute('property')); |
15 |
$content = $meta->getAttribute('content'); |
16 |
$og[$property] = $content; |
17 |
}
|
18 |
return $og; |
19 |
}
|
Para mi escenario, he reemplazado las etiquetas og: arriba, pero el código abajo busca varios tipos de etiquetas.
1 |
$tags = Link::fetch_og($url); |
2 |
if (isset($tags['title'])) { |
3 |
$title = $tags['title']; |
4 |
} else if (isset($tags['metaProperties']['og:title']['value'])) { |
5 |
$title=$tags['metaProperties']['og:title']['value']; |
6 |
} else { |
7 |
$title = 'n/a'; |
8 |
}
|
9 |
return $title; |
10 |
}
|
También puedes tomar otras etiquetas como palabras clave, descripción, etc. Entonces jQuery agrega el resultado al formulario para que el usuario lo envíe.



Yendo Más Allá
También tengo una tabla de fuentes las cuales voy a desarrollar más después. Pero básicamente, cada vez que una nueva URL es agregada, la analizamos para obtener el dominio base del sitio web y lo ponemos en una tabla Source:
1 |
$model->source_id = Source::add($model->url); |
2 |
... |
3 |
public static function add($url='',$name='') {
|
4 |
$source_url = parse_url($url); |
5 |
$url = $source_url['host']; |
6 |
$url = trim($url,' \\'); |
7 |
$s = Source::find() |
8 |
->where(['url'=>$url]) |
9 |
->one(); |
10 |
if (is_null($s)) {
|
11 |
$s=new Source; |
12 |
$s->url = $url; |
13 |
$s->name = $name; |
14 |
$s->status = Source::STATUS_ACTIVE; |
15 |
$s->save(); |
16 |
} else {
|
17 |
if ($s->name=='') {
|
18 |
$s->name = $name; |
19 |
$s->update(); |
20 |
} |
21 |
} |
22 |
return $s->id; |
23 |
} |
Por ahora, estoy actualizando manualmente los nombres de las fuentes así se verán más limpios para el usuario, por ejemplo: ABC News, BoingBoing, y Vice:



Ojalá, en un siguiente episodio, revisaré cómo usar APIs disponibles gratuitamente para obtener el nombre de un sitio web. Es extraño para mi que no haya una metaetiqueta común para esto; si tan solo el Internet fuera perfecto.
Sitios de Subscripción
Algunos sitios como The New York Times no te dejan procesar los metadatos debido a sus sistemas de subscripción. Pero sí tienen una API. No es fácil para aprender porque tienen una confusa documentación, pero sus desarrolladores son rápidos para ayudar en Github. También espero escribir sobre el uso de la búsqueda de metadatos para los títulos de The New York Times en un episodio futuro.
Para Concluir
Espero que encuentres esta guia de procesamiento útil y hagas uso de ella en algún lugar de tus proyectos. Si te gustaría verla en acción, puedes probar algo de procesamiento web en mi sitio, Active Together.
Por favor comparte cualquier idea u opinión en los comentarios. Puedes también encontrarme en Twitter @lookahead_io directamente. Y asegurate de revisar mi página de instructor y mis otras series, Building Your Startup With PHP y Programming With Yii2.



