【问题标题】:Leaking memory when using Selenium webdriver in a for loop在 for 循环中使用 Selenium webdriver 时内存泄漏
【发布时间】:2020-03-26 17:24:56
【问题描述】:

我正在一个 EC2 实例 (ubuntu) 上运行一个使用 Selenium 的 Python 脚本。

根据我的 AWS 计划,我有 2 GB 内存。在我的脚本出现一些性能问题后,我从免费版本升级到此版本。但是,当我在连接到 Ubuntu 服务器时检查可用内存时,我只看到 348MB 的可用内存和 353MB 的可用内存!

到目前为止,我只使用 crontab 运行两个 Python 脚本,每天一次。这些脚本会运行相当长的 URL 数组,并从每个 URL 中获取信息。

base_url = 'https://www.bandsintown.com/en/c/san-francisco-ca?page='

events = []
eventContainerBucket = []

for i in range(1,25):

    #cycle through pages in range
    driver.get(base_url + str(i))
    pageURL = base_url + str(i)
    
    # get events links
    event_list = driver.find_elements_by_css_selector('div[class^=_3buUBPWBhUz9KBQqgXm-gf] a[class^=_3UX9sLQPbNUbfbaigy35li]')
    # collect href attribute of events in even_list
    events.extend(list(event.get_attribute("href") for event in event_list))



    allEvents = []
    for event in events:
    
        driver.get(event)
        //do a bunch of other stuff

    driver.quit()

此代码中是否存在会导致内存泄漏的固有问题?我认为当脚本停止运行时,可用内存应该会再次增加,但事实并非如此。

我尝试在 for 循环中调用 driver.close(),以便在从每个 URL 检索到信息后,窗口关闭。我认为这将有助于解决内存泄漏 - 不幸的是,这给了我一个错误 selenium.common.exceptions.InvalidSessionIdException: Message: invalid session id

我是在使用 driver.close() 的正确道路上还是完全是其他问题?

【问题讨论】:

标签: python selenium amazon-ec2 selenium-chromedriver ubuntu-14.04


【解决方案1】:

你试过driver.close()而不是驱动退出吗?

close() - 用于关闭浏览器

quite() - 用于关闭网络驱动实例。

for i in range(1,25):

    #cycle through pages in range
    driver.get(base_url + str(i))
    pageURL = base_url + str(i)

    # get events links
    event_list = driver.find_elements_by_css_selector('div[class^=_3buUBPWBhUz9KBQqgXm-gf] a[class^=_3UX9sLQPbNUbfbaigy35li]')
    # collect href attribute of events in even_list
    events.extend(list(event.get_attribute("href") for event in event_list))

    allEvents = []
    for event in events:
        driver.get(event)

    driver.close()

我已经检查了您的代码,它工作正常,没有任何问题。请在下面的屏幕截图中找到更多详细信息

【讨论】:

  • 谢谢摇滚。如果我不使用 driver.quit(),webdriver 会话不会仍在运行,因此会消耗内存吗?我不确定我是否看到 driver.close() 会更可取。
  • 我想我明白你得到了什么。在循环中使用 driver.close() 似乎运气更好,因此每个浏览器窗口在每次迭代后都会关闭。这意味着我必须在循环中定义驱动程序,而不是在外部。然后,我可以在循环外调用 driver.quit()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
相关资源
最近更新 更多