Scrapy - 在第一次请求后禁用Selenium

问题描述 投票:1回答:1

我正在从网站上抓取网址,但只有第一个请求需要硒而另一个请求不需要。是否有可能在废料处理过程中关闭Selenium?我想这样做,因为,正如你现在所做的那样,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)
python selenium scrapy
1个回答
0
投票

您可以修改您的中间件,以便在请求附带render_js元键时它仅使用Selenium。

像这样的东西:

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

© www.soinside.com 2019 - 2024. All rights reserved.