instagram 爬虫
如果您有带相机的Android或Apple智能手机,则很可能也有Instagram。 这个免费的应用程序允许用户拍照,使用特殊效果和滤镜增强照片效果,然后使用Instagram网站与朋友分享照片。 可以将其视为Twitter,但带有照片而不是推文。 截止到2012年9月,它的用户已超过1亿,这显然是对的。
除了为用户提供共享照片的平台外,Instagram还具有丰富的开发人员API,该API允许开发人员访问用户生成的内容并围绕该内容创建内容驱动的Web应用程序。 该API遵循REST模型,可以通过任何支持JSON的编程语言(包括我最喜欢PHP)进行访问。
这篇分为两部分的文章将向您介绍Instagram API,向您展示如何将Instagram用户生成的内容与PHP应用程序集成和使用。 它包括检索照片和评论提要的示例; 通过关键字,用户或位置搜索照片; 检索用户资料; 和管理用户关系。 因此,快来开始吧!
在开始使用Instagram API开发应用程序之前,您需要了解它的工作原理。 像许多其他Web API一样,Instagram API也可以通过HTTP进行工作,并且期望对指定端点的HTTP请求。 收到此请求后,API服务器将使用包含请求的数据的JSON feed答复查询。 然后可以使用服务器端编程语言(例如PHP或Perl)或客户端工具包(例如jQuery或mooTools)解析此数据,并从中提取内容以集成到网页中。
要查看其工作原理,首先要做两件事:
提交此信息后,将为您的客户端分配一个唯一的客户端ID和密码( 图2 )。 请注意这些,因为您将需要它们使用OAuth 2.0访问Instagram API。
知道了客户端ID和机密后,您便拥有了创建对Instagram API签名的OAuth 2.0请求所需的工具。 要OAuth 2.0协议和工作流程被广泛记载(见相关信息的链接,相关的文档)。 本文将不做详细介绍。 足够注意,后续示例演示了如何使用Instagram API实现此工作流程。
还要注意,在第三方应用程序中使用Instagram API受Instagram API使用条款的约束。 在进行开发之前,请花几分钟阅读本文档,以确保您遵守所有必要的规则。 您可以在“ 相关主题”中找到此文档的链接。
在开始PHP代码之前,请查看Instagram API的工作方式。 与所有基于REST的服务一样,通过向指定资源端点发出HTTP请求来调用API方法。 这个HTTP请求包含一个或多个输入参数。 服务器将处理这些参数,并发送回JSON响应,该响应可在网页中进行解析和使用。 为了安全起见,所有Instagram API请求都必须通过SSL发出。
Instagram API提供了许多不同的终结点。 端点可用于媒体,评论,喜欢,标签,位置,用户和用户关系。 只需通过将客户端ID作为请求参数传递即可访问某些端点。 其他人则需要签名的OAuth 2.0请求。
一个典型的Instagram响应数据包包含照片和相关信息的详细提要。 要查看示例,请打开Web浏览器并请求API端点https://api.instagram.com/v1/media/popular?client_id= xx (用您的Instagram客户端ID替换URL中的xx )。 此请求应生成当前Instagram上最受欢迎图像的JSON feed。 快速浏览一下此输出( 图3 ),以熟悉其主要元素。 如您所见,响应文档包含一张受欢迎的照片列表,并为每张照片提供图像URL(用于缩略图,低分辨率和高分辨率版本),标题,标签,创建时间,评论,顶,过滤器,位置,短URL,用户信息等。
使用PHP的json_decode()函数和一些基本HTML将信息格式化为可读的网页非常容易。 清单1对此进行了说明。
Popular on Instagram
setParameterGet('client_id', $CLIENT_ID);
// get popular images
// transmit request and decode response
$response = $client->request();
$result = json_decode($response->getBody());
// display images
$data = $result->data;
if (count($data) > 0) {
echo '';
}
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage() . print_r($client);
exit;
}
?>
清单1首先设置一个Zend Framework自动加载器实例,然后初始化Zend_Http_Client类的实例。 此客户端用于在https://api.instagram.com/v1/media/popular创建并发送GET请求到Instagram API终结点以获取流行图像。 注意,端点URL必须包含通过Instagram开发者控制台生成的客户端ID。
然后,使用PHP的json_decode()函数解析对请求的JSON响应并将其转换为PHP对象。 如果将清单1中的代码与图3中显示的原始JSON对象进行比较,则可以看到对象成员与JSON键值对之间的对应关系。 现在,您可以遍历对象成员,检索单个图像的数据(例如图像URL,所有者的用户名,创建时间,注释和类似计数),并设置其格式以显示为网页。 图4说明了输出结果。
如图3所示,您可以将每个Instagram图片与一个或多个标签相关联,这些标签是可用于对图片进行分类的描述性关键字。 Instagram API包括用于搜索和检索标签的端点。 / tags / search端点是您最常使用的端点,它使您可以搜索与搜索词匹配的标签。 考虑清单2 ,该清单演示了如何使用此端点。
Instagram Tag Search
Search results for ''
setParameterGet('client_id', $CLIENT_ID);
$client->setParameterGet('q', $_POST['q']);
// get and display similar tags
$response = $client->request();
$result = json_decode($response->getBody());
$data = $result->data;
if (count($data) > 0) {
echo '';
foreach ($data as $item) {
echo '- ' . $item->name . ' (' . $item->media_count .
')
';
}
echo '
';
}
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage() . print_r($client);
exit;
}
}
?>
清单2首先建立一个简单的Web表单,供用户输入搜索词。 提交表单后,将初始化一个新的Zend_Http_Client对象,并向/ tags / search端点创建一个请求,类似于清单1所述 。 用户输入的搜索词作为“ q”请求参数中的请求参数传递到此端点。
对该请求的响应是与搜索词匹配的标签的集合。 您可以解码该信息并将其格式化为网页,从而产生如图5所示的结果:
在许多情况下,您对与标签关联的图像而不是标签感兴趣。 这就是/ tags / [tag-name] / media / recent端点进入的地方。您可能会从端点结构中猜到,它会生成一个最近用指定标签名称标记的图像列表。 清单3通过创建一个简单的应用程序按标签在Instagram搜索照片来说明实际使用的标签。
Instagram Photo Search by Tag
Search results for ''
setParameterGet('client_id', $CLIENT_ID);
// get images with matching tags
// transmit request and decode response
$response = $client->request();
$result = json_decode($response->getBody());
// display images
$data = $result->data;
if (count($data) > 0) {
echo '';
}
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage() . print_r($client);
exit;
}
}
?>
清单3是清单1和清单2的混合体。 它提供了一个Web表单供用户输入搜索词。 然后,它使用该搜索词作为标签,向/ tags / [tag-name] / media / search端点发送请求以查找匹配照片的列表。 然后,如清单1所示处理所得的对象集合,以生成包含缩略图和基本配置文件信息的页面。 图6显示了结果的示例。
正如您可以按标签搜索图像一样,您也可以按位置搜索图像。 / media / search端点接受“ lat”和“ long”参数,并生成与该纬度和经度匹配的图像列表。 为了说明这一点,请考虑清单4 ,它允许用户输入纬度/经度坐标,然后生成指定区域内或周围的图像列表。
Instagram Photo Search by Location
Search results for 'lat:,
long:'
setParameterGet('client_id', $CLIENT_ID);
$client->setParameterGet('lat', $_POST['lat']);
$client->setParameterGet('lng', $_POST['long']);
// get images matching specified location
$response = $client->request();
$result = json_decode($response->getBody());
// display images
$data = $result->data;
if (count($data) > 0) {
echo '';
}
} catch (Exception $e) {
echo 'ERROR: ' . $e->getMessage() . print_r($client);
exit;
}
}
?>
图7说明了在18.9218 N,72.8347 E处搜索图像的结果,该图像对应于印度盖特威在孟买的位置。
请注意,可以通过在请求中附加“距离”参数来将搜索区域的直径从1 km增加到5 km。 尽管此处未进行演示,但Instagram还提供了/ locations API端点,您可以使用该端点来检索有关特定位置的信息。
前面的示例演示了如何搜索和检索符合特定条件的图像集合。 Instagram还提供了/ media / [media-id]终结点,可用于获取有关特定图像的详细信息。 考虑清单5 ,该清单说明了可通过此端点获得的信息类型。
Instagram Image Detail
setParameterGet('client_id', $CLIENT_ID);
// get image metadata
$response = $client->request();
$result = json_decode($response->getBody());
// display image data
?>
Meta
Date:
data->created_time); ?>
Creator:
data->user->username; ?>
(data->user->full_name) ?
$result->data->user->full_name : 'Not specified'; ?>)
Location:
data->location) ?
$result->data->location->latitude . ',' .
$result->data->location->longitude : 'Not specified'; ?>
Filter:
data->filter; ?>
Comments:
data->comments->count; ?>
Likes:
data->likes->count; ?>
Resolution:
Standard |
Thumbnail
Tags:
data->tags); ?>
Image
getMessage() . print_r($client);
exit;
}
?>
加载Zend_Http_Client库之后, 清单5为/ media / [media-id]端点创建一个请求,并将媒体ID嵌入请求URI中。 媒体ID通常与其他照片元数据一起包含在每个搜索结果中。
对/ media / [media-id] API请求的响应是一个JSON文档,其中包含有关指定图像的详细信息。 这些信息包括图像创建日期和时间,创建者的用户名,拍摄照片的纬度和经度,照片上使用的Instagram过滤器以及喜欢和评论的数量。 返回的数据还包括图像的三个版本(缩略图,低分辨率版本和高分辨率版本)的URL,以及相关标签的列表。 最新注释列表将附加到JSON文档; 从清单和输出中可以看到,您可以处理此列表以在照片上显示评论以及评论用户的姓名和个人资料图片。
图8显示了清单5的输出。 如输出所示,Instagram API通过自定义PHP应用程序可以显示您将在Instagram应用程序和网站中找到的所有信息。
这只是冰山一角。 Instagram API还使开发人员可以访问经过身份验证的用户的照片供稿,按用户搜索照片,在用户之间创建关注者关系等等。 在大多数情况下,只能使用签名的OAuth 2.0请求执行这些用户范围的操作,这要求开发人员实施OAuth 2.0工作流程。 Instagram API的其他方面,将在本文的第二部分中进行讨论,因此一定要回来。
翻译自: https://www.ibm.com/developerworks/opensource/library/x-instagram1/index.html
instagram 爬虫
Comments
data->comments->data as $c): ?>
text; ?>
By from->username; ?> on created_time); ?>