簡體   English   中英

Scrapy具有多個Selenium實例(並行)

[英]Scrapy with multiple Selenium instances (parallel)

我需要使用SeleniumScrapy抓取許多網址。 為了加快整個過程,我試圖創建一堆共享的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方法中,因為它會導致多余的請求。 每個網址都被請求兩次,這是我需要避免的。

例如,這個https://stackoverflow.com/a/17979285/2607447

你知道該怎么辦嗎?

我建議您將目光投向scrapy + docker。 您可以一次運行多個實例

正如@Granitosaurus所建議的那樣,Splash是一個不錯的選擇。 我個人使用了Scrapy-splash - Scrapy負責並行處理, Splash負責網站渲染,包括JavaScript執行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM