2015-08-24 69 views
1

我使用python和selenium來抓取一個完整的文本文件(如URL),然後使用請求來獲取這些txt文件。OSError:[Errno 24]太多打開的文件

我正在使用的代碼如下:

r = requests.get(link,cookies=cookies) 

    # Checking for a successful connection to the server. 
    if r.status_code == 200: 
     print("Downloading data for time %d, altitude %d" %(counter1, altitude)) 
     data = r.text # Extracting the text from the file online 
     file_name = os.path.join(path,fileName) 
     with open(file_name, 'w') as w: 
      w.write(data) 
     w.closed 


    # Closing browser 
    browser.close() 

有被下載約900多文件,但每250奇下載/ reqests之後,腳本錯誤

終止OSERROR。 [Errno 24]打開太多文件。

我已確認正在寫入的文件已關閉。硒同樣如此,每次下載文本文件後,chromedriver關閉,循環移至下一個URL。有沒有其他人遇到過這種情況,如果是的話,你做了什麼來解決它?

+0

你可以請發佈完整的追蹤,這將包括錯誤是從哪個行拋出? –

+0

這可能是一個愚蠢的問題,但是有沒有你不使用wget的原因? –

+0

@AnandSKumar:沒有回溯,這是我認爲系統拋出的錯誤,而不是python。 –

回答

2

感謝您的建議。

我剛剛意識到,browser.close()關閉窗口,但不退出chromedriver的實例。由於chromedriver的啓動是在提取數據文件的循環內,因此腳本不斷打開chromedriver的新實例,最終超過200個實例來重載我的內存。

對此的簡單修復是使用webdriver.quit(),它將完全退出webdriver的實例。

更好的是,不要在每次循環迭代開始時創建一個新實例,只需使用webdriver.get(URL),它會將當前實例重定向到目標URL。

+1

我在這裏參加聚會的時間已晚,但是Python模塊像''robobrowser''(基本上模仿Ruby的''mechanize'''可以填充表單,它們比''selenium''更快,更不容易出問題。「Selenium''確實只有當網站具有修改DOM的JavaScript(即OuterHTML,而不是源HTML)時纔是必需的。 – prooffreader

相關問題