用Embedded Web Browser与MSHTML实现计算机代替人操作网页

首先声明,这是一个已经实现的软件,但是这里我尽量避免讲技术细节,只写基本思路,希望对相关工作有兴趣的朋友见仁见智,欢迎拍砖。

简单说明一下,Embedded Web Browser(简称EmbeddedWB)是Delphi的一个第三方浏览器插件,可以在Delphi程序中嵌入一个IE内核浏览器,并且可以通过编程实现对网页的各种操作;MSHTML是微软的……具体是一个什么东西我也说不清楚,总是它是IE解析网页的一个核心的东西,里面定义了代表网页中各种元素的大量接口,例如IHTMLDocument2代表整个网页文档,IHTMLElement代表网页上一个元素,等等。

问题一:这两者有什么关系呢?

还是用通俗的说法,比方说我用定义了一个EmbeddedWB类型的叫browser的浏览器对象,然后就可以通过browser.Doc2.activeElement()方法获得浏览器打开的网页中的一个活动元素,这个活动元素的类型就是定义在MSHTML中的IHTMLElement。

也就是说,EmbeddedWB通过定义在MSHTML中的元素类型,对网页元素进行各种操作。

################华丽的分割线,下面才是正文↖(^ω^)↗##########################################

我们现在有了可以编程的浏览器,有了可以表示网页元素的接口,下面我们就希望这个浏览器可以记录人对网页的操作,然后可以无限次的把这一系列操作还原到网页上去。人对网页的操作,实际上就是对网页上各个元素的一系列操作的组合。“操作”的种类基本是固定的,无非是点击、输入、选择之类的,可以直接对元素调用MSHTML中定义好的方法实现;问题在于如何记录和找到一张网页中需要操作的“元素”。

问题二:要在网页中唯一确定一个元素,需要这个元素的哪些信息?

一开始为了满足通用性,我们采用元素tagName在当前网页所有与之同tagName的元素集中的序号结合的方式来定位网页元素。因为任何一个元素实际上都是一个html标签,都有tagName,例如<html>、<body>、<a>、<input>等等。然而在实际应用中发现,由于目前的网页以动态网页居多,这些网页在每次打开时,其中的元素相对位置可能会动态地产生一些偏差。于是为了增加准确度,我们结合了元素中的id、name等属性,以及元素完整的html代码,最后根据如下信息定位网页元素:

1、元素id属性值

2、元素name属性值

3、元素html代码在当前网页所有与之同html代码的元素集中的序号

4、元素tagName在当前网页所有与之同tagName的元素集中的序号

软件依次根据以上信息在网页中寻找指定元素,找到为止。

具体在实现的时候,还需要考虑到网页中frame/iframe框架对元素位置信息的影响,也就是需要加上元素所在frame的编号

有了定位元素的方法以后,就可以进一步实现软件代替人对网页的操作。具体就是用户先在软件中内嵌的浏览器里进行一次对网页的完整操作,软件记录下元素位置信息操作序列(可以保存在数据库或者脚本文件中,类似于宏)以后,就可以重复人的操作行为,从而完成一些大批量的半重复性劳动,例如广告的发布等。

事实上这套方法可以让计算机模拟人的行为,对网页进行人可以做的任何操作。目前已经做出了基于此的自动发布文章的软件工具,可以批量向各个网站发布信息。另外还可以有哪些方面的应用尚有待开发。

遗留的问题:

1、如何检测出软件自动处理网页过程中可能出现的各种错误,例如网页跳转错误、元素未找到、网站整体版式变化等等。

2、如何设计界面接口,让用户可以方便快捷地添加新网站。

-------------------------------------------------
本博客中凡是未标明【转】字样的文章均为原创,作者保留版权,转载请务必保留原文地址。
博客地址:http://xuxn.cnblogs.com
如有问题请联系:xuxin1123@gmail.com
原文地址:https://www.cnblogs.com/xuxn/p/1810100.html