程序优化
对于原来的代码,尽管能够成功登录学校的网站,但依旧有很多地方可以优化。
模型加载较慢,python加载本地训练好的模型还是太慢了,并且要打包成exe文件的话,torch这个库太大了,不可能再用自己的模型来完成项目。所以这里可以再用到之前的验证码识别库ddddocr来代替自己的识别模型。
考虑到项目迁移的方便,每次都下载一个chromedriver.exe文件是比较麻烦的,禁用谷歌浏览器自动升级是个好的选择,但是有更好的替代方法。可以使用
webdriver-manager
这个库,它会自动下载对应的driver到缓存里。具体的使用方式是1
2
3
4from webdriver_manager.chrome import ChromeDriverManager
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])#忽略dirver的信息打印
driver = webdriver.Chrome(ChromeDriverManager().install(),options=options)#可以在缓存里下载最新的driver上面两个解决方式分别能够优化程序的运行速度和项目迁移性,但直接打包成.exe文件还是会产生其他的问题。
可执行文件优化
程序正常运行的情况下会在结束时关闭浏览器,除非我们在程序末尾sleep一个很长的时间等待。然而我们希望程序进程在打开浏览器后就可以退出,而不必等待我们将浏览器关闭。可以使用
options.add_experimental_option("detach", True)
,这个语句使程序结束后浏览器不会关闭,不需要程序一直等待。我们打包的文件会调用chromedriver.exe,尽管我们可以设置我们的可执行文件(.exe)运行时不出现cmd窗口,但chromedriver.exe依然会出现自己的窗口展示运行信息,而这会影响简结,我们希望这个窗口不出现。解决方法是修改selenium包中的service.py(selenium->webdriver->common->service.py)源码。如下图,注意数字必须相同。
最后的问题是,我们的程序自动退出了,因为不将浏览器关掉,所以chromedriver.exe这个进程会一直留在内存里。如果我们多次打开我们的.exe文件,就会有很多个chromedriver.exe进程,尽管占用的空间很小,我们也希望能在程序结束后终止掉这个进程,这并不会导致我们的网页关闭。
我们可以用
"taskkill /im chromedriver.exe /F"
这个命令来杀死这个进程,一种容易想到的方式是用os.system(command)来执行这条命令,但是这个方式会在执行时闪现出cmd执行窗口,不是我们希望的方式。更好的方式是使用python的另一个标准库subprocess的subprocess.call(command, creationflags=0x08000000)。因此就可以写成
1
subprocess.call("taskkill /im chromedriver.exe /F", creationflags=0x08000000)
以上就把代码优化完毕了,两个代码文件如下。
1 | #captcha_fast.py |
1 | #login_oc.py |
项目打包
最后进行项目的打包,我使用pyinstaller库来打包项目,用得比较习惯。首先在cmd窗口切换目录到python文件的目录,打包的命令为:
1 | pyinstaller -w -i icon.ico login_oc.py |
- -w表明取消程序执行的命令行窗口
- -i 表示添加打包文件的图标,后面的icon.ico就是我们使用的图标,要放在目录下,或者把路径写全。注意不能用其他后缀的图片,可以先去在线转换网站把图片转换成.ico格式,还需要注意的是,这个icon大小必须是16×16的。
- 最后想说这里不使用 -F 这个参数打包的原因。
- 我们希望程序响应快一些,-F会把所有的项目依赖的文件打包在一起,获得一个比较大的.exe文件,这会导致文件的加载速度变慢。而不用 -F 会导出一个文件夹,放置项目依赖的文件。
- ddddocr这个库在打包的过程中,没有被打包进去。因此不使用 -F 恰好能让我们手动把这个库添加到工作目录下(所有的库和我们的.exe文件都在这个文件夹中,还包括很多其他的.dll文件等)。
- 如果我们想做多个.exe文件登录不同的网站(我做了两个),程序使用的库基本都是一样的,仅仅是代码有一些修改,甚至只是url修改了以下。因此我们可以把多个.exe文件都放到一个工作目录下,共享这些项目依赖文件,这样就能很大地降低内存开销。
项目使用
在项目打包后,注意.exe文件不能移动到别的地方,要创建一个快捷方式,把这个快捷方式移动就可以在桌面或者其他地方使用了。
整个项目到此就结束了,有任何问题欢迎评论
