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