01-获取 Twitter User Profile 的三条路径 | 07.杂项

01-如何获取 Twitter User Profile

郑昀 201005 隶属于《07.杂项》小节

主要通过三种方式。当然,算上各种公开的 twitter 第三方Proxy API ,会更多。

由于每一种方式都有请求频率限制,所以建议最终程序混合这三种方法,要么随机选择其一,要么按优先级逐次访问,如果访问不通,立刻切换到下一种。

 

1.YQL 方式

YQLYahoo! Pipe 都是最优秀的 mashup 工具之一,身为 Geek 至少要熟悉 Yahoo! Pipe 。

1.0.背景

雅虎发布的YQL,背后的机理是每个人都可以将他的数据以一种特殊的方式供其他人使用,谁想要读取这些数据,只需要使用一种类似SQL语法的语言即可。

它是一个具有基于REST接口,可以让开发者从各类资源中查询数据的在线查询处理器。

它是一个严格的查询处理托管服务。这也意味着YQL不受单独的数据资源限制,甚至不限制应用于雅虎的自身产品。YQL可以操作任何第三方数据源,只要对方是一种常见的格式,如RSS, ATOM, JSON, XML,等等。

以上文字参见互动百科

1.1.Twitter API 都可适用于 YQL

上面说了,只要对方是一种常见的数据格式,如JSON、RSS,都可以被 YQL 作为数据源。所以,我们访问 Twitter 受访问频率限制时,可以走这条路。

1.2.YQL 的 Python 封装库

Python yql 库主页地址:http://python-yql.org/

安装简单:easy_install yql 。使用也非常简单:

>>> import yql
>>> y = yql.Public()
>>> query = 'select * from flickr.photos.search where text="panda" limit 3';
>>> result = y.execute(query)
>>> result.rows
 

但要小心,yql 库实际上是组装了一个查询YQL的 HTTP URL ,用自定义或外部传入的 httplib2 实例发起请求,那么它势必受到网络环境的影响,比如 GFW 的干扰。

1.3.请求限制

YQL 在 Usage Information and Limits 中说:

  • Per application limit (identified by your Access Key): 100,000 calls per day.
  • Per IP limits: /v1/public/*: 1,000 calls per hour; /v1/yql/*: 10,000 calls per hour.
  • All rates are subject to change.
  • YQL rate limits are subject to the rate limits of other Yahoo! and 3rd-party Web services.

1.4.YQL 的 Console 网页测试

进入 http://developer.yahoo.com/yql/console/ 页面,

在 Your YQL Statement 输入框中输入如下 SQL 命令:

select * from json where url='http://api.twitter.com/1/users/show/fenng.json'

然后点击“TEST”按钮,稍后,FORMATTED VIEW就会以 XML 方式显示出 Twitter 用户 fenng 的 profile 了。

 

SQL 命令

select * from json where url="http://search.twitter.com/search.json?q=rt&rpp=20&lang=zh"
可透过 Twitter Search 接口得到最新的 RT 消息。

 

SQL 命令

select * from json where url='https://twitter.com/statuses/user_timeline/fenng.json'

可以得到 fenng 最近发布的若干条 Tweets 。

 

1.5.Python YQL 的调用方式

对于其他数据源的请求,比如 flickr ,在我们的网络环境下,yql 库都不会有什么问题。但对于 Twitter 数据源,貌似就容易被重置链接(但浏览器访问 YQL Console 做查询却没事儿。所以也许是User-Agent的事儿。),于是乎我们就要设置一个代理穿墙。而代理选择 Puff 貌似容易得到 401 HTTP状态,所以选择 Mr.Zhang 了。

代码如下:

import yql
import httplib2
import socks
h = httplib2.Http(proxy_info = httplib2.ProxyInfo(socks.PROXY_TYPE_HTTP, 'localhost', 2010))
y=yql.Public(httplib2_inst=h)
results=y.execute("select * from json where url='http://api.twitter.com/1/users/show/fenng.json'")
print results.rows
print results.uri

(注:socks 库需要安装,主页地址:http://socksipy.sourceforge.net/ ,它没有安装程序,下载源代码包把 socks.py 复制到 Python's lib/site-packages directory 即可。httplib2 则用 easy_install httplib2 安装即可。)

你也可以把 YQL 认为是一个代理,能把任意数据格式转换为指定格式的代理。

2.SocialGraph 方式

Google Social Graphlookup 方法可以获取一个 twitter 用户的关联信息。

我们可以通过组装这样的 URL :

http://socialgraph.apis.google.com/lookup?q=twitter.com%2Fzhengyun&pretty=1

来得到 zhengyun 的 twitter profile ,结果如下所示:

{
"canonical_mapping": {
"twitter.com/zhengyun": "http://twitter.com/zhengyun"
},
"nodes": {
"http://twitter.com/zhengyun": {
"attributes": {
"fn": "zhengyun",
"adr": "\u5317\u4eac",
"photo": "http://a1.twimg.com/profile_images/27832922/zhengyun_ustc_bigger.jpg",
"exists": "1",
"rss": "http://twitter.com/statuses/user_timeline/zhengyun.rss",
"atom": "http://twitter.com/statuses/user_timeline/zhengyun.atom",
"url": "http://twitter.com/zhengyun",
"profile": "http://twitter.com/zhengyun"
}
}
}
}

当然,这没有人家 Twitter 自己的API给的数据全,但也算是能得到用户的 Location(就是 adr 字段)和 头像(photo字段)等最基本字段了。

2.1.请求限制

Google 文档写道:『Use of the Social Graph API is subject to a query limit of 50,000 queries per user per day. If you go over this 24-hour limit, the Social Graph API may stop working for you temporarily.If you continue to exceed this limit, your access to the Social Graph API may be blocked』,看来需要知道检测到“stop working for you temporarily”时触发哪种异常,这样才能避免被block。

3.Twitter 方式

最后可以直接访问 Twitter 的 user/show 方法:
http://api.twitter.com/1/users/show.xml?id=noradio
,而不需要请求 statuses/user_timeline 方法。
举例:
http://api.twitter.com/1/users/show.json?id=zhengyun

 

3.1.请求限制

如果我们的出口IP在 twitter 的白名单上,那么访问限制是:20,000 requests per hour。否则是每小时150~350次。

 

附录A:

Python YQL 库对查询命令

select * from json where url="http://api.twitter.com/1/users/show/fenng.json"

实际是组装了一个 HTTP 请求:

http://query.yahooapis.com/v1/yql?q=select%20*%20from%20json%20where%0A%20url%3D%22http%3A%2F%2Fapi.twitter.com%2F1%2Fusers%2Fshow%2Ffenng.json%22&diagnostics=true

posted @ 2010-06-11 02:19  老兵笔记  阅读(3467)  评论(0编辑  收藏  举报