首页 > 解决方案 > Scrapy 与多个 Selenium 实例(并行)

问题描述

我需要用Seleniumand刮掉很多网址Scrapy。为了加快整个过程,我正在尝试创建一堆共享Selenium实例。我的想法是在需要和完成的情况下为任何人提供一组并行Selenium实例。Requestreleased

我试图创建一个Middleware,但问题是它Middleware是顺序的(我看到所有驱动程序(我称之为浏览器)加载 url,它似乎是顺序的)。我希望所有驱动程序并行工作。

class ScrapySpiderDownloaderMiddleware(object):
    BROWSERS_COUNT = 10

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.free_browsers = set(
            [webdriver.Chrome(executable_path=BASE_DIR + '/chromedriver') for x in range(self.BROWSERS_COUNT)])

    def get_free_browser(self):
        while True:
            try:
                return self.free_browsers.pop()
            except KeyError:
                time.sleep(0.1)

    def release_browser(self, browser):
        self.free_browsers.add(browser)

    def process_request(self, request, spider):
        browser = self.get_free_browser()

        browser.get(request.url)

        body = str.encode(browser.page_source)
        self.release_browser(browser)

        # Expose the driver via the "meta" attribute
        request.meta.update({'browser': browser})

        return HtmlResponse(
            browser.current_url,
            body=body,
            encoding='utf-8',
            request=request
        )

我不喜欢你做的解决方案:

driver.get(response.url) 

parse方法中,因为它会导致冗余请求。每个网址都被请求两次,我需要避免。

例如这个https://stackoverflow.com/a/17979285/2607447

你知道该怎么做吗?

标签: pythonseleniumscrapy

解决方案


正如@Granitosaurus 建议的那样,Splash 是一个不错的选择。我个人使用Scrapy-splash -Scrapy负责并行处理并Splash负责网站渲染,包括JavaScript执行。


推荐阅读