本文基于华为商城的抢单工具,讲解一下python3.9的selenium webdriver使用,网上也有相关的资料,但在自己动手做的过程中还是遇到了一些波折,想拿出来跟大家一起分享。开篇先放个图:
主要从三个大方面说明:开发环境搭建、工程打包、过程中所遇问题整理
话不多说,从头开捋:
一、开发环境搭建
1、 git代码clone:
假设clone后的工程路径为:D:\WorkSpace\MyPython\huawei_seckill,以下基于此路径展开说明,当前工程面向win10的64位(win7兼容处理后续有说明),代码地址:
https://gitee.com/lykiao/huawei_seckill.git
2、 工程文件夹为外层的huawei_seckill,其中入口文件为【huawei_seckill.py】,实际主代码文件为【huawei_seckill_module.py】,包了一层的原因是对主代码进行了加密用,后续会一一讲解。
3、 创建虚拟环境:
Ide(PyCharm)的命令行或cmd,cd到工程文件夹,执行命令python -m venv venv39,生成虚拟环境。
注:因为使用的python版本为3.9版,为了便于识别,所以起名为venv39(不强求,可随意起)。强烈推荐使用虚拟环境,因为工程不同,考虑兼容性,各库的使用版本就会不同,如果全部使用全局环境,切换工程时会遇到各种意想不到的问题。
如果创建成功,则会在工程文件夹下生成虚拟环境venv39:
4、 激活虚拟环境:
同步骤3,cd到工程文件夹,执行命令.\venv39\Scripts\activate,行首显示(venv39)则表示已成功激活虚拟环境,后续的所有操作都是在此虚拟环境下进行的。
5、 在虚拟环境下安装工程的依赖库:
目前均已导入到【requirements.txt】中,执行命令pip install -r requirements.txt进行安装即可。
注:如果工程中依赖库有所变动,在虚拟环境下执行命令pip freeze > requirements.txt可再次导出。
6、 浏览器驱动安装:
谷歌Chrome浏览器驱动:
http://chromedriver.storage.googleapis.com/index.html?path=114.0.5735.90/
火狐浏览器驱动:
https://github.com/mozilla/geckodriver/releases/
其他浏览器参照以下:
https://blog.csdn.net/catch_dreamer/article/details/109359208
下载解压后的exe【chromedriver.exe】放到虚拟环境中python.exe的同级目录下:D:\WorkSpace\MyPython\ huawei_seckill\venv39\Scripts
放入后一定要关闭PyCharm,再重启,否则直接运行会找不到driver,火狐【geckodriver.exe】就曾报错:WARNING: Exception trying to discover geckodriver version: error sending…
注意,以上为开发环境的处理方式,打包后火狐浏览器还是报错:ERROR: Message: Unable to obtain driver for firefox using Selenium Manager.; For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors/driver_location
直接将火狐驱动【geckodriver.exe】放到huawei_seckill.exe同级文件夹中即可,谷歌浏览器驱动不需要,但保险起见,也一起放进来。后来发现没有安装火狐的机器这样也会报错。此处问题较多,可多试几次。
7、 开发环境中启动:
PyCharm中,右键入口文件,点选Run,或者点击上方三角符号即可启动:
注意:如果虚拟环境指定不正确,可通过以下方式调整
打开工程的配置:
检查下拉中是否有本工程创建的venv39,如果有,直接选择ok即可。我的目前就没有,所以上图报了一片红。
没有的情况,需要按以下方式添加:
上面步骤3我们已经手动生成了虚拟环境,选择Existing(存在),会自动指定到工程目录下的venv39:
如果不存在,选择New(新建),应该类似于步骤3的手动创建动作,我没试过,主要习惯了用命令行,之前PyCharm貌似也没有这个功能吧,有兴趣的朋友可以试一下。
点击OK,返回上一页面,可以看到已指定好虚拟环境,再点击OK即可:
就会发现刚才的红色都消失了。小插曲到此结束,回到刚才的启动话题,发现也能正常启动了。
如果启动时报缺少文件的错误,请稳步二的步骤6中查看。
二、工程打包
以上到运行成功为止,说明开发环境已调试通过,接下来说一下打包。
打包也有很多方式,网上资料很多,复杂的没尝试过,孰好孰坏不能妄加评判,如有需要可自行去搜索看看,目前使用的是比较大众的pyinstaller库。
1、 此种方式有单文件打包和多文件打包两种方式:
单文件打包:
在工程文件夹下执行命令:pyinstaller --icon=huawei_seckill.ico --version-file file_version_info.txt --key password -F -w huawei_seckill.py
注:由于单文件打包后,启动太慢,固使用了多文件打包方式。
多文件打包:
在工程文件夹下执行命令:pyinstaller --icon=huawei_seckill.ico --version-file file_version_info.txt --key password -D -w huawei_seckill.py
注:两种方式的命令只差在-F和-D上,password为打包时的加密密码,貌似极容易破解,可不用。如果打包报错,删除build和dist文件夹后重新打几次,直到成功为止。
关于加密设置,需要在工程文件夹中执行命令:pip install pycrypto来安装pycrypto库,由于会报以下错误,就没放到requirements.txt中一起安装,下面是我解决错误的方式:
从【C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include】复制【stdint.h】到
安装时报错路径【C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt】下,并且修改该目录下【inttypes.h】中的
【#include <stdint.h>】为【#include “stdint.h”】,然后重新进行安装即可。
另外,打包指定—key参数时还需要安装:pip install tinyaes,已在requirements.txt中包含,无需手动安装。指定的密码在使用pyinstxtractor解压后是可以看到的,形同虚设,所以推荐用下面的pyd混淆方式加密。
2、 由于使用了ddddocr库,如果打包后运行报错:onnxruntimeerror no_suchfile,可进行如下处理
以上打包会在工程文件夹下生成huawei_seckill.spec文件,编辑器打开进行以下编辑:
datas = [ ]改为:
datas = [
(‘./venv3/Lib/site-packages/onnxruntime/capi/onnxruntime_providers_shared.dll’,‘onnxruntime\capi’),(‘./venv3/Lib/site-packages/ddddocr/common.onnx’,‘ddddocr’),(‘./venv3/Lib/site-packages/ddddocr/common_old.onnx’,‘ddddocr’)
]
3、 如果打包后exe的icon图标不显示,也需要对huawei_seckill.spec文件进行编辑:
pyz = PYZ(a.pure, a.zipped_data, cipher=block_cipher)行以下添加以下代码:
#// 添加exe图标显示
a.datas += [(‘huawei_seckill.ico’, ‘huawei_seckill.ico’, ‘Data’)]
如图:
4、 以上huawei_seckill.spec文件修改后,需要重新打包,将build和dist文件夹删除,现在在工程文件夹下执行以下打包命令即可:
pyinstaller huawei_seckill.spec
5、 预防反编译处理:
以上为未进行防止反编译时的打包方式,如果对以上打包生成的exe进行反编译,比如使用以下的pyinstxtractor工程,会生成.pyc文件,再进一步还原出py文件,源代码可谓是一览无余,有兴趣的可以去试试:https://github.com/extremecoders-re/pyinstxtractor
为了尽量的防止代码泄露,可使用Cython库对代码进行pyd混淆加密,过程需要用到build_pyd.py文件,在工程文件夹中已添加。只需要在工程文件夹下执行命令:
python build_pyd.py build_ext –inplace
会将要加密的文件生成相应的pyd文件:
huawei_seckill_module.cp38-win_amd64.pyd => huawei_seckill_module.pyd
lock.cp38-win_amd64.pyd => lock.pyd
order_logger.cp38-win_amd64.pyd => order_logger.pyd
然后,按以上方式手动改名为右侧的名字(同.py原文件名)。
至此,再回到步骤4中,重新执行打包命令:pyinstaller huawei_seckill.spec即可。
在此说明一下,因为生成的pyd文件不能直接执行,需要被调用,所以才会出现开篇说的将主代码文件【huawei_seckill_module.py】剥离出来,用入口文件【huawei_seckill.py】调用(入口文件相对简单,不加密也无所谓)。
还有一点一定要注意,因为py和pyd同时存在时,会优先引入pyd文件,所以经过以上混淆和改名后,打包使用的肯定是pyd文件,如果回头再进行开发调试时,一定不要忘记把pyd文件删除,否则不管怎么改py文件都无法看到效果的,因为pyd文件被优先执行了,这对我一小白来说是血的教训!
6、 打包后整理:
在工程文件夹中,还有一个文件夹huaweiTool,因为使用的是多文件打包方式,从一堆文件里找到exe,还需要ini等各种文件,对用户来说显得太繁琐,所以此文件夹主要是面向用户使用的。当然,开发环境运行时也需要从此文件夹复制相应的文件使用。
a)、开发运行时:
将D:\WorkSpace\MyPython\huawei_seckill\huaweiTool\huawei_seckill中的文件复制到工程文件夹下(D:\WorkSpace\MyPython\huawei_seckill)
b)、打包运行后运行时:
将打包后D:\WorkSpace\MyPython\huawei_seckill\dist\huawei_seckill中的文件复制到D:\WorkSpace\MyPython\huawei_seckill\huaweiTool\huawei_seckill中,然后双击执行D:\WorkSpace\MyPython\huawei_seckill\huaweiTool\addShotcut.bat文件,即可对所有快捷方式进行更新,此后的操作只需要在huaweiTool文件夹中进行。修改【config.ini】和【order.ini】文件后,点击【huawei_seckill.exe】即可启动了。
注:check_env.bat可能不需要,暂且无视。可能windows的defender会报病毒,可稳步【addDefenderExclusion】文件夹中执行相关bat,添加信任文件夹来解决。
三、过程中所遇问题整理
1、Pillow库报错:
使用时发现报错:
File “D:\WorkSpace\MyPython\huawei_seckill\venv39\lib\site-packages\ddddocr_init_.py”, line 1614, in classification
image = image.resize((int(image.size[0] * (64 / image.size[1])), 64), Image.ANTIALIAS).convert(‘L’)
AttributeError: module ‘PIL.Image’ has no attribute ‘ANTIALIAS’
控制台中pip list查看Pillow的版本为10.0.0,可能是最新版与ocr中的版本冲突,可修改ocr,也可降级Pillow,参照链接:https://blog.csdn.net/light2081/article/details/131517132
本工程已做降级处理,使用requirements.txt中的9.5.0即可
2、启动成功,但chromedriver弹窗报错:handshake failed; returned -1, SSL error code 1, net_error -200
添加options参数,参照:
https://www.fyovo.com/6681.html
本工程代码已添加。
3、打包后,chromedriver会显示黑色弹窗,需要如下非表示处理:
修改【D:\WorkSpace\MyPython\huawei_seckill\venv39\Lib\site-packages\selenium\webdriver\common\service.py】
添加:from subprocess import CREATE_NO_WINDOW
找到:_start_process方法,修改【creationflags=self.creation_flags】为:creationflags=CREATE_NO_WINDOW,无creationflags时添加即可
注意,此项是对安装库的代码进行修改,所以本工程代码中无法处理,需要自行手动修改后再打包。
4、一定不要忘了把浏览器驱动【chromedriver.exe、geckodriver.exe】放到【D:\WorkSpace\MyPython\ huawei_seckill \venv39\Scripts】中再打包,否则启动报错。
5、如果开发环境中运行报win32api相关的错误,请将PyCharm重启一次再运行。
6、如果想同时兼容win7的64位,需要将python降至3.8.10版,此为兼容win7的最后一版python3(虽然还存在3.8.17,但已不提供installer文件了,只有源码)。
附3.8.10版的下载地址:
https://www.python.org/downloads/release/python-3810/
7、win7中报onnxruntime库相关的错,目前使用的是1.16.0版,需要对其进行手动降至1.14.0版即可解决:
参照方案:https://github.com/microsoft/onnxruntime/issues/16116
执行命令:
pip uninstall onnxruntime
pip install onnxruntime==1.14.0文章来源:https://www.toymoban.com/news/detail-845832.html
原创不易,您的关注和点赞就是我前进的动力~文章来源地址https://www.toymoban.com/news/detail-845832.html
到了这里,关于基于华为商城的抢单工具python3.9的selenium webdriver使用及打包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!