如何在解析过程中设置github令牌的自动更改



GitHub允许您每小时发送不超过2500个请求,如果我有多个帐户/令牌,如何在达到一定请求级别(例如2500(时在Scrapy中设置自动令牌更改,或者在响应403时更改令牌。?

class GithubSpider(scrapy.Spider):
name = 'github.com'
start_urls = ['https://github.com']
tokens = ['token1', 'token2',  'token3', 'token4']
headers = {
'Accept': 'application/vnd.github.v3+json',
'Authorization': 'token ' + tokens[1],
}

def start_requests(self, **cb_kwargs):
for lang in languages:
cb_kwargs['lang'] = lang
url = f'https://api.github.com/search/users?q=language:{lang}%20location:{country}&per_page=100'
yield Request(url=url, headers=self.headers,  callback=self.parse, cb_kwargs=cb_kwargs)

您可以使用模块itertools中的cycle函数,使用您的令牌列表创建一个生成器,然后您可以为发送的每个请求循环使用该生成器,以确保您平等地使用所有令牌,从而减少任何令牌达到限制的机会。

如果您开始接收403响应,那么您将知道所有令牌都已达到其极限。参见下方的示例代码

from itertools import cycle
class GithubSpider(scrapy.Spider):
name = 'github.com'
start_urls = ['https://github.com']
tokens = cycle(['token1', 'token2',  'token3', 'token4'])
def start_requests(self, **cb_kwargs):
for lang in languages:
headers = {
'Accept': 'application/vnd.github.v3+json',
'Authorization': 'token ' + next(self.tokens)
}
cb_kwargs['lang'] = lang
url = f'https://api.github.com/search/users?q=language:{lang}%20location:{country}&per_page=100'
yield Request(url=url, headers=headers,  callback=self.parse, cb_kwargs=cb_kwargs)

最新更新