
介绍
上周,我写了一篇有关抓取网页以收集元数据的介绍 ,并提到不可能抓取《纽约时报》的网站。 时报付费专区会阻止您尝试收集基本元数据。 但是,使用“纽约时报” API可以解决此问题。
最近,我开始在Yii平台之上构建一个社区站点,该站点将在以后的教程中发布。 我想使添加与网站内容相关的链接变得容易。 人们将URL粘贴到表单中很容易,但是同时提供标题和源信息也变得很耗时。
因此,在今天的教程中,我将扩展我最近编写的抓取代码,以在添加Times链接时利用New York Times API收集标题。
记住,我参与下面的评论主题,所以请告诉我您的想法! 您也可以通过Twitter @lookahead_io与我联系 。
入门
注册API密钥

首先,让我们注册以请求API密钥 :

提交表单后,您将通过电子邮件收到密钥:

探索《纽约时报》 API

时报提供以下类别的API:
- 封存
- 文章搜索
- 图书
- 社区
- 地域
- 最受欢迎
- 电影评论
- 语义的
- 时报通讯社
- TimesTags
- 热门故事
好多 而且,您可以从Gallery页面中单击任何主题以查看各个API类别文档:

时报使用LucyBot 为其API文档提供支持 ,并且有一个有用的常见问题解答 :

他们甚至向您展示如何快速获得API使用限制(您需要插入密钥):
curl --head
https://api.nytimes.com/svc/books/v3/lists/overview.json?api-key=<your-api-key>
2>/dev/null | grep -i "X-RateLimit"
X-RateLimit-Limit-day: 1000
X-RateLimit-Limit-second: 5
X-RateLimit-Remaining-day: 180
X-RateLimit-Remaining-second: 5
最初,我很难理解文档-它是基于参数的规范,而不是编程指南。 但是,我在纽约时报API GitHub页面上发布了一些问题,这些问题很快得到了帮助。
使用文章搜索
对于今天的一集,我将重点介绍使用《纽约时报》的文章搜索。 基本上,我们将从上一教程扩展“ 创建链接”表单:

当用户单击Lookup时 ,我们将通过ajax请求发送到Link::grab($url)
。 这是jQuery:
$(document).on("click", '[id=lookup]', function(event) {
$.ajax({
url: $('#url_prefix').val()+'/link/grab',
data: {url: $('#url').val()},
success: function(data) {
$('#title').val(data);
return true;
}
});
});
这是控制器和模型方法:
// Controller call via AJAX Lookup request
public static function actionGrab($url) {
Yii::$app->response->format = Response::FORMAT_JSON;
return Link::grab($url);
}
...
// Link::grab() method
public static function grab($url) {
//clean up url for hostname
$source_url = parse_url($url);
$source_url = $source_url['host'];
$source_url=str_ireplace('www.','',$source_url);
$source_url = trim($source_url,' \\');
// use the NYT API when hostname == nytimes.com
if ($source_url=='nytimes.com') {
...
接下来,让我们使用我们的API密钥提出文章搜索请求:
$nytKey=Yii::$app->params['nytapi'];
$curl_dest = 'http://api.nytimes.com
/svc/search/v2/articlesearch.json?fl=headline&fq=web_url:%22'.
$url.'%22&api-key='.$nytKey;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL,$curl_dest);
$result = json_decode(curl_exec($curl));
$title = $result->response->docs[0]->headline->main;
} else {
// not NYT, use the standard metatag scraper from last episode
...
}
}
return $title;
}
它的工作原理很容易-这就是标题(顺便说一下, 气候变化正在杀死北极熊,我们应该注意 ):

如果您想从API请求中获取更多详细信息,只需将其他参数添加到?fl=headline
请求中,例如keywords
和lead_paragraph
:
Yii::$app->response->format = Response::FORMAT_JSON;
$nytKey=Yii::$app->params['nytapi'];
$curl_dest = 'http://api.nytimes.com/svc/search/v2/articlesearch.json?'.
'fl=headline,keywords,lead_paragraph&fq=web_url:%22'.$url.'%22&api-key='.$nytKey;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL,$curl_dest);
$result = json_decode(curl_exec($curl));
var_dump($result);
结果如下:

也许我会写一个PHP库来更好地在接下来的情节中解析NYT API,但是此代码将关键字和引言部分进行了细分:
Yii::$app->response->format = Response::FORMAT_JSON;
$nytKey=Yii::$app->params['nytapi'];
$curl_dest = 'http://api.nytimes.com/svc/search/v2/articlesearch.json?'.
'fl=headline,keywords,lead_paragraph&fq=web_url:%22'.$url.'%22&api-key='.$nytKey;
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_URL,$curl_dest);
$result = json_decode(curl_exec($curl));
echo $result->response->docs[0]->headline->main.'<br />'.'<br />';
echo $result->response->docs[0]->lead_paragraph.'<br />'.'<br />';
foreach ($result->response->docs[0]->keywords as $k) {
echo $k->value.'<br/>';
}
这是本文显示的内容:
Polar Bears’ Path to Decline Runs Through Alaskan Village
The bears that come here are climate refugees, on land because
the sea ice they rely on for hunting seals is receding.
Polar Bears
Greenhouse Gas Emissions
Alaska
Global Warming
Endangered and Extinct Species
International Union for Conservation of Nature
National Snow and Ice Data Center
Polar Bears International
United States Geological Survey
希望这开始扩大您对如何使用这些API的想象力。 令人振奋的是现在可能发生的事情。
收盘时
纽约时报API非常有用,我很高兴看到他们将其提供给开发者社区。 通过GitHub获得如此快速的API支持也令人耳目一新-我只是没想到。 请记住, 它适用于非商业项目 。 如果您有赚钱的主意,请给他们发送便条,看他们是否会与您合作。 出版商渴望获得新的收入来源。
我希望您发现这些Web抓取集对您有所帮助,并将其用于您的项目中。 如果您想观看今天的节目,可以在我的网站Active Together中尝试一些网络抓取。
请在评论中分享任何想法和反馈。 您也可以随时直接通过Twitter @lookahead_io与我联系 。 并确保查看我的讲师页面和其他系列文章,即使用PHP构建您的启动和使用Yii2进行编程 。
相关链接
- 纽约时报API库
- GitHub上的《纽约时报》公共API规范
- 如何抓取元数据的网页(Envato Tuts +)
- 如何使用Node.js和jQuery抓取网页(Envato Tuts +)
- 使用Ruby构建您的第一个Web抓取工具(Envato Tuts +)
翻译自: https://code.tutsplus.com/tutorials/using-the-new-york-times-api-to-scrape-metadata--cms-27894