Wind数据个性化定制抓取

1.前言

Wind(万德)金融终端是我校同学常用的商业软件,其中提供了大量的金融实施数据,丰富而翔实。Wind几乎是我见过的付费商业软件中用户体验最好的之一,然而正是由于其昂贵的价格,使得其保密性非常高,不容易获取其中的数据。Wind官方为我们提供了api接口,但这些接口还不能满足我们更加个性化的数据要求。

同时Wind作为PC客户端程序,抓取其中的数据并不能像在浏览器中那样方便。对于浏览器中的数据,可以用大家非常熟悉的传统爬虫来解决。然而对于这种PC程序中的数据,抓取就需要其他的办法。

如需按本文操作进行实验,建议准备一块额外的外接屏幕。

2.问题描述

这里我们的目标问题是爬取wind终端中的研报数据。wind账号异常昂贵,这里我们只好想象自己真的有一个Wind账号。
在这里插入图片描述
我们的目标主要是爬取每条研报中的一些具体数据,如研报撰稿人、发布时间,180天内被评测次数和EPS值(见下图红框),并写入csv文件。
在这里插入图片描述

3.分析页面

众所周知,浏览器中的数据是以HTML的形式展现的,通过爬虫,辅之以正则表达式、xpath等工具可以轻松拿到我们需要的数据。实际上,很多Windows程序中也有类似HTML页面的结构,只不过大部分Windows程序是不提供检查功能的。我们可以使用Windows SDK提供的inspector来检查程序中的元素。下图为一个实例,可以看出右图中wind列表项在左侧树状结构中的位置。
在这里插入图片描述
值得注意的是,一个Windows程序的页面结构也可以足够复杂,经过我的计算,wind首页中的所有页面节点个数加起来有将近一千个。

一旦我们了解了Windows程序的页面结构 ,从理论上来说,就一定能够有办法批量获取页面上的数据。接下来的工作就只剩下找合适的工具,以及枯燥的编程工作了。

4.选择工具

这里我们选择的是uiautomation,一款Windows自动化测试工具。这款工具大家可能比较陌生,但说到selenium,大家就很熟悉了。selenium是针对于网站测试的自动化测试工具,同时像我这种爬虫渣渣,通常会用selenium来爬取页面信息。automation也是类似的原理,且不仅局限于web网站,也可以自动化测试WindowsPC程序。uiautomation支持了多种语言,本文中我们使用基于python的uiautomation框架,此外大家可以自行尝试java等其他语言的uiautomation。

python版本的uiautomation 的GitHub链接在此:https://github.com/yinkaisheng/Python-UIAutomation-for-Windows/blob/master/readme_cn.md

首先需要安装

pip install uiautomation

5.使用uiautomation选定wind窗口

下面我们需要选定wind窗口,才能进行后续操作。根据下图所示,我们不难发现,wind窗口有一个专属的classname,我们可以通过这个classname进行选定。根据uiautomation作者的习惯,通常import uiautomation as auto,我们在以下代码中也遵守这一习惯。
在这里插入图片描述

import uiautomation as auto
wind = auto.WindowControl(searchDepth=1, ClassName="TMasterForm")

这里的searchDepth参数表示搜索深度,整个Windows界面以桌面为根节点,即深度为0,而桌面中的所有窗口深度为1。

>>> wind.Name
'Wind金融终端..Everest'

此时可以显示窗口名称,则说明我们已经成功定位到该窗口。

6.获取研报列表

我们在inspector中选定一个列表项,可以发现这些列表项的父元素是一个DataItemControl。对于wind这种软件来说,其中大部分元素都是自定义元素,即CustomControl,Windows提供的元素并不多,所以可以通过DataItemControl来查找。
在这里插入图片描述
首先我们先获取研报平台这个子窗口中的内容,即下图所示。
在这里插入图片描述

yanbaoWindow = wind.WindowControl(ClassName='TfrmMyIEPageContainer')

接下来我们通过查找这个子窗口中的DataItemControl,就可以找到列表项的父元素。

    table = yanbaoWindow.DataItemControl(foundIndex=3)

经过统计,所需的元素是研报平台窗口中的第三个DataItemControl,因此指定参数foundIndex = 3,一般来说,PC程序中的每个页面结构都是比较稳定的,因此可以通过指定为第三个来找到。
接下来,根据inspector显示的结构关系,我们可以获取并打印这些研报名称:

lines = table.GetChildren()
for line in lines:
    c = line.GetChildren()[0]
    name = c.GetChildren()[2]
    analyst = c.GetChildren()[3]
    print(name.Name, analyst.Name)

其中这个name对应了页面上研报的名称。

接下来我们要获取研报详情页中的信息,此时应该模拟鼠标点击操作。方法也非常简单。

name.Click()

即可。值得注意的是,uiautomation中的方法命名几乎采取了类似C#的风格,所有的方法名都是大驼峰命名,非常诡异。执行Click方法之后,即进入详情页。

需要注意的是,由于uiautomation并不是类似于selenium通过browserdriver来驱动操控浏览器进行操作的,即对于uiautomation来说,并不存在appdriver,因此在执行模拟操作的时候,必须保证要点击的对象在屏幕上可见范围内,从而基于位置进行操作,否则将会抛出异常。此时鼠标将被控制,真的去点击目标,用户尽量不要使用鼠标。

7.退出详情页

进入详情页后,我们可以用类似的方法抓取我们需要的各个数据,这里不再赘述,抓取结束后,应该关闭详情页来返回列表页。我们注意到可以使用Ctrl+W的快捷键,因此可以模拟使用快捷键关闭详情页面。

auto,SendKeys("{Ctrl}w")

8.效果图

在这里插入图片描述
效果图中的操作均由程序操控完成。

9.总结

总结来看,本次实战中,我们找到了传统爬虫和Windows程序的一些共同之处。HTML页面和Windows程序都有类似的树状页面结构,因而都可以通过一些手段获取到其中元素。相比起来,Windows程序更加复杂,提供的工具也更加少,因此难度较大。

  • 4
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值