Scrapy с несколькими экземплярами Selenium (параллельно) - PullRequest
0 голосов
/ 23 января 2019

Мне нужно очистить многие URL с помощью Selenium и Scrapy.Чтобы ускорить весь процесс, я пытаюсь создать кучу общих Selenium экземпляров.Моя идея состоит в том, чтобы иметь набор параллельных Selenium экземпляров, доступных для любого Request, если это необходимо, и released, если это сделано.

Я пытался создать 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, поскольку он вызывает избыточные запросы.Каждый URL запрашивается два раза, чего мне следует избегать.

Например, это https://stackoverflow.com/a/17979285/2607447

Вы знаете, что делать?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Как подсказал @Granitosaurus, Splash - хороший выбор. Я лично использовал Scrapy-splash - Scrapy, заботится о параллельной обработке, а Splash заботится о рендеринге сайта, включая JavaScript выполнение.

0 голосов
/ 23 января 2019

Предлагаю вам посмотреть в сторону scrapy + docker. Вы можете запустить несколько экземпляров одновременно

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