以100为一组抓取数组的值

时间:2014-10-27 16:57:39

标签: python arrays steam-web-api

在下面的代码中,ids是一个数组,其中包含您朋友列表中所有用户的steam64 ID。现在根据steam web api文档,GetPlayerSummaries仅列出100个逗号分隔的steam64 id。有些用户有超过100个朋友,而不是每次调用API运行200次for循环,我想在100个steam id中使用数组。什么是最有效的方法(速度方面)?

我知道我可以ids[0:100]抓住数组的前100个元素,但是我如何为230个用户的朋友列表做到这一点?

def getDescriptions(ids):
    sids = ','.join(map(str, ids)) 
    r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids=' + sids)
    data = r.json();
...

2 个答案:

答案 0 :(得分:0)

利用this回答中的代码,您可以将其分成100组(或最后一圈的朋友)。

def chunkit(lst, n):
    newn = int(len(lst)/n)
    for i in xrange(0, n-1):
        yield lst[i*newn:i*newn+newn]
    yield lst[n*newn-newn:]


def getDescriptions(ids):
    friends = chunkit(ids, 3)
    while (True):
        try:
            fids = friends.next()
            sids = ','.join(map(str, fids)) 
            r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+API_KEY+'&steamids=' + sids)
            data = r.json()
            # Do something with the data variable
        except StopIteration:
            break

这将创建分解为3(第chunkit个}参数组)的迭代器。我选择了3,因为朋友列表的基本大小是250.你可以获得更多(来自this帖子的规则),但这是一个安全的起点。您可以根据需要微调该值。

利用此方法,每个循环都会覆盖data值。确保你在指定的地方做了些什么。

答案 1 :(得分:-1)

我有一个简单的替代方案,只需减少每个while/loop的列表大小,直到用尽:

def getDescriptions(ids):
    sids = ','.join(map(str, ids))
    sids_queue = sids.split(',')
    data = []
    while len(sids_queue) != 0:
        r = requests.get('http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key='+ \
                            API_KEY+'&steamids=' + ','.join(sids_queue[:100])
        data.append(r.json) # r.json without (), by the way
        # then skip [0:100] and reassign to sids_queue, you get the idea
        sids_queue = sids_queue[101:]