前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >来聊聊桌面图形界面的自动化和采集

来聊聊桌面图形界面的自动化和采集

作者头像
州的先生
发布2021-07-20 11:46:12
2.1K0
发布2021-07-20 11:46:12
举报
文章被收录于专栏:州的先生州的先生

如今的计算机软件形态,已被 Web 占据大半,基本上我们能使用到的产品,都能由一个网站来提供服务。

但是有一些需要消耗计算机硬件资源的软件,和限定桌面使用的软件,都还会继续提供桌面客户端而非 Web 应用。

对于这些桌面客户端软件,其实我们也会有自动化操作和数据采集的需求。

如何使用 Python 来对桌面客户端进行呢?州的先生结合实际的使用经验,介绍两个库供大家参考使用。

PyAutoGUI

大家应该都知道有个软件叫「按键精灵」,用来录制一些鼠标和键盘操作,然后进行自动操作的软件。

PyAutoGUI 其实也是类似的库。

PyAutoGUI 让我们通过 Python 脚本,控制计算机的鼠标和键盘,以达到自动和桌面客户端程序进行交互操作的目的

PyAutoGUI 支持在 Windows、Linux 和 macOS 上使用。除了支持计算机的鼠标和键盘控制之外,还能提供简易的弹出框,并且支持进行截图。

PyAutoGUI 的使用方法也是很直观和简洁。

在引入 PyAutoGUI 库之后:

代码语言:javascript
复制
  1. 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
复制
  1. pip install pywinauto

可以通过 PyWinAuto 初始启动一个程序:

代码语言:javascript
复制
  1. from pywinauto.application import Application
  2. app = Application(backend="uia").start('notepad.exe')

然后,就可以捕获程序的控件和结构了。

PyWinAuto 支持所谓的「魔法解析」,像 Python 字典一样对程序内的控件进行定位和访问。

比如,获取程序的主窗口:

代码语言:javascript
复制
  1. dlg = app['窗口名称']

然后获取程序主窗口内的控件:

代码语言:javascript
复制
  1. btn = dlg['Button1']

最后对控件进行操作:

代码语言:javascript
复制
  1. btn.click()

但是我们怎么知道程序内各个控件的结构呢?

一个方法可以使用控件的 print_control_identifiers() 方法或 dump_tree() 方法,输出控件下所有控件的信息。

另一个方法则是使用 PyWinAuto 推荐的几个第三方程序,比如:

  • Spy++;
  • Inspect.exe

先对程序的控件结构进行获取,再编写代码。

正如上面所说,并不是所有的控件都能被识别,当有些控件识别不了,就可以辅助键盘鼠标的控制来完成操作。

最后

上述两个库最主要的应用场景在于自动化操作,对数据采集的功能很弱。

如果客户端提供了报表下载或导出功能,则可以先用这两个库自动化把文件导出到本地,再用另外的 Python 代码对文件数据进行读取、解析和存储。

州的先生之前对「旺店通」桌面客户端进行的「旺店通订单数据分析平台」即是使用这种处理方式进行数据的获取(旺店通是一个聚合的ERP平台,里面可以由商家对接多个电商平台,然后进行订单处理。算是一个风险极低的获取自己订单数据的渠道)。

如果数据不能通过导出获取,那么一个方式是通过 PyWinAuto 中的控件属性进行数据的提取;另一个方式,则是抓包了。

关于抓包,此是后话。

关于桌面客户端程序的自动化,你还有什么心得和经验?欢迎留言讨论!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-07-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 州的先生 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PyAutoGUI
  • PyWinAuto
  • 最后
相关产品与服务
腾讯云 BI
腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档