vb.net利用webbrowser下载(加载完成判断、多线程、委托)

下载一个电子书籍,每页有图片,多个图片就是整个教材的页数。


流程:利用webbrowser来判断网页加载完成,对网页代码用正则提取对应的书页实际地址。逐个下载每个书页到一个文件夹。


问题:webbrowser在判断加载完成时出现困难。

          1.完成状态无法使用。wb.ReadyState = WebBrowserReadyState.Complete根本不起作用。

          2.网页是否繁忙(Not wb.IsBusy)起作用,但同类网页激活次数不一,有些2次,有些3次,还有些4次。无法判断哪一次最终加载完成。

          3.合并状态也无法判断加载完成:If Not wb.IsBusy And wb.ReadyState = WebBrowserReadyState.Complete Then


初步解决:

    为了了解到底是哪个因素对加载完成起标志作用,在原程序中加入一个列表框(用来看网页加载完成进入时的信息)。

      利用Listbox1.Items.add(e.GetType.Tostring & "=" & e.Url.Tostring)来观察每次进入加载完成的信息情况。

      终于发现e.Url.Tostring有变化情况。主要由一个googlead和api.uyan的变化,前者次数不确定,由1-3次组成;后者每次网页必定只加载一次。


     于是,判断网页加载完成由api.uyan来决定(不同网页网址不同)。删除listbox完成本次小程序。


程序界面:

vb.net利用webbrowser下载(加载完成判断、多线程、委托)_第1张图片


完整源代码:

Imports System.Text.RegularExpressions

Public Class Form1
    Dim mythread As Threading.Thread
    Dim strHead As String  '首网页前头部分
    Dim intPage As Int32   '页数计数
    Dim intPageCur As Int32
    Dim strDownWeb As String
    Dim flag As String = "complete" '完成情况,默认完成
    Dim intCount As Int32
    Dim intMax As Int32
    '委托
    Private Delegate Sub voidShowMessage(ByVal strMessage As String)

    Private Sub btnStart_Click(sender As Object, e As EventArgs) Handles btnStart.Click
        '对连续使用时,变量清空
        strHead = ""
        flag = "complete"
        intCount = 0

        '提取首页头部
        Dim a() As String, i As Int32
        If txtFirstWeb.Text = "" Then
            MsgBox("网址错误")
            Exit Sub
        End If
        a = Split(txtFirstWeb.Text, "/")
        If a.GetUpperBound(0) < 3 Then
            MsgBox("网址错误")
            Exit Sub
        End If
        strHead = ""
        For i = 0 To a.GetUpperBound(0) - 1
            strHead = strHead & a(i) & "/"
        Next
        intPage = 1

        wb.Navigate(strHead & intPage.ToString("000") & ".htm")
        'wb.Navigate("http://www.dzkbw.com/books/rjb/yuwen/pc7x/271.htm")
    End Sub

    Private Sub wb_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles wb.DocumentCompleted
        If InStr(e.Url.ToString, "api.uyan") > 0 Then
            Dim strAllCode As String = wb.DocumentText
            Dim reg As Regex

            intCount = intCount + 1
            If intCount = 1 Then
                reg = New Regex("(?<=maxPage=)\d{1,3}(?=;)")
                intMax = reg.Matches(strAllCode)(0).Value
            End If

            reg = New Regex("(?<=img[ ]{1,3}src="").*?.jpg(?=""[ ]{1,3}id=""ebookimg)")
            If reg.Matches(wb.DocumentText).Count > 0 Then
                strDownWeb = reg.Matches(strAllCode)(0).Value
                Do While flag = "down" '等待下载完成
                    Application.DoEvents()
                Loop
                flag = "down"
                mythread = New Threading.Thread(AddressOf DownFile)
                intPageCur = intPage
                mythread.Start(strDownWeb)

                reg = Nothing
                Do While flag = "down" '等待下载完成
                    Application.DoEvents()
                Loop
                If flag = "complete" Then
                    If intPage >= intMax Then
                        lblState.Text = "状态:已完成!"
                        Exit Sub
                    Else
                        intPage = intPage + 1
                        wb.Navigate(strHead & intPage.ToString("000") & ".htm")
                    End If
                End If
            End If
        End If

    End Sub

    Private Sub DownFile(ByVal strweb As String)
        Try
            My.Computer.Network.DownloadFile(strweb, "D:\School\" & intPageCur.ToString("000") & ".jpg")
            Me.Invoke(New voidShowMessage(AddressOf ShowMessage), "状态:下载第" & intPageCur.ToString("000") & "页")
            'Me.Invoke(New voidShowMessage(AddressOf ShowMessage), strweb)
        Catch ex As Exception
            Me.Invoke(New voidShowMessage(AddressOf ShowMessage), "状态:第" & intPageCur.ToString("000") & "页下载失败." & ex.Message)
        End Try

        flag = "complete"
        mythread.Abort()
    End Sub

    Private Sub ShowMessage(ByVal m As String)
        lblState.Text = m
    End Sub
End Class




你可能感兴趣的:(线程,VB.NET,委托,WebBrowser)