转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
自动上网抓数据的机器人         ★★★★

自动上网抓数据的机器人

作者:闵涛 文章来源:闵涛的学习笔记 点击数:2076 更新时间:2009/4/23 18:59:42

       在大多数情况下,上网冲浪是件令人愉快的事情。但若是数百上千的超链接摆在你面前,而你又不得不一一点击这些链接、进入相应的网页、手工筛选出每页里你需要的信息、最后再将这些信息编进数据库中、....,你将做何感想?如果每天都从事这种繁杂、枯燥的工作会不会让你发疯?
    “自动上网机器人”或许可救你出“苦海”:你可以喝着咖啡、听着音乐、看着“机器人”辛勤地替你工作,那感觉是不是棒极了!
     本文结合实例详尽讨论了用VB实现“上网机器人”的技术细节。我们知道,搜集和下载资料是人们使用互联网的最主要的目的之一,但有些信息资源过于庞大,用手工摘取的方法是困难的或根本就是行不通的。例如,你需要搜集欧洲进口机械设备的公司名录以便给他们发信邀请其参加博览会,在网上找到这些信息并不难,但出于数据安全等方面的考虑,几乎所有提供类似信息的网站都没有提供直接下载数据的功能。
     要想搜集齐想要的数据,唯一可用的方法就是一页一页地浏览每个公司的信息页,摘取其中有用的数据并存入数据库。但当公司总数超过数千时,巨大的工作量会让任何人望而却步!其实,这浩大的工作完全可以由程序来完成,因为这些任务完全是机械的重复性工作。而且,用程序完成比用手工要快得多。本文涉及的技术细节是通用的,即对实例程序稍加修改就可完成任何“自动上网冲浪”任务。

    自动拨号上网、自动处理中途掉线、任务完成后自动挂断,这些都是“上网机器人”的最基本的功能之一。它还能给你带来明显的经济回报:如果你让“机器人”在晚间至凌晨的上网费优惠期内拨号上网去自动冲浪,那真可称得上是典型的“一石三鸟”----你睡觉、它工作、还省钱!有关这方面的细节将在本文的第三部分里讨论。该部分提供了实现上述各功能的若干方法,并比较了这些方法各自的优劣。

    本文的第一和第二部分分别以两个实例讨论了自动浏览的技术细节:在网页上的输入区内自动填入数据以便完成诸如用户登录等的操作、自动更新CheckBox、自动选择下拉式列表(ComboBox)的值、自动点击网页上的按钮、从网页上精确提取有用的数据并存盘、将网页上二维表(Table)内的数据一一提取出来并转换且存储成可直接导入数据库或 Excel的格式,以及控制浏览进程的技巧等等。

第一部分  从网页上精确提取数据

    本部分的实例是:下载沪深两市全部约1100家个股的基本信息及财务数据。若用手工操作,如上图所示,需要在股票代码区内分别输入1100个股票代码,在下拉式列表(ComboBox)中分别选择“个股资料”和“财务数据解读”,算下来约是2200次操作!这样的工作当然是由程序来完成划算得多。况且手工提取数据(先选中、再使用Ctrl+C拷贝)极容易出错(多选或漏选),又很费眼神。

1. 在输入区内自动填入数据

    为使程序能高效地自动浏览,需引入一些最基本的功能,如在输入区内自动填入数据、自动点击按钮等等。虽然用变换 URL地址的方法有时也能完成任务,但往往过于费力,尤其当网页上的输入区较多时更是如此。

    为了在输入区内输入数据,需要先搜索到该对象的名字,然后将该对象的值置为要填入的数据即可。搜索名字的工作可编程完成,亦可用 FrontPage轻松获得。

2. 自动在下拉式列表(ComboBox)中进行选择

    同样地,首先要获得下拉式列表的名字。然后根据下拉式列表的元素总数(length属性)在列表中搜索要设置的值(列表的 Options集合中元素的Text属性),找到后,将该元素设为选中元素(元素的Selected属性)。

3. 自动点击按钮

    对于按钮来讲,可根据其名字访问,亦可根据其值访问。按钮的值就是显示在按钮上的文字。一个按钮可能没有名字,但一定有值。本例的程序就是根据值来访问按钮。执行按钮的 Click方法就相当于点击了该按钮。

 

 

    图二中红色箭头所指即为程序自动填入输入框、自动在ComboBox中选择以及自动点击按钮的情况。

4. 精确提取数据

    仅将有用的数据存储下来才是有意义的。必须研究网页,找出有效数据所在的Tag区(可用文本编辑器或 FrontPage),然后用该对象的innerText属性获得最终的文本。本例中要存储的数据如下图所示,其所用的Tag为“PRE”。

 

    下面给出的是实例程序的完整代码:

'''' 程序一:从网页上精确提取数据
''''
'''' 为运行本程序,应在“菜单->工程->部件”中添加“Microsoft Internet Controls”
'''' 并在“菜单->工程->引用”中添加“Microsoft HTML Object Library”
''''
'''' 为了简洁,程序仅下载九只个股的基本信息
Option Explicit
Private Const Form_ID = 1
Dim Code(9) As String
Dim Current As Long
Private Sub Form_Load()
  Form1.MousePointer = 11
  '''' 以下是个股代码
  '''' 为了程序简洁,这里仅使用九只代码。
  '''' 而在真实环境中,应从数据文件中读入全部个股代码。
  Code(0) = "600001": Code(1) = "600002": Code(2) = "600003"
  Code(3) = "600005": Code(4) = "600006": Code(5) = "600007"
  Code(6) = "600008": Code(7) = "600009": Code(8) = "600010"
  Current = 0
  WebBrowser1.Navigate "www.stockstar.com.cn"   '''' 起始网址
End Sub

Private Sub WebBrowser1_DocumentComplete(ByValpDisp As Object, URL As Variant)
  Dim i, k
  Text2 = WebBrowser1.LocationURL    '''' 显示当前网址
  '''' 判断当前网页是否全部调入完毕
  If Not (pDisp Is WebBrowser1.Object) Then Exit Sub
  On Error Resume Next
  Select Case Text2
  Case "http://www.stockstar.com.cn/home.htm"  '''' 当进入主页面时执行以下程序
   For i = 0 To WebBrowser1.Document.Forms(Form_ID).length - 1
      '''' 找到代码输入框后填入个股代码
      If WebBrowser1.Document.Forms(Form_ID)(i).Name = "code" Then _
        WebBrowser1.Document.Forms(Form_ID)(i).Value = Code(Current)
      '''' 在下拉式列表中进行选择
      If WebBrowser1.Document.Forms(Form_ID)(i).Name = "target" Then
        For k = 0 To WebBrowser1.Document.Forms(Form_ID)(i).length - 1
           If WebBrowser1.Document.Forms(Form_ID)(i).Options(k).Text _
                     = "个股资料" Then
             WebBrowser1.Document.Forms(Form_ID)(i).Options(k).Selected = True
             Exit For
           End If
        Next k
      End If
      '''' 点击按钮
      If WebBrowser1.Document.Forms(Form_ID)(i).Value = " 查询 " Then _
        WebBrowser1.Document.Forms(Form_ID)(i).Click
   Next
  Case Else   '''' 当进入数据页面时执行以下程序
   For i = 0 To WebBrowser1.Document.All.length - 1
      If WebBrowser1.Document.All(i).tagName = "PRE" Then
        '''' 精确提取数据
        Text1 = Text1 + Code(Current) + vbCrLf + _
                WebBrowser1.Document.All(i).innerText + vbCrLf
        Exit For
      End If
   Next
   '''' 数据存盘
   Open "C:\Data2.Txt" For Append As #1
   Print #1, Text1: Text1 = "": Close #1
   '''' 换下一只股票
   Current = Current + 1
   If Current >= 9 Then
     '''' 上网任务完成后,应在此调用自动挂断过程。
     Form1.MousePointer = 0: MsgBox "Finished!": End
   End If
   '''' 回退到主页面,查询下一只股票的信息
   WebBrowser1.GoBack
  End Select
End Sub

第二部分  将网页上的二维表导入数据库

    在上一部分中,我们讨论了让程序自动在网上浏览并将所需的数据准确、快速地存储下来的方法。现在,我们将迎接更大的挑战:将网页上以表格形式存在的二维数据提取出来,并存成可直接导入数据库的“Microsoft Excel 逗号分隔值文件”(即.csv文件)。 

    用手工在网页上直接提取类似上图中所示的表格数据是非常困难的。如果这样的表格有数十页甚至上百页之多,手工提取工作将是不可想象的,而且非常容易出错。

    本部分的实例是:将沪深两市全部约1100家个股的财务评分表数据(共54页,每页20家,如上图所示)快速、准确地转换成“.csv”文件。

1. 自动设置CheckBox的值

    由于只有注册用户才能访问上述财务评分表,因此实例程序首先演示了自动注册的功能。下图显示的是注册前以及自动注册后的画面。

/Article/UploadFiles/200904/2009042318594389.jpg

    我们在上一部分中已讨论了自动填写输入区以及自动点击按钮等的方法。对于自动设置CheckBox值,其方法完全类似:首先要搜索到该CheckBox的名字,然后将该对象的Checked属性置为True或False即可。

2. 将网页上的二维表导入数据库

   首先定义一个IHTMLElementCollection对象用于收集网页上所有的 Table,然后用getElementsByTagName方法执行收集工作:

Dim Tables AsIHTMLElementCollection
   Set Tables = WebBrowser1.Document.getElementsByTagName("Table")

 

 

    一个网页上往往有多个 Table。我们用HTMLTable对象来处理每个Table:

Dim Table1 AsHTMLTable
    For Each Table1 In Tables
    Next

    HTMLTable对象的innerText属性记录了整个 Table的全部信息,包括字段名。因此我们可以根据字段名判断出哪个 Table是我们需要的。

    为了逐行逐列地提取数据,我们还需要HTMLTableRow对象和HTMLTableCell对象:

Dim Row AsHTMLTableRow, Cell As HTMLTableCell
    For i = 1 To Table1.rows.length - 1      '''' 逐行处理
       Set Row = Table1.rows(i)
       j = 0
       For Each Cell In Row.cells      '''' 逐列处理
          '''' Row.cells(j).innerText即为当前行及当前列上的单元数据
          Text1 = Text1 + Trim(Row.cells(j).innerText) + ","
          j = j + 1
       Next
       '''' 一行处理完毕后,去除行尾的逗号并加上回车
       Text1 = Left(Text1, Len(Text1) - 1) + vbCrLf
    Next

    至此,当前网页上的二维表已转换成“.csv”格式。

3. 自动浏览时的页面控制技巧

    我们从上个例子中就已经清晰地看到,自动浏览程序的主体是WebBrowser控件的DocumentComplete事件。只有在当前页面已被完全调入后,我们才能开始对当前页面进行数据处理,然后再根据当前在哪个页面来决定下一步的浏览方向。

    需要指出的是,DocumentComplete事件的发生并不一定意味着当前页面已被全部调入。如果页面上没有其它子框架(frames),发生DocumentComplete事件即表明当前页面(即主框架)已完成调入;若页面上有多个框架,则每个框架完成时都会发生DocumentComplete事件;当所有子框架都完成后,主框架最后产生一次DocumentComplete事件。为了判断出这最后一次DocumentComplete事件,需要比较每次事件发生时的对象(pDisp)是否是WebBrowser控件对象本身:

Private Sub WebBrowser1_DocumentComplete

[1] [2] [3]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台