如何在解析期间设置 github 标记的自动更改?

How do I set up automatic change of the github token during parsing?

GitHub如果我有几个accounts/tokens,允许你每小时发送不超过2500个请求,当达到一定级别的请求时,如何在Scrapy中设置自动令牌更改(例如 2500) 或在响应 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)