如今的计算机软件形态,已被 Web 占据大半,基本上我们能使用到的产品,都能由一个网站来提供服务。
但是有一些需要消耗计算机硬件资源的软件,和限定桌面使用的软件,都还会继续提供桌面客户端而非 Web 应用。
对于这些桌面客户端软件,其实我们也会有自动化操作和数据采集的需求。
如何使用 Python 来对桌面客户端进行呢?州的先生结合实际的使用经验,介绍两个库供大家参考使用。
PyAutoGUI
大家应该都知道有个软件叫「按键精灵」,用来录制一些鼠标和键盘操作,然后进行自动操作的软件。
PyAutoGUI 其实也是类似的库。
PyAutoGUI 让我们通过 Python 脚本,控制计算机的鼠标和键盘,以达到自动和桌面客户端程序进行交互操作的目的。
PyAutoGUI 支持在 Windows、Linux 和 macOS 上使用。除了支持计算机的鼠标和键盘控制之外,还能提供简易的弹出框,并且支持进行截图。
PyAutoGUI 的使用方法也是很直观和简洁。
在引入 PyAutoGUI 库之后:
代码语言:javascript复制
import pyautogui
通过 pyautogui.size() 获取屏幕的高度和宽度;
通过 pyautogui.position() 获取鼠标在屏幕上的坐标;
通过 pyautogui.moveTo(x, y) 移动鼠标到指定的坐标;
通过 pyautogui.click() 操纵鼠标单击;
通过 pyautogui.click(x, y) 操纵鼠标单击指定的坐标位置;
通过 pyautogui.doubleClick() 操纵鼠标双击;
通过 pyautogui.write() 执行键盘键的输入;
通过 pyautogui.press(‘xxx’) 按下指定的键名;
通过 pyautogui.keyDown(‘xxx’) 按住指定的键名;
通过 pyautogui.hotkey(‘xxx’, ‘xxx’) 执行热键操作;
通过 pyautogui.keyUp(‘xxx’) 松开指定的键名;
基本上,这些操作已经包含了我们日常在计算机上使用的全部操作了。
我们可以借助 PyAutoGUI 的鼠标键盘控制功能,完成大部分的计算机操作。
不足的地方在于,PyAutoGUI 只能机械地对鼠标键盘进行操作,而不能识别或分析程序或计算机桌面的情况,也不能获取程序内的所有内容。
如果桌面的操作出现了意外的情况,比如弹出了一个小广告、操作超时、软件更新提醒等等。
就会导致接下来的操作走向不可控的局面。
PyWinAuto
而 PyWinAuto 就要好很多。
PyWinAuto 是一组用于自动化Microsoft Windows GUI的python模块,所以 PyWinAuto 只能用于 Windows 环境下的桌面客户端程序。
PyWinAuto 通过「Win32 API」和「MS UI Automation」来识别、判断和获取程序的属性,并依赖上述两种技术实现对程序控件的控制。
同时,PyWinAuto 也提供了键盘和鼠标的控制操作,在某些控件无法进行操作的情况下,可以继续借助鼠标键盘来完成操作。
相较于 PyAutoGui 的简便操作,PyWinAuto 的使用则稍显复杂。
在安装好 pywinauto 之后:
代码语言:javascript复制
pip install pywinauto
可以通过 PyWinAuto 初始启动一个程序:
代码语言:javascript复制
from pywinauto.application import
Application
app =
Application(backend="uia").start('notepad.exe')
然后,就可以捕获程序的控件和结构了。
PyWinAuto 支持所谓的「魔法解析」,像 Python 字典一样对程序内的控件进行定位和访问。
比如,获取程序的主窗口:
代码语言:javascript复制
dlg = app['窗口名称']
然后获取程序主窗口内的控件:
代码语言:javascript复制
btn = dlg['Button1']
最后对控件进行操作:
代码语言:javascript复制
btn.click()
但是我们怎么知道程序内各个控件的结构呢?
一个方法可以使用控件的 print_control_identifiers() 方法或 dump_tree() 方法,输出控件下所有控件的信息。
另一个方法则是使用 PyWinAuto 推荐的几个第三方程序,比如:
- Spy ;
- Inspect.exe
先对程序的控件结构进行获取,再编写代码。
正如上面所说,并不是所有的控件都能被识别,当有些控件识别不了,就可以辅助键盘鼠标的控制来完成操作。
最后
上述两个库最主要的应用场景在于自动化操作,对数据采集的功能很弱。
如果客户端提供了报表下载或导出功能,则可以先用这两个库自动化把文件导出到本地,再用另外的 Python 代码对文件数据进行读取、解析和存储。
州的先生之前对「旺店通」桌面客户端进行的「旺店通订单数据分析平台」即是使用这种处理方式进行数据的获取(旺店通是一个聚合的ERP平台,里面可以由商家对接多个电商平台,然后进行订单处理。算是一个风险极低的获取自己订单数据的渠道)。
如果数据不能通过导出获取,那么一个方式是通过 PyWinAuto 中的控件属性进行数据的提取;另一个方式,则是抓包了。
关于抓包,此是后话。
关于桌面客户端程序的自动化,你还有什么心得和经验?欢迎留言讨论!