05 Python 爬蟲教學10 所有文章

【爬蟲教學】如何讓Selenium 多線池執行時driver不會重複開啟

python_selenium_driver

threading.local()

利用threading.local()的方法將driver變數存在線程內,當每次線程重新執行時會先getattr看看有無driver沒有的話就會重新開啟。

import threading

threadLocal = threading.local()

def get_driver():
driver = getattr(threadLocal, 'driver', None)
if driver is None:
chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument("--headless")
driver = webdriver.Chrome(chrome_options=chromeOptions)
setattr(threadLocal, 'driver', driver)
return driver


def get_title(url):
driver = get_driver()
driver.get(url)

if __name__ == '__main__':
url_list = ["A","B","C"]
ThreadPool(5).map(get_title,url_list)

當執行噴錯時,可以在except內把driver關閉,並輸入setattr(self.threadLocal, ‘driver’, None),這樣下次執行時就會自動再開啟新的driver了

try:

  "do something"

except TimeoutException as e:
  driver.close()
  setattr(self.threadLocal, 'driver', None)
  time.sleep(10)
  break

如何在執行完所有線程池時,再將目前有開啟的driver關閉?如果直接在finally的地方寫下driver.close()或driver.quit(),你會發現他會找不到指定的driver,所以會無法將所有的driver關閉乾淨。

所以我是當有建立driver的時候,就將driver存入driver_log這個list內,當執行結束時再用迴圈將所有list內的driver關閉。

self.driver_log = []

for a in self.driver_log:
try:
a.close()
a.quit()
except:
pass

那 【爬蟲教學】如何讓Python selenium多線池執行時driver不會重複開啟 就到這邊感謝收看,如文章內容有誤請不吝指正!

關於爬蟲相關的延伸閱讀:

 

2 thoughts on “【爬蟲教學】如何讓Selenium 多線池執行時driver不會重複開啟

  1. 請問最後哪裏把driver全放到一個list裏應該怎麽寫呢?不大明白。是自定義了一個類?不知道可不可以說詳細點/公開更完整的代碼呢?謝謝!

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *