65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 VB 的小型 Web 代理 - 第二部分

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.80/5 (5投票s)

2002 年 8 月 13 日

CPOL

1分钟阅读

viewsIcon

170013

downloadIcon

2017

使用 VB 的小型 Web 代理 - 第二部分

引言

在上一篇文章中,我们看到一个简单的 VB 应用程序,它可以提取特定 URL 的 HTML 页面。 在本文中,我们将构建一个小型网络爬虫,它将遍历给定 URL 中的所有链接。

  1. 使用所需组件和库设置 Visual Basic 环境
    • 打开 Visual Basic 并创建一个新项目(用户 Standard EXE)。
    • 从主菜单中选择“项目”->“引用”,并添加以下 Microsoft 库
      • Microsoft HTML 对象库
    • 按照以下方式将 Microsoft Windows Common Controls 添加到工具箱。 从主菜单中选择“项目”->“组件”。 组件窗口将打开。 在选择“控件”选项卡的情况下,向下滚动并单击组件前面的复选框
      • Microsoft Windows Common Control 6.x
  2. 设置爬虫的 UI
    • 添加一个标签、两个按钮控件、一个列表框和一个树形视图控件,如下所示

      Click to enlarge image

  3. 添加爬虫的代码
    • 单击“开始”按钮时,在给定 URL 下的所有链接中填充列表框
      Private Sub cmdStart_Click()
      '
      	'1 will populate lstlinks with all the parent links 
               'in the requested URL
      	getLinks txtURL.Text, 1
      			'
      End Sub
    • getlinks 函数根据第二个参数填充 listboxtreeview。 由于参数为 1,因此它会将 URL 下的所有链接填充到 listbox
    • Private Sub getLinks(strURL As String, iParentChild As Integer, _
      	Optional iParentNo As Integer)
      '
          Dim objLink As HTMLLinkElement
          Dim objMSHTML As New MSHTML.HTMLDocument
          Dim objDoc As New MSHTML.HTMLDocument
          Dim objNode As Node
          '
          Set objDoc = objMSHTML.createDocumentFromUrl(txtURL.Text, vbNullString)
          '
          MousePointer = vbHourglass
          While objDoc.readyState <> "complete"
              DoEvents
          Wend
          'get all Links
          For Each objLink In objDoc.links
          '
              If iParentChild = 1 Then
              '
                  lstLinks.AddItem objLink
              '
              ElseIf iParentChild = 2 Then
              '
                  'lstInnerLinks.AddItem objLink
                 
                  Set objNode = trvLinks.Nodes.Add(iParentNo, tvwChild)
                  objNode.Text = objLink
                  'objNode.Image = "leaf"
              '
              End If
          '
          Next
          MousePointer = vbNormal
      '
      End Sub
    • 如果用户希望进一步深入某些链接,则可以选择链接并按“获取内部链接”按钮
      Private Sub cmdGet_Click()
      '
          Dim iCount As Integer
          'Dim objNode As New Node
          If lstLinks.SelCount = 0 Then
          '
              MsgBox "Please Select a Link"
              Exit Sub
          Else
          '
              'objNode.Text = lstLinks.Text
              'For iCount = 0 To lstLinks.ListCount - 1
              iCount = 0
              While iCount <= lstLinks.ListCount - 1
              
                  If lstLinks.Selected(iCount) Then
                      
                      trvLinks.Nodes.Add , , , lstLinks.List(iCount)
                      getLinks lstLinks.List(iCount), 2, trvLinks.Nodes.Count
                      lstLinks.RemoveItem (iCount)
                      lstLinks.Refresh
                  Else
                      iCount = iCount + 1
                  End If
                  
               Wend
              'Next
               
          '
          End If
      '
      End Sub
    • 所有内部链接都将填充到 Treeview 中。 现在,如果用户进一步希望钻取,可以在 treeview 中的那些 URL 上双击
      Private Sub trvLinks_DblClick()
      '
          getLinks trvLinks.SelectedItem.Text, 2, trvLinks.SelectedItem.Index
      '
      End Sub
    • 最终屏幕将如下所示

      Click to enlarge image

历史

  • 2002 年 8 月 12 日:初始发布
© . All rights reserved.