scrapy如何用"response.status == 403"来判断网页的状态信息?

我在GitHub的API接口爬数据,但是由于限速(每个用户每小时5000次访问),因此需要每到5000次时,就更换为另一个GitHub账号的token,以保证能够继续访问。

之前我是通过设置了一个计数器变量来计数,每到5000次换一下,但是后来发现这样做不太严谨,因此想通过判断网页状态的方式来更换token。据我目前的观察,每到该token的访问次数减至0时,网页状态就从200变成了403,我尝试设置了一个属性status,并且在parse函数中每次用response.status来更新它,之后在start_requests方法中设置了当status为403时相应的更换token的方法。

之后开始跑spider,发现到了5000次访问之后,没有能够按照预定思路切换到另一个token,打印了一下状态码,发现状态码没有改变,依然是初始值200。究其原因,应该是当网页状态是403时压根没进到parse函数里面吧?请问怎样才能get到403的网页信息,使我能够成功更换token呢?


下面截取了部分代码,其它不重要的就不放了:

class DmozSpider(Spider):

    name = "dmoz"
    status = 200
    pid = 0
    url = ""
    
    def start_requests(self):
        while line:
            if self.status  == 403 and token_num == len(token):
                headers["Authorization"] = token[0]
                token_num = 1
                page = scrapy.http.Request(self.url, meta = {'pid':self.pid}, headers = headers, dont_filter = True, callback = self.parse)
                yield page
            elif self.status == 403 and token_num < len(token):
                headers["Authorization"] = token[token_num]
                token_num = token_num + 1
                page = scrapy.http.Request(self.url, meta = {'pid':self.pid}, headers = headers, dont_filter = True, callback = self.parse)
                yield page
            info = line.split(' ')
            pid = info[0].strip()
            url = info[1].strip()
            page = scrapy.http.Request(url, meta = {'pid':pid}, headers = headers, dont_filter = True, callback = self.parse)
            line = lang_file.readline()
            yield page
    def parse(self, response):
        item = DmozItem()
        sel = Selector(response).xpath('/html')
        item['pid'] = response.meta['pid']
        item['language'] = json.loads(sel.xpath('//text()')[0].extract())
        self.pid = response.meta['pid']
        self.url = response.url
        self.status = response.status
        yield item

    
    
阅读 6.8k
2 个回答

scrapy中有设置允许处理的http状态码,初始化设置时403应该不在其列,但是可以自定义设置,具体请看一下官方文档中的http中间件

新手上路,请多包涵

可以的,顶下

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题