[英]Creating Multiple Instances of a Selenium Scraper Class and running the in Parallel
[英]Scrapy with multiple Selenium instances (parallel)
我需要使用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
方法中,因為它會導致多余的請求。 每個網址都被請求兩次,這是我需要避免的。
例如,這個https://stackoverflow.com/a/17979285/2607447
你知道該怎么辦嗎?
我建議您將目光投向scrapy + docker。 您可以一次運行多個實例
正如@Granitosaurus所建議的那樣,Splash是一個不錯的選擇。 我個人使用了Scrapy-splash - Scrapy
負責並行處理, Splash
負責網站渲染,包括JavaScript
執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.