我们继续上一篇".NET实现之(WebBrowser数据采集-基础篇)",由于时间关系这篇文未能及时编写;上一篇文章发布后,得来了部分博友的反对意见,觉得这样的文章没有意义,WebBrowser采集数据效率低下用WebRequest效率就能提高了,本人不理解,为什么同样是HTTP协议进行数据采集,效率能提高多少,在采集过程中同样要经历种种的高层协议向底层协议转换等过程,我个人感觉WebRequest是实现更多的扩展性,本人的WebBrowser数据采集,并不是谈抓取数据的效率,重点是讲解WebBrowser控件的原理,能用WebBrowser与HTML网页进行很方便的集成,本人的下一篇文章".NET实现之(WebBrowser数据采集-续)",就将用WebBrowser进行与HTML网页进行混合使用,在HTML的对象中我要在我的WebBrowser控件中通过读取数据库,将Winform的控件在HTML中进行呈现,然后将我们的Winform中的数据动态的填入HTML网页中;这样的人性化、方便性、模拟性我想是WebRequest所不能取代的,我们大部分的软件是要提供给用户使用的,有一个友好的用户界面是必须的;[王清培版权所有,转载请给出署名]
今天我要讲的主要内容是通过WebBrowser实现数据抓取,上一篇文章并没有讲到怎么抓取数据,而是简单的讲解了WebBrowser控件的由来和一些互操作方面的东西,这篇文章将完全的讲解在用WebBrowser进行数据抓取时遇到的种种问题,本人有很长一段时间都在做数据抓取,第一次做数据抓取的时候是和我的一个好搭档一起做的,当时遇到很多困难还是他默默的解决了;在项目完成之后,我就决定将这样的经验与大家分享;我感觉在用WebBrowser进行抓取的时候最大的问题就是网页加载问题,在WebBrowser控件中有一个事件是我们必须要用到的DocumentCompleted事件,在网页加载完毕过后我们要进行相应的判断,比如当前页面是否是登录页面,我们做的网页抓取工具不可能是傻瓜式的手动抓取点一下抓一下,我们是完全自动化的,我们只需要一个登录就行了,因为现在基本上的网页登陆都是需要验证码的,所以登录需要我们人工的去识别填写,一旦登录成功后,一切均有系统自动完成,比如:动态跳转到采集页面、数据抓取、翻页等等过程都已经自动化,由于网页在频繁的请求过程中难免不太稳定,会造成无缘无故的停止,比如断网、异步加载迟钝、这样我们只能是通过观看界面才能清楚发生了什么,在通过断点继续抓取;我们不讨论那种抓取好坏是讨论哪种更适合用户的项目需求;我们需要看一张图才能明白抓取的大概原理:[王清培版权所有,转载请给出署名]
1:这是一幅整图,由于图片太大,本人就截成三个小图了;
通过上图的详细的步骤说明,我们清楚的指导我们要怎么做了;我们切换到代码片段:
2:
这是本人的项目结构,在Common文件夹里面有一个显眼的文件GatherWebBrowser.cs这是本人对WebBrowser控件进行了一层简单的封装,就是在里面加上了一些事件参数,这个文件下面有一个GatherWebBrowserArgs.cs文件,这个是WebBrowserDocumentCompletedEventArgs对象的配送对象;
3:
这个对象的目的就是将DocumentCompleted事件分离出来,让我们处理N层跳转的时候能很方便; 由于代码较多,我们就看几个关键的地方,能帮大家理清一个头绪就行了;
4:
这个是我们Winform窗口,WebBrowser控件就是我封装的那个控件,大家请注意,在我们层层跳转到最后的采集页面时,我们要将事件链中的第一个事件断开,为什么要断开,是因为我们的WebBrowser控件的DocumentCompleted事件总是会在网页加载完毕后触发,一旦当我们进入到采集生命周期中的时候,这部分的逻辑我们是不需要在处理的,这里就涉及到一个技术细节“委托链”,如果对这方面的东西不太了解的话,请查阅本人的“.NET简谈委托链”一文;
由于数据采集逻辑比较复杂,特别是自动数据采集,需要处理很多逻辑问题,这些东西都是因需求不同而不同,所以本人也只能讲解到这个层度了,大概的实现方式都是这样的,只要我们去慢慢的分析前后关系,HTML的组织,我相信肯定能写出好的数据采集;在下面的一篇文章中我将要通过WebBrowser实现与网页交互的系统,这方面的需求也是我们经常碰到的,比如我们有一个C/S的系统,但是我们的C/S系统要依附于B/S的系统,需要将我们的C/S系统的数据作为B/S系统的操作条件,在输入查询条件的时候,我们需要调用我们的Winform窗口,进行数据查询,然后将我们的Winform结果填到HTML的文本框中;请读者继续关注,谢谢;