本帖最后由 wmx12345 于 2014-11-7 11:23 编辑
学习VBA网抓,请参照网抓前辈wcymiss 写的精品帖子http://club.excelhome.net/thread-1159783-1-1.html。
学习以上这个贴,许多对网抓富有激情的程序猿,会觉得意犹未尽,本帖将讲网抓的高级技巧,异步多线程网抓。
说起异步多线程,许多人都会说VBA只能单进程,不可能做到异步多线程,即使做了,也不够稳定,简直就是垃圾。我只想说,十八般兵器,各有各的长处,无所谓优劣,只有会不会用,精不精。OK,废话不多讲,进入正题。
学习准备知识:
1、在VBA中测试通过的网抓代码。
2、类的创建、事件的声明及调用。
3、异步、回调、多线程的基本概念。
工具: MicrosoftVisual Basic 6.0 (SP6) MicrosoftExcel 2003或以上版本
心理准备: 必定ActiveX EXE需要使用VB进行封装,所以需要扎实的类基础知识、ActiveX的调试基本技巧、对各种概念的理解,在准备进行做异步多线程网抓之前,务必将这些知识都学一遍。 本教程并不适合VBA初学者,初学者学习本教程,需要下一番功夫。
类的使用方法: 对于类的学习,论坛中有许多教程,不再赘述,请自己搜索教程。
VB事件的解释: 事件被声明之后,就可以使用 RaiseEvent 语句来产生该事件。如果在[url=]标准模块[/url]中出现 Event 声明,就会产生语法错误。不能声明带返回值的事件。 其实不必想太多,看一下Excel的事件就知道了。Excel使用Event关键字声明了一个事件,然后在Range值发生改变的地方RaiseEvent change,change事件是带有Target参数的。VBA是调用事件的,Excel中是声明、引发事件的。触发事件,实际上就是Excel把控制权交给VBA,我们称之为回调或者事件触发。
异步的实现方式: 使用Timer控件实现异步。也可以使用其他方式来避免创建窗体的这种资源浪费。不过我个人觉得,现在电脑,早就不是VB6.0那个年代的配置了,没必要追求性能上的极致,所以我推荐使用这种简单的方式来实现异步。
多线程的实现方式及控制: ActiveX EXE 本身就是一种服务器模式,可以独立运行,所以是具备多线程特性的。结合异步使用之后,使用事件回调的方式,将结果以参数的方式返回给VBA这个调用者。当然还可以使用Byref(或者不加前缀)传递参数,从而可以在运行过程中,改变ActiveX EXE内部的参数。
异步网抓框架结构: 对于框架结构的描述,我使用一组对话来描述一下。 VBA:ActiveX EXE服务器,你给我网抓几个网页。要求是开始网抓的时候,告诉我一声,我准备一下,抓结束了,将结果放到我指定的地方去,我来查收。 ActiveX EXE服务器:好嘞,您就瞧好吧。网抓1号听命,你去抓百度网页。网抓2号听命,你去抓EH网页。 网抓1号:我开始了,VBA,您处理一些事情吧,您处理好了,我再继续。
VBA:好的,我弄一下,叽里呱啦。好了,网抓1号,你继续吧。
网抓1号:好嘞,我开始网抓了。。。叽里呱啦,叽里呱啦。。。 网抓2号:VBA,我要开始了,您处理一些事情吧,您处理好了,我再继续。 VBA:好的,我弄一下,叽里呱啦。好了,网抓2号,你继续吧。 网抓2号:好嘞,我开始网抓了。。。叽里呱啦,叽里呱啦。。。 网抓1号:VBA,我网抓结束了,结果已经放到您指定的地方了。等您再处理一些事情,我再结束。 VBA:好的,叽里呱啦,叽里呱啦。网抓1号,你继续吧。 网抓1号:好的,我继续了,叽里呱啦。ActiveX EXE服务器,我做完了,我要结束线程(自杀)了。 ActiveX EXE服务器:准了,你去吧! 网抓2号:VBA,我网抓结束了,结果已经放到您指定的地方了。等您再处理一些事情,我再结束。 VBA:好的,叽里呱啦,叽里呱啦。网抓2号,你继续吧。 网抓2号:好的,我继续了,叽里呱啦。ActiveX EXE服务器,我做完了,我要结束线程(自杀)了。 ActiveX EXE服务器:准了,你去吧! ActiveX EXE服务器:VBA,您交给我的任务,我都完成了。我也要结束进程了,后会有期! VBA:好的,拜拜!
模板使用方法: 1、在VBA中调测好网抓代码之后,将代码复制到模板的 GetWebData类中,调整结构方便调用。请注意,复制过去的代码,不允许夹杂任何对Excel的操作,否则这种封装是不合理的,也会增加复杂度。 2、根据需要,可以增加类,尽量把功能细化、模块化。 3、如果直接测试模板,需要先注册一下ActiveX EXE,或者使用VB6.0生成一下exe。否则,Excel主程序引用会丢失。 4、关于调试请注意以下两个设置。第一次生成可以选不兼容,后续生成得调为工程兼容。调试程序选择Excel.exe。具体方法为,运行之后,会弹出Excel界面,再双击“异步多线程调试主程序.xls”,然后运行VBA中的代码,就可以调试ActiveX EXE了。如果有Bug会在ActiveX EXE内部中断。
写本帖的初衷: 共享本帖中的技术,意在交流异步多线程技术,发布的模板可能调试上还存在一定的缺陷和不足,请有兴趣研究的朋友,反馈和更新版本,务必将这项技术发扬下去。本人对于异步多线程技术,也是一知半解,学习不够深入,所以没法讲解深层次上的原理,如果本帖内容有误,请积极指出,我将及时更正。
创建ActiveX EXE的流程:
|