2016-11-10 7 views
1

WebClient를 사용하여 패턴이있는 웹 사이트에서 여러 이미지를 다운로드하는 응용 프로그램을 개발했습니다. 나는이 시작되면 , 내 생각은 빠르고 손쉽게 응용 프로그램, 그래서 함께 양식을 만들어 : 스토리지 .Net - WebClient 또는 HttpWebRequest가 콘텐츠를 얻습니다.

  • 목록 상자를 크롤링

    • 웹 브라우저 (WB) 여러 URL을 넣어
    • 여러 줄 텍스트 상자
    • 텍스트 상자 각 사진의 링크는

    그것은 쉽게, 그냥 필요했던 과정을 시작하기 위해있는 TargetPath에게

  • 버튼을 선택합니다 For + HtmlElement + WB.Document.All을 사용하여 각 사진의 레이블을 찾습니다. 일단 모든 링크가 있으면 WebClient를 사용하여 매우 빠르게 다운로드합니다 (Client.DownloadFile (path, filename)). 그것은 완벽하게 작동합니다.

    이제 앱이 더 크고 크롤링 할 웹 사이트가 더 많으며이를 관리하기 위해 BackgroundWorker를 사용하고 싶습니다. BGWorker의 작동 방식을 배우기 시작했고 WebBrowser와 같은 컨트롤을 사용할 수 없다는 것을 알았습니다. 예외가 발생하여 WB.Document.All을 사용하여 링크를 얻을 수 없습니다.

    http://www.codeproject.com/Articles/17979/Downloading-Files-in-NET-With-All-Information-Prog

    그는 사용 HttpWebRequest를, 내가 먼저 링크를 얻을 필요가있는 경우 구현하기 어려워 보인다

    나는 구체적으로이 일, BGWorker을 가진 파일을 다운로드하는 방법에 CodeProject의에서 놀라운 예를 찾아 .

    내 질문은 : HttpWebRequest를 사용하도록 앱을 다시 코딩해야합니까, 아니면 BGWorker를 사용하기 위해 현재 코드 (WebBrowser가 관련됨)를 적용 할 수 있습니까? BGWorker에서 WebBrowser를 사용할 수 있다면 올바른 방법은 무엇입니까?

    현재 관련 코드 (버튼을 클릭하면이 함수가 호출됩니다). 필요한 줄만 둡니다 :

    Function ExtractLicensePlate() 
         Dim Client As New WebClient 
         Dim totalPhotos As Integer = 0 
         Dim finalPlate As String = "[no licenseplate found]" 
         Dim totalCarsList As Integer = txtURLs.Lines.Where(Function(l) Not String.IsNullOrWhiteSpace(l)).Count() 
    
        For i = 0 To totalCarsList - 1 
         WB.Navigate(txtURLs.Lines(i)) 
         WaitForPageLoad() 
    
         For Each ele As HtmlElement In WB.Document.All 
          'ALD 
          If comboProviders.SelectedIndex = 0 Then 
           If ele.GetAttribute("src").ToLower.Contains("iddoc") Then 
            Dim imgsrc As String = ele.GetAttribute("src") 
            lstPhotos.Items.Add(imgsrc) 
           End If 
           'get license plate to make folders 
           If ele.GetAttribute("action").ToLower.Contains("matr=") Then 
            Dim fullURLname As String = ele.GetAttribute("action") 
            finalPlate = fullURLname.Split("=")(3).Substring(0, 7) 
           End If 
          End If 
         Next 
    
         If (Not Directory.Exists(txtDirectory.Text & "\" & finalPlate)) Then 
          If Not (finalPlate = "[no licenseplate found]") Then 
           Directory.CreateDirectory(txtDirectory.Text & "\" & finalPlate) 
          End If 
         End If 
    
         For j = 0 To lstPhotos.Items.Count - 1 
          Client.DownloadFile(lstPhotos.Items(j).ToString, txtDirectory.Text & "\" & finalPlate & "\" & finalPlate & j & ".jpg") 
          Client.Dispose() 
         Next j 
         lstPhotos.Items.Clear() 
        Next i 
        Return 0 
    End Function 
    

    도움이 될 것입니다.

    모두에게 감사드립니다.

  • +0

    내 의견은 "주로 의견 기반"이지만 최근 .NET Framework (4.5+)의 새 코드는'WebClient/HttpWebRequest' 및'BackgroundWorker' 대신'HttpClient' 및'Task'를 사용합니다. . 사용자에게 웹 페이지를 보여주고 싶지 않으면 'WebBrowser'를 사용하지 않을 것입니다. HTML Agility Pack을 사용하여 다운로드 한 HTML에서 링크를 추출 할 수 있습니다. 도움이 될지 확실하지 않습니다. :-) – Mark

    +0

    물론 모든 의견을 환영합니다 :-). 당신의 제안에 감사드립니다! – smtdev

    답변

    0

    나는 배경 작업자를 사용하지 않을 것이므로 스레드를 직접 작성해야합니다. 내 예가 여기에 있습니다 :

    Dim wc As New WebClient 
    
    Dim trdMain As New Thread(AddressOf fDownload) 
    
    Protected Sub sRun() 
        trdMain.IsBackground = True 
        trdMain.Start() 
    End Sub 
    
    Protected Function fDownload() 
        ' iterate through and download 
        For Each str As String In strImages 
         wc.DownloadString(str, "your location") 
        Next 
    
        Return True ' terminate the thread 
    End Function 
    

    이것은 다운로드하려는 이미지의 URL 배열을 가짐을 의미합니다. 그러면 코드를 간단하고 효과적으로 구현할 수 있습니다.

    +0

    즉, WebBrowser를 사용하여 이미지의 URL을 추출해야하거나 다른 제안이 있습니까? – smtdev