Scrapy в глубоком первом порядке - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть код ниже

Паук

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, код работает хорошо, но тогда обработка займет слишком много времени, я бы хотел все одновременные запросы, чтобы сделать это быстрее

...