Utilizando el API de New York Times para extraer metadatos
Spanish (Español) translation by Elías Nicolás (you can also view the original English article)



Introducción
La
semana pasada, escribí una introducción recopilar páginas web para extraer metadatos, mencionando que no es posible en el sitio de
New York Times. El bloqueo pagado de Times bloquea tus intentos de recopilar metadatos básicos. Pero hay una manera alrededor de esto usando el New York Times API.
Recientemente comencé a construir un sitio de la comunidad encima de la plataforma de Yii, que escribí en programación con Yii2: Construyendo la comunidad con los comentarios, la distribución y la votación (Envato Tuts +). Quería facilitar la adición de enlaces relacionados con el contenido del sitio. Si bien es fácil para las personas pegar direcciones URL en formularios, toma mucho tiempo proporcionar también título e información de origen.
Así que en el tutorial de hoy, voy a expandir el código de recopilar metadatos que escribí recientemente para aprovechar la API de New York Times para cuando titulares se agregan.
Recuerde, yo participo en los hilos de comentarios a continuación, así que dime lo que piensas! También puedes contactarme en Twitter @lookahead_io.
Para empezar
Inscríbase para una clave API



En primer lugar, vamos a inscribirnos y solicitar una clave API:



Después de enviar el formulario, recibirá su clave en un correo electrónico:



Explorando la API de New York Times



El Times ofrece APIs en las siguientes categorías:
- Archivo
- Búsqueda de artículo
- Libros
- Comunidad
- Geográfica
- Más populares
- Comentarios de la película
- Semántica
- Times Newswire
- TimesTags
- Historias principales
Es mucho. Y, desde la página de la galería, puedes hacer clic en cualquier tema para ver la documentación individual de categoría API:



El Times usa LucyBot para su documentacion de la API, y hay un FAQ de ayuda:



Incluso te muestran cómo obtener rápidamente los usos de la API (usted necesitará su clave):
1 |
curl --head |
2 |
https://api.nytimes.com/svc/books/v3/lists/overview.json?api-key=<your-api-key> |
3 |
2>/dev/null | grep -i "X-RateLimit" |
4 |
X-RateLimit-Limit-day: 1000 |
5 |
X-RateLimit-Limit-second: 5 |
6 |
X-RateLimit-Remaining-day: 180 |
7 |
X-RateLimit-Remaining-second: 5 |
Inicialmente tuve problemas para dar sentido a la documentación: es una especificación basada en parámetros, no una guía de programación. Sin embargo, publiqué algunas preguntas y problemas a la página GitHub de la API de New York Times, y fueron respondidas rápida y útilmente.
Trabajando con búsqueda
Para el episodio de hoy, voy a centrar en la búsqueda de artículo de NY Times. Básicamente, a ampliar la forma de crear el enlace del tutorial pasado:



Cuando el usuario hace clic en búsqueda, vamos a hacer una petición ajax a través de Link::grab($url). Aquí es el jQuery:
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 |
});
|
Este es el método de controlador y modelo:
1 |
// Controller call via AJAX Lookup request
|
2 |
public static function actionGrab($url) { |
3 |
Yii::$app->response->format = Response::FORMAT_JSON; |
4 |
return Link::grab($url); |
5 |
}
|
6 |
...
|
7 |
// Link::grab() method
|
8 |
public static function grab($url) { |
9 |
//clean up url for hostname
|
10 |
$source_url = parse_url($url); |
11 |
$source_url = $source_url['host']; |
12 |
$source_url=str_ireplace('www.','',$source_url); |
13 |
$source_url = trim($source_url,' \\'); |
14 |
// use the NYT API when hostname == nytimes.com
|
15 |
if ($source_url=='nytimes.com') { |
16 |
...
|
A continuación, vamos a usar nuestra clave API para realizar una solicitud de búsqueda de artículo:
1 |
$nytKey=Yii::$app->params['nytapi']; |
2 |
$curl_dest = 'http://api.nytimes.com |
3 |
/svc/search/v2/articlesearch.json?fl=headline&fq=web_url:%22'. |
4 |
$url.'%22&api-key='.$nytKey; |
5 |
$curl = curl_init(); |
6 |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); |
7 |
curl_setopt($curl, CURLOPT_URL,$curl_dest); |
8 |
$result = json_decode(curl_exec($curl)); |
9 |
$title = $result->response->docs[0]->headline->main; |
10 |
} else { |
11 |
// not NYT, use the standard metatag scraper from last episode
|
12 |
...
|
13 |
}
|
14 |
}
|
15 |
return $title; |
16 |
}
|
Y trabaja bastante fácilmente, aquí está el título resultante (por cierto, el cambio climático está matando a los osos polares y deberíamos preocuparnos):



Si usted quiere más detalles de su petición de API, sólo tiene que añadir argumentos adicionales para el ?fl=headline como keywords y lead_paragraph:
1 |
Yii::$app->response->format = Response::FORMAT_JSON; |
2 |
$nytKey=Yii::$app->params['nytapi']; |
3 |
$curl_dest = 'http://api.nytimes.com/svc/search/v2/articlesearch.json?'. |
4 |
'fl=headline,keywords,lead_paragraph&fq=web_url:%22'.$url.'%22&api-key='.$nytKey; |
5 |
$curl = curl_init(); |
6 |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); |
7 |
curl_setopt($curl, CURLOPT_URL,$curl_dest); |
8 |
$result = json_decode(curl_exec($curl)); |
9 |
var_dump($result); |
Aquí está el resultado:



Tal vez voy a escribir una librería PHP para analizar mejor el API de NYT en próximos episodios, pero este código quiebra las palabras clave y el párrafo guia:
1 |
Yii::$app->response->format = Response::FORMAT_JSON; |
2 |
$nytKey=Yii::$app->params['nytapi']; |
3 |
$curl_dest = 'http://api.nytimes.com/svc/search/v2/articlesearch.json?'. |
4 |
'fl=headline,keywords,lead_paragraph&fq=web_url:%22'.$url.'%22&api-key='.$nytKey; |
5 |
$curl = curl_init(); |
6 |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); |
7 |
curl_setopt($curl, CURLOPT_URL,$curl_dest); |
8 |
$result = json_decode(curl_exec($curl)); |
9 |
echo $result->response->docs[0]->headline->main.'<br />'.'<br />'; |
10 |
echo $result->response->docs[0]->lead_paragraph.'<br />'.'<br />'; |
11 |
foreach ($result->response->docs[0]->keywords as $k) { |
12 |
echo $k->value.'<br/>'; |
13 |
}
|
Aquí está lo que muestra para este artículo:
1 |
Polar Bears’ Path to Decline Runs Through Alaskan Village |
2 |
|
3 |
The bears that come here are climate refugees, on land because |
4 |
the sea ice they rely on for hunting seals is receding. |
5 |
|
6 |
Polar Bears |
7 |
Greenhouse Gas Emissions |
8 |
Alaska |
9 |
Global Warming |
10 |
Endangered and Extinct Species |
11 |
International Union for Conservation of Nature |
12 |
National Snow and Ice Data Center |
13 |
Polar Bears International |
14 |
United States Geological Survey |
Ojala comience a expandir su imaginación de cómo utilizar estas API. Es muy emocionante lo que puede lograr.
En conclusion:
La API del New York Times es muy útil, y me alegra verlos ofreciendo a la comunidad de desarrolladores. También fue refrescante para obtener ese apoyo rápido de API a través de GitHub, simplemente no esperaba esto. Tenga en cuenta que está pensado para proyectos no comerciales. Si tienes alguna idea de hacer dinero, envie una nota a ver si trabajaran con usted. Los editores son deseosos de nuevas fuentes de ingresos.
Espero que encuentre estos episodios de extraccion de metadatos útiles y los utilice en sus proyectos. Si desea ver el episodio de hoy en acción, puede probar algunos de la web extraccion en mi sitio, Active Together.
Por favor comparta sus pensamientos y comentarios en los comentarios. También puede contactarme siempre en Twitter @lookahead_io directamente. Y asegúrese de revisar mi página de instructor y otras series, Construyendo su startup con PHP y la programación con Yii2.



