() translation by (you can also view the original English article)



Introduction
La semaine dernière, j'ai écrit une introduction aux pages web de grattage pour recueillir des métadonnées, mentionnant qu'il n'est pas possible de rayer le site de New York Times. The Times paywall bloque vos tentatives de collecte des métadonnées de base. Mais il y a un moyen de le faire en utilisant l'API du New York Times.
Récemment, j'ai commencé à construire un site communautaire sur la plate-forme Yii, dont j'ai écrit sur la Programmation avec Yii2: Construire une communauté avec commentaires, partage et vote (Envato Tuts+). Je voulais faciliter l'ajout de liens liés au contenu sur le site. Bien qu'il soit facile pour les personnes de coller des URL dans des formulaires, il devient beaucoup plus important de fournir des informations sur les titres et les sources.
Donc, dans le tutoriel d'aujourd'hui, je vais étendre le code de raclage que j'ai écrit récemment pour tirer parti de l'API du New York Times pour recueillir les manchettes lorsque les liens Times sont ajoutés.
Rappelez-vous, je participe aux fils de commentaires ci-dessous, alors dites-moi ce que vous en pensez! Vous pouvez également me rejoindre sur Twitter @lookahead_io.
Commençons
Inscrivez-vous pour une clé d'API



D'abord, inscrivez-vous pour demander une clé API:



Après avoir soumis le formulaire, vous recevrez votre clé dans un courriel:



Exploration de l'API de New York Times



The Times propose des API dans les catégories suivantes:
- Archive
- Recherche d'article
- Livres
- Communauté
- Géographique
- Le plus populaire
- Critiques de films
- Sémantique
- Times Newswire
- TimesTags
- Meilleurs histoires
C'est beaucoup. Et, à partir de la page Galerie, vous pouvez cliquer sur n'importe quel sujet pour voir la documentation de la catégorie API individuelle:



The Times utilise LucyBot pour alimenter ses documents API, et il existe une FAQ utile:



Ils vous montrent même comment obtenir rapidement vos limites d'utilisation de l'API (vous devrez brancher votre clé):
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 |
J'ai initialement eu du mal à comprendre la documentation: c'est une spécification paramétrique, pas un guide de programmation. Cependant, j'ai posté quelques questions en tant que problèmes à la page GitHub de l'API New York Times, et ils ont répondu rapidement et efficacement.
Travailler avec la recherche d'article
Pour l'épisode d'aujourd'hui, je me concentrerai sur l'utilisation de la New York Times Search. Fondamentalement, nous allons étendre le formulaire Create Link à partir du dernier tutoriel:



Lorsque l'utilisateur clique sur Lookup, nous ferons une requête ajax via Link::grab($url)
. Voici le 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 |
});
|
Voici la méthode du contrôleur et du modèle:
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 |
...
|
Ensuite, utilisons notre clé API pour faire une demande de recherche d'article:
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 |
}
|
Et cela fonctionne assez facilement—voici le titre qui en résulte (en passant, le changement climatique tue les ours polaires et nous devrions nous occuper):



Si vous souhaitez plus de détails à partir de votre demande d'API, ajoutez simplement des arguments supplémentaires à la requête ?fl=headline
, comme les keywords
et le paragraphe 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); |
Voici le résultat:



Peut-être que je vais écrire une bibliothèque PHP pour mieux analyser l'API NYT dans les épisodes à venir, mais ce code éclate les mots-clés et le paragraphe principal:
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 |
}
|
Voici ce qu'il montre pour cet article:
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 |
Espérons que cela commence à élargir votre imagination sur la façon d'utiliser ces API. C'est plutôt excitant ce qui peut être possible.
En clôture
L'API du New York Times est très utile et je suis heureux de les voir en offrant à la communauté des développeurs. Il était également rafraîchissant d'obtenir un tel support API rapide via GitHub—je ne m'attendais pas à cela. Gardez à l'esprit qu'il est destiné à des projets non commerciaux. Si vous avez une idée d'argent, envoyez-leur une note pour voir s'ils vont travailler avec vous. Les éditeurs souhaitent de nouvelles sources de revenus.
J'espère que vous avez trouvé ces épisodes de raclage Web utiles et que vous les utiliserez dans vos projets. Si vous souhaitez voir l'épisode actuel en action, vous pouvez essayer une partie du grattage web sur mon site, Active Together.
Veuillez faire part de vos réflexions et commentaires dans les commentaires. Vous pouvez également me contacter directement sur Twitter @lookahead_io directement. Et assurez-vous de vérifier ma page d'instructeur et d'autres séries, Créer votre démarrage avec PHP et Programmer avec Yii2.