首页 > 解决方案 > Scrapy - 在第一次请求后禁用 Selenium

问题描述

我正在从网站上抓取网址,但只有第一个请求需要 selenium,而另一个则不需要。是否可以在报废过程中关闭 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)

标签: pythonseleniumscrapy

解决方案


您可以修改中间件,使其仅在请求带有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


推荐阅读