Python多处理尝试使用两个并行令牌请求GitHub api

Python多处理尝试使用两个并行令牌请求GitHub api,python,multiprocessing,github-api,Python,Multiprocessing,Github Api,我正在尝试使用函数bucket()请求GitHub API用户信息,同时使用两个访问令牌。然后将用户信息保存到csv文件中。我这样做的原因是为了超过GitHub API的速率限制。请忽略GitHub是否会阻止我。(我问了GitHub,但还没有得到答复。) 我的方法是使用Python多处理库以不同的参数并行运行相同的函数。实际上,我创建的这两个进程是顺序运行的,而不是并行运行的。 这是我的密码: import requests import csv import time from multipr

我正在尝试使用函数bucket()请求GitHub API用户信息,同时使用两个访问令牌。然后将用户信息保存到csv文件中。我这样做的原因是为了超过GitHub API的速率限制。请忽略GitHub是否会阻止我。(我问了GitHub,但还没有得到答复。) 我的方法是使用Python多处理库以不同的参数并行运行相同的函数。实际上,我创建的这两个进程是顺序运行的,而不是并行运行的。 这是我的密码:

import requests
import csv
import time
from multiprocessing import Process

# *************Construct url************
url1 = 'https://api.github.com/users'
url2 = 'https://api.github.com/users?since=1000000'
token1 = 'my_token1'
token2 = 'my_token2'
headers1 = {'Authorization': 'token %s' % token1}
headers2 = {'Authorization': 'token %s' % token2}
params = {'per_page': 100}

def bucket(url, header, params, file_path):
    count = 0
    cnt = 0
    csv_file = open(file_path, 'a', buffering=0)
    writer = csv.writer(csv_file)
    while count < 1:    # just run 100 users' profile to see result fast
        r = requests.get(url, headers=header, params=params)  # get user's basic info, 100 users/request
        users = r.json()
        for user in users:
            user_profile = requests.get(user['url'], headers=header).json()  # get user's detailed profile, 1 user/request
            field_names = user_profile.keys()
            line = []
            for field in field_names:
                if (field in user_profile) and user_profile[field]:
                    if isinstance(user_profile[field], basestring):
                        line.append(user_profile[field].encode('utf-8'))
                    else:
                        line.append(user_profile[field])
                else:
                    line.append('NULL')
            writer.writerow(line)
            cnt += 1
            print cnt
            time.sleep(0.75)
        try:
            url = r.links['next'].get('url')   # get url for next page (100 users/page), 1 page is one request
        except:
            break
        print(r.headers['X-RateLimit-Remaining'])
        count += 1

if __name__ == '__main__':
  p1 = Process(target=bucket(url3, headers3, params, 'GitHub_users3.csv'))
  p1.start()
  p2 = Process(target=bucket(url4, headers4, params, 'GitHub_users4.csv'))
  p2.start()
  p1.join()
  p2.join()
导入请求
导入csv
导入时间
从多处理导入进程
#**********构造url************
url1=https://api.github.com/users'
url2=https://api.github.com/users?since=1000000'
token1='my_token1'
token2='my_token2'
headers1={'Authorization':'token%s'%token1}
headers2={'Authorization':'token%s'%token2}
参数={'per_page':100}
def存储桶(url、标头、参数、文件路径):
计数=0
cnt=0
csv_文件=打开(文件路径'a',缓冲=0)
writer=csv.writer(csv\u文件)
当计数小于1时:#只需运行100个用户的配置文件即可快速查看结果
r=requests.get(url,headers=header,params=params)#获取用户基本信息,100个用户/请求
users=r.json()
对于用户中的用户:
user#profile=requests.get(user['url'],headers=header).json()#获取用户的详细配置文件,1个用户/请求
字段\名称=用户\配置文件.keys()
行=[]
对于字段名称中的字段:
if(用户配置文件中的字段)和用户配置文件[字段]:
如果isinstance(用户配置文件[字段],基串):
行.append(用户配置文件[field].encode('utf-8'))
其他:
line.append(用户配置文件[字段])
其他:
line.append('NULL'))
writer.writerow(行)
cnt+=1
印刷碳纳米管
睡眠时间(0.75)
尝试:
url=r.links['next'].get('url')#获取下一页的url(100个用户/页),一页是一个请求
除:
打破
打印(右标题['X-RateLimit-Remaining'])
计数+=1
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
p1=进程(目标=bucket(url3,headers3,参数'GitHub_users3.csv'))
p1.开始()
p2=进程(目标=bucket(url4,headers4,参数'GitHub_users4.csv'))
p2.start()
p1.join()
p2.join()
有人能帮我完成这个目标吗?如果您想分享任何可以通过GitHub api速率限制的想法,我很高兴了解。谢谢

我问了GitHub,但还没有得到答复

正如我在回复您的消息时提到的——使用来自同一用户的两个令牌不会授予您更好的速率限制,因为经过身份验证的请求的速率限制是每个用户(而不是每个用户每个令牌)。我强烈建议您不要创建多个免费帐户,不要使用这些帐户中的代币来绕过费率限制(因为ToS不允许这样做)

我问了GitHub,但还没有得到答复

正如我在回复您的消息时提到的——使用来自同一用户的两个令牌不会授予您更好的速率限制,因为经过身份验证的请求的速率限制是每个用户(而不是每个用户每个令牌)。我强烈建议您不要创建多个免费帐户,不要使用这些帐户中的代币来绕过费率限制(因为ToS不允许这样做)