Se vi siete mai chiesti come fare a scaricare una pagina web con VB.Net e cercate un modo semplice e una guida pratica per farlo, siete arrivati nel posto giusto.
Il modo più semplice per scaricare una pagina web ed in generale qualsiasi file dal web (pdf, immagini, programmi eseguibili ecc.) è quello di utilizzare una Classe già presente in VB.Net chiamata WebClient. La classe WebClient ha diversi Metodi ma quelli che ci interessano maggiormente sono tre:
- DownloadString(link) – scarica tutti i caratteri presenti nella destinazione (link) e li memorizza in una stringa. Questo metodo è adatto solamente a scaricare contenuto di tipo testuale (pagine html, asp, php, txt ecc.)
- DownloadFile(link, percorso) – scarica il contenuto del link che può essere di qualsiasi tipo (pdf, immagini, programmi ecc.) e lo memorizza in un file indicato in percorso
- DownloadData(link) – come il metodo precedente, ma il salvataggio del contenuto scaricato deve essere poi gestito dal programma.
Per utilizzare la classe WebClient, per prima cosa è necessario importare lo spazio dei nomi (Namespaces in inglese) che la contiene e che, nel nostro caso, si chiama system.net
:
Imports System.Net
Diventa poi banale scrivere il codice che scaricherà materialmente il file che ci interessa:
Dim Contenuto As New WebClient
Contenuto.DownloadFile(link,percorso)
Se il contenuto web che ci interessa scaricare richiede l’accesso con credenziali, un altro interessante metodo della classe WebClient ci viene in soccorso: Credentials
Il codice diventa quindi:
Imports System.Net
Dim Contenuto As New WebClient
Contenuto.Credentials = New NetworkCredential("nomeutente","password")
Contenuto.DownloadFile(link,percorso)
Come visto, scaricare una pagina web con VB.Net con la classe WebClient è molto semplice, ma non lascia molta libertà al programmatore di intervenire nei vari step (connessione al server, creazione ed invio di una richiesta HTTP valida, lettura dello stream in risposta alla richiesta ecc.).
Per avere pieno controllo su tutte le fasi del download, è necessario utilizzare altre due classi sempre presenti nel namespace System.Net
: HttpWebRequest
e HttpWebResponse
: vediamo rapidamente una funzione che utilizza queste classi:
Imports System.Net
Imports System.IO
Public Class Form1
Private Sub bnStart_Click(sender As System.Object, e As System.EventArgs) Handles bnStart.Click
Procedura()
End Sub
Sub Procedura()
Dim ContenutoWeb() As Byte
ContenutoWeb = ScaricaFileWeb("link-al-file-da-scaricare")
My.Computer.FileSystem.WriteAllBytes("d:/filescaricato.boh", ContenutoWeb, append:=False)
End Sub
Public Function ScaricaFileWeb(link)
Dim wr As HttpWebRequest
Dim risposta As HttpWebResponse
wr = Net.WebRequest.Create(link)
risposta = wr.GetResponse
Dim SourceStream As Stream
SourceStream = risposta.GetResponseStream()
Dim Buffer(4096) As Byte, BlockSize As Integer
Dim TempStream As New MemoryStream
Do
BlockSize = SourceStream.Read(Buffer, 0, 4096)
If BlockSize > 0 Then TempStream.Write(Buffer, 0, BlockSize)
Loop While BlockSize > 0
Dim FileWeb() As Byte
FileWeb = TempStream.ToArray()
SourceStream.Close()
risposta.Close()
Return FileWeb
End Function
End Class
Il codice qui sopra, si riferisce ad una piccola applicazione Windows creata in VB.Net con un Form con un solo bottone (bnStart) che chiama una procedura che, a sua volta, utilizza la funzione più completa per scaricare una pagina da web con VB.Net.
Questo codice in realtà può scaricare sia una pagina di contenuto testuale sia qualsiasi altro tipo di file binario (pdf, immagini, programmi eseguibili ecc.)
Una piccola notazione: quello che viene scaricato dal link impostato, è un flusso dati binario, che viene poi salvato in un file: sta a noi decidere qual’è il nome del file in cui vogliamo salvare il flusso dati ricevuto, ma dobbiamo stare attenti ad impostare una estensione del file congrua con i dati che abbiamo scaricato.
Se infatti scarichiamo un’immagine e chiamiamo il file “miofile.txt”, quando andremo ad aprirlo, verrà caricato in un editor di testo, mostrando solamente geroglifici: ricordiamoci quindi di mettere sempre l’estensione giusta nel nome del file da salvare!
Ho provato a eseguire il codice ma, che cosa sono Stream e MemoryStream. Per visual studio, sono tipi non definiti.
Ho capito! Mancava Imports System.IO
Non ho fatto in tempo a rispoderti… 🙂 Sono contento che abbia risolto: ora correggo!
salve questa procedura è molto valida e l’ho applicata con successo.
E’ nato pero un problema… i dati che estraevo dalla pagina non compaiono più .o meglio compaiono ma non con la tua procedura.. Probabilmente vengono elaborati da qualche routine che li scrive nella pagina prima di mostrarla sul video..
Ho trovato in giro altre procedure che fanno eseguire tutti gli script prima di far scaricare la pagina ma hanno la brutta abitudine che attendono la fine della pagina da caricare e non mi servono a molto. cosi…
Hai una soluzione migliore?
Sub prova()
Dim objwebbrowser As New WebBrowser
objwebbrowser.ScriptErrorsSuppressed = True
objwebbrowser.Navigate(“https://www.paginaWEB”)
AddHandler objwebbrowser.DocumentCompleted, AddressOf navigation_complete
End Sub
Sub navigation_complete(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs)
Dim strAuthorCode As String = sender.Document.Body.InnerText
My.Computer.FileSystem.WriteAllText(“C:\programmi\TEST2.txt”, strAuthorCode, True)
sender.Dispose()
End Sub