最近想把各大团购网站的信息整合一下,结果发现早就有做的不错的团购导航网站了。研究了下是怎么获得各网站的信息的,因为对web懂得很少,开始还以为是通过爬虫爬到的页面信息,结果发现都是通过各个网站自己提供的api来获取信息的。
对api这东西不熟,现在正在了解中。wikiopedia上的定义如下:
A Web API (Application Programming Interface) is typically a defined set of HTTP request messages along with a definition of the structure of response messages, typically expressed in JSON or XML. While "Web API" is sometimes considered a synonym for web service, the Web 2.0 applications typically have moved away from SOAPbased web services towards more direct REST style communications[1]. Web APIs allow the combination of multiple services into new applications known as mashups [2].
美团的api格式大致是这样的:http://www.meituan.com/api/v1/beijing/deals
估计是从类似这样的页面中得到链接、文字等信息,然后整合到自己站点的页面上去。
查了一下午信息,终于找到介绍怎么使用api的了,是使用php的xml parser函数来处理的。php我以前用过一两次,不过都忘了,借此机会重温下吧。
首先假设有一个提交api地址的form:
<form action="readApi.php" method="post" οnsubmit="return check()">
API地址:<input type="text" id="api" name="url" οnclick="cl()" />
<input type="submit" value="读取API" />
</form>
然后在readApi.php里面写怎么处理:
<?php
$file = $_POST["url"]; //$file使用$_POST变量得到api文件的地址
$g_urlset = array(); //定义数组来保存每一个团购物品的链接
$g_elem = null;
function startElement( $parser, $name, $attrs ){
global $g_urlset, $g_elem;
if ( $name == 'url' ) $g_urlset []= array(); //对每一个url标签,建立一个数组,使得$g_urlset成为二维数组
$g_elem = $name;
}
function endElement( $parser, $name ){
global $g_elem;
$g_elem = null;
}
function textData( $parser, $text ){
global $g_urlset, $g_elem;
if ( $g_elem == 'title' || $g_elem == 'website' || $g_elem == 'image' || $g_elem == 'starttime' || $g_elem == 'loc' || $g_elem == 'price' )
{
$g_urlset[ count( $g_urlset ) - 1 ][ $g_elem ] = $text; //保存每一个对应标签的值
} //标签名字不一定是正确的,依照不同网站api使用的DTD规则而不同
}
$parser = xml_parser_create(); //创建 XML 解析器,返回句柄
xml_set_element_handler( $parser, "startElement", "endElement" ); //建立起始和终止元素处理器,调用startElement和endElement函数
xml_set_character_data_handler( $parser, "textData" ); //建立字符数据处理器,调用textData函数
if (!($f = fopen($file, "r "))) //打开xml文件
{ die( "不能正常打开该文件……,请检查api地址是否正确~");}
while( $data = fread( $f, 4096 ) ) //每次读取4096个字节的数据
{
xml_parse( $parser, $data ); //解析数据
}
xml_parser_free( $parser ); //释放 XML 解析器
foreach( $g_urlset as $item )
{
echo "<table border='1'>";
echo "<tr><td class='title'>团购题目</td>";echo "<td>".$item['title']."</td></tr>";
echo "<tr><td class='title'>网站名称</td>";echo "<td>".$item['website']."</td></tr>";
echo "<tr><td class='title'>图片地址</td>";echo "<td>".$item['image']."</td></tr>";
echo "<tr><td class='title'>团购网址</td>";echo "<td>".$item['loc']."</td></tr>";
echo "<tr><td class='title'>开始时间</td>";echo "<td>".$item['starttime']."</td></tr>";
echo "<tr><td class='title'>团购价格</td>";echo "<td>".$item['price']."</td></tr>";
echo "</table>";
}
?>
使用上面的方法,就解析到api里面的数据并可以显示在页面上了。
上面的代码来源是:
http://blog.163.com/zhihui20080313@126/blog/static/1012819832010117101942567/
注释段是我按照自己的理解写的,可能会有错误。