在Google App Engine上使用Python提取Facebook关系状态
我正在开发一个Facebook应用程序,使用Python编写,并运行在Google App Engine(GAE)上。
我知道如何获取用户网络中的关系状态,但我现在的方法速度太慢了。GAE对CPU使用有时间限制,大约是60秒。使用以下代码,我在这个时间内只能获取大约200个人的关系状态,然后就会出现“DeadlineExceededError”的错误。这显然不够好,因为很多人Facebook上的朋友数量都比这个多。
现在我做的是先获取用户的朋友列表,然后对每个朋友发起一次API请求,询问他们的名字和关系状态。
我使用的代码:
for f in friends:
friends_info[f] = facebook.api('/'+f, {u'fields': 'name,relationship_status',
u'access_token': facebook.access_token})
然后我用以下方式获取数据:
rel_status = friends_info[f][u'relationship_status']
我需要的:
优化建议或者其他提取整个网络关系状态的方法。
提前谢谢大家 :-)
编辑:
大家的回答似乎都是解决我问题的好方法。不过,我找不到关于Python批量请求的好教程,所以我最后使用了FQL调用。通过使用以下代码,获取数据只需要1-2秒:
Q = 'select uid, sex, relationship_status from user where uid in (select target_id from connection where source_id = me())'
实际数据是通过以下方式获取的:
data = fql.query(Q,facebook.access_token)
这个调用了这个函数:
def query(self,Q,access_token):
ENDPOINT = 'https://api.facebook.com/method/'
params = dict(query=Q, access_token=access_token, format='json')
url = ENDPOINT + 'fql.query'
return self._fetch(url, params=params)
def _fetch(self, url, params=None):
conn = urllib2.urlopen(url, data=urlencode(params))
try:
return json.loads(conn.read())
finally:
conn.close()
希望有人也能用得上这个方法!
2 个回答
2
每个应用引擎实例最多可以同时处理10个HTTP请求,这意味着你可以通过使用create_rpc和make_fetch_call把速度提高到10倍。不过,也有一些情况是这样做不奏效的,所以你需要把工作分成几个任务,让它们同时运行。
2
你可以使用 Facebook 的图形接口中的 批量查询 API,一次最多可以查询 20 个用户的信息。