У меня есть код ниже
Паук
class SomeSpider(scrapy.Spider):
name = 'some'
token_recaptcha = 'token'
ita = ImageTyperzAPI(token_recaptcha, 0, 240)
imovels = None
__allowed = ("imovels")
def __init__(self, *args, **kwargs):
super(SomeSpider, self).__init__(*args, **kwargs)
for k, v in kwargs.items():
assert (k in self.__class__.__allowed)
setattr(self, k, v)
def start_requests(self, *args, **kwargs):
for imovel in self.imovels: ## list with hundreds of urls
url_modifica = 'wwww.exemplo.io' ## use the parameters to modify the url
yield scrapy.FormRequest(
url=url_modifica, errback=self.error_connect,
method='GET', callback=self.first,
meta={'imovel': imovel}, dont_filter=True)
def first(self, response):
status = response.xpath('//p[@class="atencao"]/text()').get()
if status is None:
meta={
'captchaid': self.send_recaptcha(),
'delay_request': 40 #initiated the request after 40 seconds,to give more time for the resolution of the recaptcha
}
yield scrapy.FormRequest(
url='www.exemplo.io',
method='POST', callback=self.second,meta=meta)
def second(self,response):
meta = response.request.meta
captcha_id = meta['captchaid']
formdata = {
'data': '',
'controle': 'ADMIN',
'nu_dam[]': []
}
formdata['g-recaptcha-response'] = self.solves_captcha(captcha_id)
yield scrapy.FormRequest(method='POST', formdata=formdata, callback=self.third,
errback=self.error_connect, meta=meta,
dont_filter=True, priority=1,
url='www.exemplo.io')
def third(self, response):
yield response
DownloaderMiddleware
def process_request(self, request, spider):
delay = request.meta.get('delay_request', None)
if delay:
d = Deferred()
reactor.callLater(delay, d.callback, None)
return d
настройки
CONCURRENT_REQUESTS = 3
DOWNLOAD_DELAY = 1.0
Моя проблема
Согласно документации scrapy
По умолчанию Scrapy использует очередь LIFO для хранения ожидающих запросов, что в основном означает, что она сканируется в порядке DFO.
Но в моем коде этого не происходит, в настоящее время он работает следующим образом
fisrt> fisrt> fisrt> fisrt> second> second> second> second> third> first
Мне нужна высокоприоритетная процедура для третьего анализа, потому что, когда капча разрешена, у нее истекает время, я хотел бы, чтобы вы следовали этой последовательности
fisrt> fisrt> fisrt > fisrt> второй> второй> второй> второй> третий> третий> третий> третий> первый
Я попытался установить приоритет = 1, но он не работает
Если вы измените CONCURRENT_REQUESTS = 1, код работает хорошо, но тогда обработка займет слишком много времени, я бы хотел все одновременные запросы, чтобы сделать это быстрее