微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么我的简单 selenium 脚本会随着时间的推移而变慢,我该如何提高效率?

如何解决为什么我的简单 selenium 脚本会随着时间的推移而变慢,我该如何提高效率?

此脚本将文本文件中的文本发送到本地网站,网站发回我复制到第二个文本文件中的 2 个值。输入文件很大但不是很大(50,000 多个字,256kb)。我知道向网站发送输入并等待回复一个缓慢的过程,但我不明白它是如何随着时间的推移而变慢的。该脚本以每秒大约 10 个输入开始,30 分钟后下降到大约每秒 2 个。几个小时后,它低于每秒 1。我尝试将列表分成 4 部分,并同时运行此脚本的 4 个实例,这使过程变得更快。

我用谷歌搜索了这个并测试了几个理论。一种是使用chrome而不是firefox。这似乎影响很小或没有影响。另一个理论是关于复杂的计算随着时间的推移变得越来越大,但我认为这不适用于我的脚本。我看了任务管理器,这个过程占用了 15% 的 cpu,几乎没有任何内存。我几乎不会称其为超载。

我的编码或方法是否有任何问题或低效会导致这种情况?我将如何提高脚本的性能

import requests
import selenium

# py -m hhtp.server in terminal from within index.html folder to start localhost

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# list opener

file1 = open("list.txt")
file2 = open("outputs.txt","w")

# load webpage

# driver = webdriver.Firefox()
driver = webdriver.Chrome("c:\\users\\desktop\\desktop\\test\\chrome driver\\chromedriver.exe")
driver.get("http://localhost:8000")

# click button and check Box

button = driver.find_element_by_id("button").click()
checkBox = driver.find_element_by_id("checkBox").click()

# run list through site

for line in file1:

    # enter text

    input_field = driver.find_element_by_id("input_field")
    input_field.clear()
    input_field.send_keys(line)
    input_field.send_keys(Keys.RETURN)

    # copy outputs

    output_text1 = driver.find_element_by_id("output_text1")
    output1 = output_text1.text

    output_text2 = driver.find_element_by_id("output_text2")
    output2 = output_text2.text

    file2.write(output1 + " " + output2 + "\n")

# close files

file1.close()
file2.close()

感谢您的建议。

解决方法

嘿,从提供的信息来看,我不认为网站速度变慢了,但是,我还注意到您在任务完成后并没有退出驱动程序。 简单使用

driver.quit()

在代码的末尾。我怀疑由于您没有退出驱动程序,它会不断积累内存并最终崩溃。

我还看到您导入了请求模块,但没有使用它。 您可以一起跳过 selenium 并使用它们抓取网站 这是一个可以帮助你的教程 https://devopscube.com/python-web-scraping/

,

我认为这是因为每次您将新文本连接/添加到 output.txt 的过去文本以写入 output.txt 时,每次从本地主机获取数据时,文本都会变大,其中turn 会导致您的内存慢慢地越来越多地使用,并且当您运行它数小时时,它会慢慢减慢您的应用程序的速度。 为了修复它,也许您可​​以尝试创建一个输出文件夹而不是 output.txt 并创建一个无限循环,每个 it 循环都会从您的站点获取结果并将其写入一个新的文本文件,例如“output1.txt”“output2.txt”。 txt”等使用循环变量来创建唯一的名称。这应该可以防止您的应用程序变慢,唯一的缺点是每个输出都在不同的文件中

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?