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程序更加复杂,提供的工具也更加少,因此难度较大。

Wind数据个性化定制抓取相关推荐

  1. JAVA+网络数据包的抓取与分析实验

    一.实验目的 熟悉TC P/IP数据包的结构. 掌握Wireshark的使用方法. 能够利用JNet Pcap编程实现数据包的抓取与分析. 二.实验准备 1.通过抓包,可以进行网络故障分析.流量监控. ...

  2. 穿越火线数据包的抓取和分析及服务器欺骗的实现

    几天功夫,我们敬爱的穿越火线从2.5到2.6再到2.7再到现在的2.8,号称全服反外挂(的确是反了的),WPE会被检测为非法模块. 本人就来说一下自己关于穿越火线数据包的抓取和分析及服务器欺骗的实现的 ...

  3. python如何爬虫股票数据_如何抓取股票数据_用Python抓取新浪的股票数据

    python爬虫成长之路(一)抓取证券之星的股票数据 其中编译匹配模式findall方法使用这个匹配模式来匹配所需的信息并以列表的形式返回.正则表达式的语法非常多.下面我只列出使用的符号的含义.匹配除 ...

  4. python抓取数据库数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储...

    Python爬虫可以说是好玩又好用了.现想利用Python爬取网页股票数据保存到本地csv数据文件中,同时想把股票数据保存到MySQL数据库中.需求有了,剩下的就是实现了. 在开始之前,保证已经安装好 ...

  5. python爬虫爬取股票软件数据_Python爬虫抓取东方财富网股票数据并实现MySQL数据库存储(转载)...

    完整代码 实际上,整个事情完成了两个相对独立的过程:1.爬虫获取网页股票数据并保存到本地文件:2.将本地文件数据储存到MySQL数据库.并没有直接的考虑把从网页上抓取到的数据实时(或者通过一个临时文件 ...

  6. python爬虫抓取动态网页数据_python网络爬虫抓取ajax动态网页数据:以抓取KFC门店地址为例...

    一,尝试用BeautifulSoup抓取 先打开KFC网站门店列表页面:http://www.kfc.com.cn/kfccda/storelist/index.aspx 可以看到门店列表如下图: 打 ...

  7. 微信小程序数据包教程抓取,看完就是学会

    有很多粉丝小伙伴问到能不能抓取到微信小程序数据呢?答案当然是肯定的,通过Fiddler或者Charles这些主流的抓包工具都可以抓得到,在IOS平台抓取微信小程序和https请求都是一样的设置,接下来 ...

  8. python爬取分页数据_爬虫抓取分页数据的简单实现

    昨天,我们已经利用Jsoup技术实现了一个简单的爬虫,原理很简单,主要是要先分析页面,拿到条件,然后就去匹配url,采用dome解析的方式循环抓取我们需要的数据,从而即可轻松实现一个简单的爬虫.那么, ...

  9. linux 抓取 组播数据,tcpdump指令抓取组播数据

    指令 tcpdump -i  eth0 port 8080 :  通过网口th0抓取端口号为8080的广播或组播数据: 如下: 18:08:47.459709 IP ralink.ralinktech ...

最新文章

  1. 广东生态所孙蔚旻团队EST发表尾矿微生态调查两部曲
  2. ssh架构之hibernate(一)简单使用hibernate完成CRUD
  3. 【解决方法】Panda read_csv()把第一行的数据变成了列名,怎么处理
  4. 路径规划算法之Bellman-Ford算法
  5. python抢票_50 个加速包都抢不到车票,还不如这个 Python 抢票神器!
  6. Dialog源码分析
  7. 旅行场景下的个性化营销平台揭秘
  8. PostMessage()
  9. Python 不定长参数 *argc/**kargcs - Python零基础入门教程
  10. 测试开发——搭建一个简单 web服务(flask框架基础)项目实战
  11. 售价超16万,全球仅限8台!iPhone 13 Pro冬奥会定制版上架,18K黄金打造
  12. 【算法】八大排序算法的时间复杂度 表格
  13. [RMAN]表空间的恢复
  14. Java通过JNI调用C++的DLL库
  15. Android初学第9天
  16. 两个鸡蛋100层楼(DP)
  17. win7桌面不显示我的计算机名,win7系统桌面没有显示我的电脑图标的操作技巧
  18. android 代码控制TextView的字体加粗
  19. 大写字母转小写(及scanf中的间隔符号的影响)
  20. 备考CSP刷题经验总结

热门文章

  1. matlab没有关联m文件,matlab 不关联m文件的解决方法
  2. 纯css实现文字跳动的动画效果
  3. 井字棋游戏(电脑先)
  4. 【系统分析师之路】2011年系统分析师下午案例分析真题
  5. ASCII 与 UNICODE 字符映射表
  6. ren域名有价值吗?值不值得投资?ren域名的应用范围有哪些?
  7. 接口测试——postman文件夹介绍以及批量执行用例
  8. ftdi utilities
  9. Centos7 网卡做 bond 以及 team
  10. 图像生成 - 使用BigGAN在Imagenet数据集上生成高质量图像。