【问题标题】:OSError: [Errno 24] Too many open filesOSError: [Errno 24] 打开的文件太多
【发布时间】:2015-08-24 04:13:14
【问题描述】:

我正在使用 python 和 selenium 来抓取一个充满文本文件(作为 URL)的网站,然后使用请求来获取这些 txt 文件。

我使用的代码如下:

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 个奇怪的下载/请求后,脚本会因错误而终止

操作系统错误。 [Errno 24] 打开的文件太多。

我已确保正在写入的文件已关闭。 selenium 也是如此,在下载每个文本文件后,chromedriver 关闭,并且循环移动到下一个 URL。有没有其他人遇到过这种情况,如果有,您是如何解决的?

【问题讨论】:

  • 能否请您发布完整的回溯,其中包括错误是从哪一行引发的?
  • 这可能是一个愚蠢的问题,但你不使用 wget 有什么原因吗?
  • @AnandSKumar:没有回溯,我认为是系统抛出的错误,而不是python。
  • @PhilCairns 在网站上填写表格并单击按钮(更新数据)后获得生成的文本文件。因此 wget 将不起作用,因此 selenium。

标签: python selenium screen-scraping selenium-chromedriver


【解决方案1】:

感谢您的建议。

我刚刚意识到 browser.close() 会关闭窗口但不会退出 chromedriver 的实例。由于 chromedriver 的初始化是在提取数据文件的循环中,脚本不断打开 chromedriver 的新实例,最终使我的内存超载了 200 多个实例。

解决这个问题的简单方法是使用 webdriver.quit(),它将完全退出 webdriver 的实例。

更好的是,不是在每次循环迭代开始时创建一个新实例,而是在循环结束时使用 webdriver.get(URL),它将当前实例重定向到目标 URL。

【讨论】:

  • 我在这里聚会迟到了,但是像robobrowser 这样的Python 模块(基本上是Ruby 的mechanize 的模仿者)可以填写表格,而且它们比@987654323 更快,更不容易出现问题@.Selenium 仅在站点具有修改 DOM 的 JavaScript(即 OuterHTML,而不是源 HTML)时才真正需要。
猜你喜欢
  • 2020-03-07
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2018-08-12
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
相关资源
最近更新 更多