在Google App Engine上使用Python提取Facebook关系状态

1 投票
2 回答
775 浏览
提问于 2025-04-17 06:10

我正在开发一个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 个用户的信息。

撰写回答