Condividi:        

Scaricare i Dati da un sito WEB e Trasferirli su Excel

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Maury170419 » 06/04/20 20:22

Ciao a Tutti mi chiamo Maurizio e il mio nuovo problema e questo .
Non ditemi per favore che sono Noioso,
Nel Voler Proprorre sempre le stesse cose ; ma credetemi stò cercando di fare di tutto per voler imparare veramente; ma quando riesco a risolvere un problema mi se ne ri_presenta un altro ha qui non riesco a trovare una soluzione logica.

Il Problema e questo : Il Vorrei ricavare in base a determinati criteri posizionati sul foglio di Excel con Microsoft office 2007
Tutto ciò che si potrebbe ricavare dal sito "Immobiliare.it"

Pertanto : Grazie al vetro aiuti precedenti ho voluto buttare giù un programma tutto mio : E questo e il suo Listato .

Codice: Seleziona tutto
Option Explicit

Sub GetSocial()

Dim HTML As New HTMLDocument
Dim http As Object
Dim row As Long
Dim continue As Boolean
Dim listings As IHTMLElementCollection
Dim listing As IHTMLElementCollection
Dim ul As HTMLUListElement
Dim li As HTMLLIElement
Dim I As Long
Dim page As Long
Dim URL As String
Dim Start As Range
   
Dim X As String
Dim Y As String
Dim T As String
   
Dim P As Variant
Dim P2 As Variant
   
Dim MQ As Variant
Dim MQ2 As Variant

   
   
Application.ScreenUpdating = False
   
row = 0
page = 1
continue = True
Set Start = Range("D6")
           
           
X = Sheets("Trova_E_Visualizza").Range("A5").Value
   
Y = Sheets("Trova_E_Visualizza").Range("B5").Value
T = Sheets("Trova_E_Visualizza").Range("C5").Value
   
P = Sheets("Trova_E_Visualizza").Range("D5").Value
P2 = Sheets("Trova_E_Visualizza").Range("D6").Value
   
MQ = Sheets("Trova_E_Visualizza").Range("E5").Value
MQ2 = Sheets("Trova_E_Visualizza").Range("E6").Value

   
Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")
   
While continue
   
URL = "https://www.immobiliare.it/" & X & "" & T & "/" & Y
'?pag=/" & page &
With http
       
'On Error Resume Next
.Open "GET", URL, False
.send
           
' If Err.Num is not 0 then an error occurred accessing the website
' This checks for badly formatted URL's. The website can still return an error
' which should be checked in .Status
                       
' If the website sent a valid response to our request
If Err.Number = 0 Then
           
If .Status = 200 Then
       
HTML.body.innerHTML = http.responseText
                           
Set listings = HTML.getElementsByClassName("listing-features list-piped")
                   
'Prrova Oggetti; Da; Provare; Per; Estrappolare; Dati
'listing-features list-piped
'clearfix left-side-listing
                   
For Each ul In listings
                   
I = 1
                   
For Each li In ul.getElementsByTagName("li")
'li In ul.getElementsByTagName("li")
If I = 1 Then
                           
Start.Offset(row, 0).Value = li.innerText
                           
End If
                           
If InStr(li.innerText, "m1") Then
                           
Start.Offset(row, 1).Value = Left(ul.innerText, InStrRev(li.innerText, "ul") + 1)
                           
End If
                           
I = I + 1
                           
Next
                           
row = row + 1

Next
           
Else
               
continue = False
               
End If
           
           
Else
       
continue = False
On Error GoTo 0
           
End If
               
On Error GoTo 0

End With
       
page = page + 1
   
Wend

Application.ScreenUpdating = True
   
End Sub


Haora devo dire che come programma non va male.
Il problemi sono in sostanza due che sono :

1) che quando avvio la procedura di ricerca ; La ricerca non smette mai a patto che io non prema immediatamente da tastiera il tasto (Esc)

2) Una volta fatto ciò , chiaramente il programma mi da errore , ma ironia della sorte mi scarica i soli dati inerente hai prezzi delle care della mia ricerca e non le voci appartenenti all'oggetto stesso

Provare per capire meglio il tutto Grazie


(P.S) Questo e il lino per scaricare il mio file di prova :

https://app.box.com/s/jvmqzrjb32jezyn6romplqfs6mtq9p2k

E Per finire : Secondo voi non ci sarebbe la possibilità di avere dei link , dove io possa attingere tali metodi
Ma che a sua volta mi possano Aiutare a farli incanalare con il linguaggio VBA GRazie

Sinceri Saluti da A.Maurizio
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Sponsor
 

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Anthony47 » 07/04/20 14:43

Queste automazioni sono sempre "su misura", cioe' specifiche per un singolo url, e presuppongono che l'utente esamini il codice html delle pagine da interfacciare e poi usi proprieta' e metodi delle "librerie" disponibili al vba (o perche' impostate come "Riferimento" nel tuo ProgettoVBA o perche' viene creata una associazione tramite CreateObject).
Per farti capire, questo e' un tipico esempio di contenuto di questi elementi:
Codice: Seleziona tutto
<UL class="listing-features list-piped"><LI class="lif__item lif__pricing">€ 830.000 </LI>
<LI class=lif__item>
<DIV class=lif__data><SPAN class=text-bold>5+&nbsp;</SPAN><SVG class=icon-svg height="16" width="16"><USE xlink:href="#rooms" /></SVG></DIV>
<DIV class="lif__text lif--muted">locali </DIV></LI>
<LI class=lif__item>
<DIV class=lif__data><SPAN class=text-bold>190</SPAN>&nbsp;m<SUP>2</SUP></DIV>
<DIV class="lif__text lif--muted">superficie</DIV></LI>
<LI class=lif__item>
<DIV class=lif__data><SPAN class=text-bold>2&nbsp;</SPAN><SVG class=icon-svg height="16" width="16"><USE xlink:href="#bathrooms" /></SVG></DIV>
<DIV class="lif__text lif--muted">bagni </DIV></LI></UL>


La tua macro usa WinHTTP per emettere il comando e MSHTML per analizzare la risposta; visto che vuoi imparare, ecco un link in cui puoi trovare la documentazione relativa alla libreria MSHTML (quella che fa il lavoro di estrazione): https://docs.microsoft.com/en-us/previo ... 4(v=vs.85)
Qui dovresti trovare le modalita' con cui "agganciarti" al codice html per analizzarlo e catturarlo.

Quando dici "mi scarica i soli dati inerente ai prezzi delle case della mia ricerca e non le voci appartenenti all'oggetto stesso" e' perche' (evidentemente) questo si trova nella "lista" (tag "li") presente in ogni elemento di ClassName("listing-features list-piped").

Piu' che altro dovresti dire quali elementi ti piacerebbe vedere estratti, poi si vedra' che cosa si puo' fare

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19419
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Anthony47 » 07/04/20 14:53

Aggiungo:
-per scansionare tutte le pagine allora modifica la riga Url = etc etc in
Codice: Seleziona tutto
    URL = "https://www.immobiliare.it/" & X & "" & T & "/" & Y & "/?pag=" & page

Suggersico anche di forzare tutti gli input come Text, modificando questa riga:
Codice: Seleziona tutto
                        If I = 1 Then
                            Start.Offset(row, 0).Value = "'" & li.innerText           'MMMM Modificata
                        End If

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19419
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Maury170419 » 07/04/20 17:34

Ciao Anthony come sempre grazie dei tuoi consigli
Farò come dici tu ; Mi leggerò attentamente tutto ciò che troverò in questo tuo lino.

Ma il problema e sicuramente capire come incanalare le varie procedure che posso trovare sulla pagina web con il suo linguaggio e incorporare il tutto fruttando il vba.

Tanto e vero che : Come hai potuto constatare di persona in questo mio primo progetto , non solo ho usato una tua prima introduzione per potermi indirizzare più facilmente alla pagina web
E poi ho cercato nella mia più totale ignoranza in merito , di sfruttare solo le cose più essenziali per poter scaricare i dati corrispondenti hai costi delle case e non dei nomi di ogni casa ecc...!

Però la vedo dura quando dovrò capire il perchè e quando si può usare il codice ad esempio :
Quando usare : ie.document.getElementsByClassName e chi mi dice che e più giusto usare questa soluzione
Piuttosto che : getElementsByTagName
Ho ancora usare : innerText ; getAttribute ;

Ho ancor peggio capire quando usare questa soluzione : readyState <> 4
Piuttosto che usare il mio metodo : Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")

Tutto qui !!!!!!!!

Però ti assicuro che ci proverò in quanto mi manca molto imparare saper fare queste cose
Grazie ancora per tutto
Sinceri saluti da A.Maurizio
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Maury170419 » 07/04/20 17:34

Ciao Anthony come sempre grazie dei tuoi consigli
Farò come dici tu ; Mi leggerò attentamente tutto ciò che troverò in questo tuo lino.

Ma il problema e sicuramente capire come incanalare le varie procedure che posso trovare sulla pagina web con il suo linguaggio e incorporare il tutto fruttando il vba.

Tanto e vero che : Come hai potuto constatare di persona in questo mio primo progetto , non solo ho usato una tua prima introduzione per potermi indirizzare più facilmente alla pagina web
E poi ho cercato nella mia più totale ignoranza in merito , di sfruttare solo le cose più essenziali per poter scaricare i dati corrispondenti hai costi delle case e non dei nomi di ogni casa ecc...!

Però la vedo dura quando dovrò capire il perchè e quando si può usare il codice ad esempio :
Quando usare : ie.document.getElementsByClassName e chi mi dice che e più giusto usare questa soluzione
Piuttosto che : getElementsByTagName
Ho ancora usare : innerText ; getAttribute ;

Ho ancor peggio capire quando usare questa soluzione : readyState <> 4
Piuttosto che usare il mio metodo : Set http = CreateObject("MSXML2.ServerXMLHTTP.6.0")

Tutto qui !!!!!!!!

Però ti assicuro che ci proverò in quanto mi manca molto imparare saper fare queste cose
Grazie ancora per tutto
Sinceri saluti da A.Maurizio
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Anthony47 » 08/04/20 18:42

Un "programma" deve usare le istruzioni a disposizioni per risolvere il problema finale; come sempre ci sono vari modi di arrivare allo stesso risultato.
Guardando il sorgente html ti verra' intuitivo capire se l'uso della GetElementByClassName, che ti restituisce una collezione di oggetti che hanno quella Class, ti offre piu' "appigli" che non una collezione di Tag.
InnerText, InnerHtml, e i loro equivalenti "Outer", ti restituiranno il text o l'html di quell'elemento, che puoi poi analizzare come se fosse una stringa.
Altre volte potrai sfruttare getAttrib, o "dovrai" usare getAttrb
Esempio, dato l'elemento
Codice: Seleziona tutto
<img src="https://lh5.googleusercontent.com/vKwYz3SAASV" class="lzy1Td">

se vuoi ottenere l'indirizzo dell'immagine potrai usare ad esempio
Codice: Seleziona tutto
picname = Elemento.getAttribute("src")
(come avevamo fatto in quest'altro tuo quesito: viewtopic.php?t=110448)

Con un po' di pratica vedrai che piano piano le cose si schiariranno...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19419
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Maury170419 » 15/04/20 22:04

Ciao Anthony come stai ?
Scusami se non ti ho risposto sino ad ora
Ma non era affatto per maleducazione, ma semplicemente per il fatto che : Avrei voluto darti una buona notizia riconducibile sempre a questo mio problema (Immobiliare.it) in quanto in questi giorni ho studiato molto .
Però ora mi sono arenato nuovamente; Pertanto ho capito che senza il tuo aiuto non riesco proprio ad andare avanti.
Anche se sono già a buon punto .

Il fatto e questo : Io sono riuscito a mettere tutti i pezzi al proprio posto ; Tranne che per un Fatto
Cioè che : Nella Cella (C3:E3) si dovrebbero visualizzare i risultati dei (N.dei Vani - I Mq - e i Bagni ) Per ogni locazione.
Però a parte la prima riga , nelle righe successive non c'è verso di porre nessun dato .
Pertanto ti chiedo ancora un piccolo aiuto nel risolvere questo problema Grazie.

Questo e il lino per scaricare nuovamente il mio programma di prova
Grazie ; Ciao , e fammi sapere cosa ne pensi .

Premtto che alla fine di tutto ho poi optato per sfruttare un tuo precedente aiuto , in quanto alla fine di tutto ho capito cheera pur sempre un bellissimo programma .
Ciao : https://app.box.com/s/w862yx3i850zpmbu2bkvd70jq5obx7e5
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Anthony47 » 16/04/20 16:02

Secondo me la fai troppo complicata; io l'ho semplificata cosi':
Codice: Seleziona tutto
Sub GetImmobiliare()
Dim myURL As String, myNext As Long, iPag As Long, P As Long

'Application.ScreenUpdating = False

X = Sheets("Trova_E_Visualizza").Range("A5").Value
Y = Sheets("Trova_E_Visualizza").Range("B5").Value
T = Sheets("Trova_E_Visualizza").Range("C5").Value
P = Sheets("Trova_E_Visualizza").Range("D5").Value
P2 = Sheets("Trova_E_Visualizza").Range("D6").Value
MQ = Sheets("Trova_E_Visualizza").Range("E5").Value
MQ2 = Sheets("Trova_E_Visualizza").Range("E6").Value
'

'Azzera area di destinazione:
Foglio2.Hyperlinks.Delete
With Foglio2.Range("A3:F300")
    .ClearContents
    .NumberFormat = "@"
    .Font.Underline = xlUnderlineStyleNone
    .Font.ColorIndex = xlAutomatic
    .Font.TintAndShade = 0
End With
Foglio2.Range("A3:F100").ClearContents

Set ie = CreateObject("InternetExplorer.Application")

For P = 0 To 100            'SCANSIONA MAX 100 PAGINE di risultati
    myURL = "https://www.immobiliare.it/" & X & "" & T & "/" & Y & "/" & "?criterio=rilevanza&" & "prezzoMinimo=" & P & "&" & "prezzoMassimo=" & P2 & "&" & "superficieMinima=" & MQ & "&" & "superficieMassima=" & MQ2 '  & "&" & "?pag=" & page
    If P > 0 Then myURL = myURL & "&pag=" & P
    With ie
        .navigate myURL
        .Visible = True
        Do While .Busy: DoEvents: Loop              'Attesa not busy
        Do While .readyState <> 4: DoEvents: Loop  'Attesa documento
    End With
'
    Set OggCol = ie.document.getElementsByClassName("listing-item_body")    'Blocco singolo immobile
'Controlla se alla fine:
    If UCase(ie.LocationURL) <> UCase(myURL) Or OggCol.Length < 1 Then
        GoTo Exit1
    End If
   
   'Scrive sul Foglio Attivo
    On Error Resume Next
    For I = 0 To OggCol.Length - 1
        With Foglio2
            myNext = .Cells(Rows.Count, "A").End(xlUp).row + 1
            'Lista Locativa Per Abitazione
            .Cells(myNext, 1).Value = OggCol(I).getElementsByTagName("p")(0).innerText                    'Descrizione
            .Hyperlinks.Add Anchor:=.Cells(myNext, 1), Address:=OggCol(I).getElementsByTagName("a")(0).href
            .Cells(myNext, 2).Value = OggCol(I).getElementsByClassName("lif__item")(0).innerText         'Prezzo
            .Cells(myNext, 3).Value = OggCol(I).getElementsByClassName("lif__item")(1).innerText          'Locali
            .Cells(myNext, 4).Value = OggCol(I).getElementsByClassName("lif__item")(2).innerText          'Superficie
            .Cells(myNext, 5).Value = OggCol(I).getElementsByClassName("lif__item")(3).innerText          'Bagni
            .Cells(myNext, 6).Value = OggCol(I).getElementsByClassName("descrizione__titolo")(0).innerText 'Informazione
        End With
    Next I
    On Error GoTo 0
Next P
Exit1:
On Error GoTo 0
Foglio2.Range("A3:F300").WrapText = False

'Chiusura IE
ie.Quit
Set ie = Nothing

Worksheets("elenco_Case").Activate
MsgBox ("That's all, folks")
End Sub

Dopo la prima, scansiona eventuali altre pagine prodotte dalla ricerca, accodando i risultati su foglio "Elenco_Case"
In colonna A aggiunge l'hyperlink all'immobile, nel caso voglia visionarlo al volo

Come vedi uso una sola collezione, ottenuta con getElementsByClassName("listing-item_body"), che mi restituisce i blocchi dei singoli immobili; all'interno di questa collezione estraggo poi direttamente le informazioni cercate. Molte delle Dim presenti sono state rimosse perche' inutili

Il file di prova e' reperibile qui: https://www.dropbox.com/s/0weui5ptrroyo ... .xlsm?dl=0

La mia macro e' in Modulo3, e NON E' agganciata al pulsante presente su foglio "Trova_E_Visualizza"

Spero trovi spunti utili per i tuoi lavori...

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19419
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Maury170419 » 16/04/20 17:17

Ciao Anthony
Per prima cosa grazie per il tuo Progetto come sempre e Sublime e ineguagliabile
Mi Lasci sempre senza Parole
Ha Parte che con te e la tua bravura; Lasciarmi senza parole e una regola da sempre !

Me lo studierò molto da vicino nei prossimi giorni
Però vorrei se gentilmente mi potessi spiegare il Senso di quelle (Quattro Celle ) che ho trovato a parte e Precisamente
Sono : " H1:H3 " ; " I3 " ; " K4 "
In quanto ho capito che sono delle formule riconducibili ad altre celle; Ma quello che non ho capito e il suo senso.
Grazie ancora di tutto a te e famiglia
E anche a tutti gli altri tuoi collaboratori ; Ciao da A.Maurizio
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Anthony47 » 16/04/20 18:02

Quelle celle sono rimaste sul foglio per errore; servivano a visionare il contenuto importato tramite innerText.
Quindi vanno cancellate (le ho gia' cancellate e aggiornato il file on line)
Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19419
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Scaricare i Dati da un sito WEB e Trasferirli su Excel

Postdi Maury170419 » 17/04/20 18:36

Ciao Anthony
Nuovamente Grazie Sia per il tuo Progetto che le tue spiegazioni finali.
Sei Fantastico
Grazie e Buon Fine Settimana
Maury170419
Utente Senior
 
Post: 159
Iscritto il: 31/10/16 09:05


Torna a Applicazioni Office Windows


Topic correlati a "Scaricare i Dati da un sito WEB e Trasferirli su Excel":


Chi c’è in linea

Visitano il forum: Nessuno e 23 ospiti