第一次请求后禁用Scrapy Selenium

2024-06-11 16:58:50 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从一个站点上抓取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)

Tags: storenamebrselfcomtrueurl站点
1条回答
网友
1楼 · 发布于 2024-06-11 16:58:50

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

相关问题 更多 >