Мне нужно очистить многие 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
Вы знаете, что делать?