闲逛发现了YQL,它是雅虎的web service,允许你使用像SQL一样请求互联网数据:
select * from table where xxx = yyy
它把互联网服务、公共数据、网页都看作一个一个的table,你可以从里面读出数据。
有些资源(服务)还可以update delete insert
YQL支持哪些table呢,进入这里 http://developer.yahoo.com/yql/console/
敲入show tables,点击【测试】,下面便会出现一堆table,
很多我目前都用不上,如果能指定返回数据的语言,就更实用了。
我们先拿html来玩玩吧,query的格式如下:
select * from html where url="www.site.com/page.html" and xpath="..."
忘了说YQL的接口地址,下面是PHP代码
$url = 'http://www.site.com';
$xpath = '//*[@id="xx"]';
$query = "select * from html where url = '{$url}' and xpath='{$xpath}'";
$url = "http://query.yahooapis.com/v1/public/yql?q=".urlencode($query);
$session = curl_init($url);
curl_setopt($session, CURLOPT_RETURNTRANSFER, 1);
$res = curl_exec($session);
echo $res;
OK,搞定。你可以选选择返回的是xml还是json, 只要在请求地址后面加上参数 format=json
如果是json格式,还可以指定callback, jsonp回调函数。
jsonp ? 是否突然发现js也可以轻松跨域了,不用自己在服务器再弄个代理,YQL已经帮你做了。
不过还是得冷静下来,连接YQL的速度并不快,随便测试了拿网页的数据,都要等8秒以上,这就是硬伤了。下次做外国项目的时候看看是否速度有改善。
其次,如果对方网站在robots.txt设置了限制,YQL是取不回数据的。
公共接口每个IP每小时的请求限制在2000次。授权接口则可以2w次,一般是够用了,照这样的网络速度,3600/8 才450次每小时。不好意思,没算上并行的情况。
尽管如此,这样的接口还是要大赞一下的,
它使web service的接口非常简化并统一,无需花多时间去学各种API
除了web service,html, csv xml 也是可以抓下来的,还支持嵌套查询,你可以将分散在网络各处的资源,整合在一起,过滤,排序等。
什么时候国内也有这样的接口呢?