Scaricare
elementi di una pagina web dal controllo WebBrowser |
Per poter salvare alcuni elementi di una
pagina visualizzata all’interno del controllo WebBrowser è necessario
utilizzare la funzione URLDownloadToFile dopo aver selezionato
il tipo di elemento da scaricare.
Questo significa che nel gruppo di elementi di cui si compone
una specifica pagina Internet, si dovrà andare a selezionare
quello desiderato, come si vedrà nell’esempio
mostrato di seguito.
Innanzitutto è d’obbligo analizzare la funzione
URLDownloadToFile, la cui dichiarazione corrisponde alla
seguente:
Declare
Function URLDownloadToFile
Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As
String,
_ ByVal szFileName As String, ByVal dwReserved As
Long, ByVal lpfnCB As
Long)
As Long |
dove il parametro pCaller nel caso in esame
dev’essere
posto a 0, il parametro szURL rappresenta l’indirizzo
della pagina in questione, szFileName il nome del file da
creare sul disco rigido che rappresenterà ogni singolo
elemento scaricato (ad esempio nel caso di un’immagine
.jpg il nome che andrà ad assumere una volta salvata
sull’hard disk), dwReserved parametro riservato dev’essere
anch’esso impostato sul valore 0 come l’ultimo
parametro ossia lpfnCB.
Pertanto se si aggiunge un controllo WebBrowser al progetto
e si aggiunge ai riferimenti del progetto la voce Microsoft
HTML Object Library, come mostrato in figura:
si potrà assegnare la pagina di destinazione del
controllo WebBrowser all’apertura di Form1.
Per semplicità verrà assegnato un percorso
locale. Nulla vieta però di fare riferimento ad una
pagina presente in rete per la quale è naturalmente
necessaria una connessione attiva:
Private
Sub Form_Load()
WebBrowser1.Navigate "localhost/sito/pagina.html"
End Sub |
Al completamento del documento e quindi in
seguito all’evento
DocumentComplete comincerà l’analisi del contenuto
della pagina.
Innanzitutto, siccome il download degli elementi del documento è silenzioso
ossia non necessita di intervento da parte dell’utente, è fondamentale
determinare la cartella nella quale archiviare i file scaricati.
Si memorizzerà tale percorso all’interno della
variabile denominate FDownload:
Private
Sub WebBrowser1_DocumentComplete(ByVal pDisp
As Object, URL As Variant)
Dim FDownload As String
FDownload = "C:\FDownload\"
End Sub
|
Nota: il processo di download dei file non
può andare
a buon fine se la cartella specificata non esiste. Si rende
pertanto necessario un controllo della presenza della directory
ed eventualmente la creazione della stessa. Pertanto si può aggiungere
il seguente blocco di codice:
If Len(Dir(FDownload)) = 0 Then
domanda = MsgBox("La cartella non esiste. Crearla adesso?", vbYesNo
+ vbInformation)
If domanda = vbYes Then
MkDir FDownload
Else
MsgBox "Download interrotto", vbCritical
Exit Sub
End If
End If |
La collezione di una determinata categoria
di elementi, rappresentata dall’oggetto IHTMLElementCollection si
può immagazzinare in una variabile oggetto denominata
insieme_Immagini:
Dim insieme_Immagini As IHTMLElementCollection |
All’interno di questa collezione si individua ciascun
singolo elemento (ad esempio un’immagine in particolare)
come oggetto IHTMLImgElement:
Dim img As IHTMLImgElement |
L’associazione della collezione di controlli alla
variabile insieme_Immagini avviene semplicemente attraverso
il metodo getElementsByTagName dell’oggetto Document
della pagina correntemente visualizzata (variabile oggetto
pDisp parametro dell’evento DocumentComplete):
Set insieme_Immagini = pDisp.Document.getElementsByTagName("IMG") |
Come si nota è sufficiente indicare il tipo di elemento
da associare a insieme_Immagini (in questo caso il tag “IMG”)
per ottenere l’associazione.
Quindi, una volta popolata la collezione insieme_Immagini
si andrà in essa ad eseguire un loop per tutti gli
elementi che contiene:
For i = 0 To insieme_Immagini.length – 1 |
e ad associare ciascuno di questi elementi,
uno alla volta finchè non è stato salvato
sul disco, alla variabile oggetto img:
Set img = insieme_Immagini.Item(i) |
Occorre adesso determinare due parametri
legati all’immagine:
rispettivamente il nome ed il tipo di estensione. Per quanto
riguarda il primo problema si andrà ad utilizzare
la proprietà src dell’oggetto:
NomeFile = Right(img.src, Len(img.src)
- InStrRev(img.src, "/")) |
l’estensione è invece un’analisi più approfondita
sulla stringa appena memorizzata nella variabile NomeFile.
Inoltre nel caso in cui l’estensione riveli un file
immagine accettabile, questo viene scaricato nella directory
indicata dalla variabile stringa FDownload:
Estensione = LCase(Right(Nome_File,
Len(Nome_File) - InStrRev(Nome_File, ".")))
If Estensione = "gif" Or Estensione = "jpg" Or Estensione
= "jpeg" Then
URLDownloadToFile 0, img.src, FDownload & Nome_File, 0, 0
Else |
L’istruzione
Else indica un secondo caso: l’immagine
potrebbe essere priva di estensione oppure potrebbe essere
stata creata dinamicamente. E’ pertanto necessario
determinarne il tipo esatto attraverso la proprietà mimeType
If InStr(1, img.mimeType, "GIF",
vbTextCompare) Then
URLDownloadToFile 0, img.src, FDownload & "file anomalo" & i & ".gif",
0, 0
ElseIf InStr(1, img.mimeType, "JPG", vbTextCompare) Then
URLDownloadToFile 0, img.src, FDownload & "file anomalo" & i & ".jpg",
0, 0
End If
End If |
Come si può notare non è possibile determinare
il nome esatto del file. Per questo motivo si assegnerà un
nome arbitrario “file anomalo” seguito da un
indice numerico progressivo per evitare di sovrascrivere
le immagini dello stesso tipo salvate in precedenza.
Segue per
finire la chiusura del loop e lo scaricamento degli oggetti
creati inizialmente:
Set img = Nothing
Next i
Set insieme_Immagini = Nothing
End Sub |
|