2017-03-10 42 views
0

我使用python selenium解析來自超過10,000多個url的大量數據。瀏覽器是Firefox。python selenium,Firefox突然變空白並停止工作

對於每個網址,Firefox瀏覽器都會打開,數據解析後會關閉,並等待5秒鐘,然後再通過Firefox打開下一個網址。

但是,這些天發生了兩次,一切都很順利,突然之間,新打開的瀏覽器是空白的,它根本沒有加載網址。在現實生活中,有時甚至當我手動打開瀏覽器,搜索某些東西時,它也是空白的。

問題是,當發生這種情況時,根本沒有任何錯誤,即使當我編寫except代碼來捕獲任何異常時,同時我使用nohup命令來運行代碼,它也會記錄任何異常,但根本沒有錯誤。而一旦發生這種情況,代碼將不會再執行,並且許多網址不會被解析....如果我在其他網址上重新運行代碼,它可以正常工作。

這裏是我的代碼(所有10,000+網址是在comment_urls列表):

for comment_url in comment_urls: 
    driver = webdriver.Firefox(executable_path='/Users/devadmin/Documents/geckodriver') 
    driver.get(comment_url) 
    time.sleep(5) 
    try: 
     // here is my data parsing code ..... 
     driver.quit() // the browser will be closed when the data has been parsed 
     time.sleep(5) // and wait 5 secods 

    except: 
     with open(error_comment_reactions, 'a') as error_output: 
      error_output.write(comment_url+"\n") 
     driver.quit() 
     time.sleep(5) 

與此同時,在數據分析的一部分,是否會有任何異常,我的代碼也將記錄例外並關閉驅動程序,等待5秒鐘。但到目前爲止,根本沒有記錄錯誤。

我試圖在網上找到類似的問題和解決方案,但這些都沒有幫助。

所以,目前,我心裏有2個問題:

  1. 你有沒有遇到過這個問題,你知道該如何處理呢?是網絡問題還是硒問題或瀏覽器問題?
  2. 或者是有無論如何在Python中,它可以告訴瀏覽器不加載網址,它會關閉它?
+1

嘗試關閉硬件加速:https://support.mozilla.org/t5/Procedures-to-diagnose-and-fix/Troubleshoot-extensions-themes-and-hardware-acceleration-issues/ta-p/ 1616#w_turn-off-hardware-acceleration –

+0

我從這個解決方案開始,代碼一直在運行,但今天它突然停止,沒有完成。好消息是,這一次,瀏覽器不再崩潰,但有一個彈出窗口,要求安全服務的主密碼並停止了我的代碼。但它沒有告訴哪個安全服務。所以我想知道這是因爲Mac可能有一些安全設置?或者這是我們學校實驗室的安全保護措施?或者其他原因?這臺機器有多個帳戶,我使用的不是主帳戶。任何想法? –

+1

這取決於該頁面和網址的截圖。沒有它,猜測發生了什麼非常困難。 Firefox擁有自己的firefox同步主密碼,但據我瞭解,您不使用selenium瀏覽器(Firefox驅動程序)中的同步。所以這可能是由於網站或校園。 –

回答

0

對於第二個問題,優先使用工作隊列來解析URL。一個應用程序應該將它們全部添加到隊列中(redis,rabbit-mq,amazon sqs等),然後第二個應用程序應該從隊列中獲得1個url並嘗試解析它。如果它成功,它應該從隊列中刪除url並切換到隊列中的其他url。如果發生異常,應該os.exit(1)停止應用程序。使用shell運行第二個應用程序,當它返回1時,表示發生錯誤,重新啓動應用程序。 shell腳本:Get exit(1) from Python in shell

0

要回答你的兩個問題:

1)是的,我發現硒是不可預測的時間。首次打開瀏覽器時,這通常是一個問題,我將在我的解決方案中討論這個問題。除非需要,否則請儘量不要關閉瀏覽器。

2)是的,你可以使用WebDriverWait()類selenium.webdriver.support.wait

你說你正在分析數千條評論所以只要你有開放的webdriver的一個新的GET請求。

我在我自己的鏟運機使用此與下面的代碼:

from selenium.webdriver.support.wait import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 

browser = webdriver.Firefox() 
browser.get("http://someurl.com") 
table = WebDriverWait(browser,60).until(EC.presence_of_element_located((By.TAG_NAME, "table")))` 

變量瀏覽器只是webdriver.Firefox()類。

它有點長,但它所做的是等待一個特定的HTML標記存在於頁面上,超時時間爲60秒。

您可能正在體驗自己的time.sleep(),也會鎖定線程。儘量不要用睡覺來補償這樣的事情。