Scrapy - отключить селен после первого запроса - PullRequest
0 голосов
/ 03 октября 2018

Я соскребаю URL-адреса с сайта, но селену нужны только первые запросы, а остальные нет.Можно ли отключить селен в середине процесса утилизации?Я хочу сделать это, потому что, как вы, вероятно, сейчас, Selenium сильно замедляет процесс утилизации.Это код для паука:

class StoreSpider(scrapy.Spider):
    name = 'store'
    allowed_domains = ['www.store.com.br']
    custom_settings = {
        'COLLECTION_NAME'   : 'store',
        'URLS_COLLECTION_NAME'   : 'store_urls',
        'USES_SELENIUM'          : True,
        'HEADLESS'               : True,
        'DOWNLOADER_MIDDLEWARES': {
            'scrapy.downloadermiddlewares.retry.RetryMiddleware': 90,
            'navigator.middlewares.SeleniumMiddleware': 700,
        }
    }

    categories_le = LinkExtractor(restrict_xpaths="//li[@class='h3']/a[not(@id)]")

    def start_requests(self):
        urls = [
            'https://www.store.com.br/loja/mapa-do-site',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse_categories)

1 Ответ

0 голосов
/ 03 октября 2018

Вы можете изменить свое промежуточное программное обеспечение так, чтобы оно использовало Selenium только тогда, когда запрос приходит с мета-ключом render_js.

Примерно так:

class SeleniumMiddleware(object):
    ...
    def process_request(self, request, spider):
        if not request.meta.get('render_js'):
            # disable js rendering in a per-request basis
            return

        # render with selenium
        ...

Это работает, потому что когдаprocess_request промежуточного программного обеспечения загрузчика возвращает None, запрос переходит к следующему промежуточному программному обеспечению в цепочке, в конечном итоге затрагивая загрузчик Scrapy.

Более подробная информация здесь: https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#scrapy.downloadermiddlewares.DownloaderMiddleware.process_request

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...