Condividi:        

Macro per stampare pagine autogeneranti da un sito

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

Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 11/06/14 22:20

Ciao tutti,
ho un problema per stampare le pagine che si creano, andando a definire determinati parametri da un sito. Mi spiego meglio.

Ho un sito di ricerca. Mi registro con il mio nome e password. Faccio delle ricerche selezionando es. professioni, età delle persone, sesso, ecc. E' chiaro che in base alle scelte che vado a depennare, il risultato del numero di pagine cambia (probabilmente la ricerca va pescare da un data base i records e poi li monta).

Quindi, poniamo io potrei avere:
https://it.pippo.com/ricerca/#/detail/1/0 (avanzo di un record ed avrò)
https://it.pippo.com/ricerca/#/detail/2/0
https://it.pippo.com/ricerca/#/detail/3/0 e via discorrendo.

Le pagine sono molte ma avendo salvato la mia ricerca sono che in tutto avrò un tot di pagine.

Io ho preso ogni url (quindi ogni risultato di ricerca) e li ho incolonnati da A1 ad A51293

a questo punto come posso creare una macro che:
- mi apra nel browser il link scritto in A1
- mi copi tutto ciò che trova nella pagina web
- lo incolli in B1 (fino a compilare in B51293 ?

Vi ringrazio anticipatamente
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Sponsor
 

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 11/06/14 22:37

Scusate il titolo erroneo: prima volevo stampare le pagine.
In un secondo momento ho preferito la soluzione di copiare da web ed incollare in una cella
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Anthony47 » 12/06/14 15:56

Se vuoi automatizzare l' importazione di dati da siti web devi usare gli strumenti di programmazione messi a
disposizione dalla libreria mshtml.tlb, corrispondente al riferimento alla Microsoft Html Objrct Library, che esaminano il codice html delle pagine per estrarre le parti che interessano.
Questo pero' presuppone di conoscere esattamente l' url da cui i dati vanno importati, per esaminare il sorgente e programmare correttamente la macro excel.
Se non puoi condividere l' url allora puoi guardare una delle tante discussioni che trattano di queste automazioni, ad esempio:
viewtopic.php?p=580649
viewtopic.php?f=26&t=97268
viewtopic.php?f=26&t=97767
viewtopic.php?t=98113

Le macro in queste discussioni aprono una sessione InternetExplorer, aprono l' url voluto e attendono la stabilizzazione del "documento", poi "lavorano" il codice html del documento per estrarre la parte voluta.
Se tu vuoi inserire tutto il contenuto della pagina in una singola cella allora, dopo le attese iniziali, dovrai usare qualcosa come
Codice: Seleziona tutto
Range("A1") = ie.document.body.innertext

Se con questo breve spunto non risolvi, allora scrivi ancora dando qualche ulteriore informazione su cui lavorare.

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

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 12/06/14 16:18

Grazie Anthony,
vado a vedere i topic e provo a fare qualche test.


Buona giornata.
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 12/06/14 16:35

Ciao Anthony,
alcuni topic li avevo già visti. Quelli che mi hai suggerito, partono dal fatto di estrapolare/copiare file da un url.

Io ho centinaia e migliaia e migliaia di righe (su qualche documento anche A2:A1.000.000).

Quindi io dovrei fare i seguenti passaggi per non far scoppiare il pc:
- copia contenuto in A2
- aprilo in mozzilla
- copia contenuto (o Salva pagina con nome in modalità Pagina web, completa).

Sono partito da una macro che (speravo) aprisse i link contenuti nelle celle:

Codice: Seleziona tutto
Sub Test()
Dim WB As Workbook
Dim SH As Worksheet
Dim Rng As Range
Dim rCell As Range

    Set WB = Workbooks("Pippo.xls")
    Set SH = WB.Sheets("Foglio1")

    Set Rng = SH.Range("A2:A300")

    For Each rCell In Rng.Cells
        WB.FollowHyperlink Address:=rCell.Value, _
                                         NewWindow:=True
     Next rCell

End Sub


E' chiaro che non ho utilizzato il file con oltre un milione di righe ma ho copiato solo i primi 400 link ma mi da errore di indice non incluso nell'intervallo.
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Anthony47 » 13/06/14 15:22

La macro dovrebbe funzionare; se da un errore di "indice non incluso nell'intervallo" e' perche' hai usato un valore non contemplato. Se dici quale e' la riga che va in errore (quella evidenziata in giallo se premi Debug) si puo' fare qualche ipotesi ulteriore.

Comunque, ti e' chiaro che con quella macro cercherai di aprire N-mila schede all' interno del tuo browser?
Lavorare con "InternetExplorer.Application" consentirebbe invece di aprire e gestire, uno dopo l' altro, gli N url in una unica sessione di IE; richiedera' "qualche minuto" ma alla fine saranno stati tutti gestiti...

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

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 13/06/14 16:34

Funziona, funziona, avevo scritto male il nome del file.

Si, lo so che mi aprirebbe un'infinità di pagine. Ho visto con Explorer ma, salvando la pagina come pagina web completa da risultati completamente diversi.

Qui allego un esempio di "estrazione" con IE ed una con Mozilla: http://rapidshare.com/share/5DE9D9BBB9D ... D6E5FD719C

Come vedi quella di Mozilla è nettamente più ricca: riporta tutti i dati che si vedono nella pagina (che chiaramente si vede se si accede con autentificazione).

Io non dovrei però copiare parti di tabelle o sezioni di pagina...mi basterebbe poter Salvare web, completo e far si che i file non si sovrascrivessero ma che si salvassero in automatico in modo sequenziale (1, 2, 3, 4, ecc.).

Per questo ero partito con l'aprire i vari link in ogni finestra (ma so benissimo che è un lavoro assurdo).
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Anthony47 » 14/06/14 00:59

Beh, inizialmente parlavi di inserire il testo in una cella, mi pare che in realta' vuoi salvare il risultato di qualche migliaio di ricerche, con parole suoni e video.
Confermo che con l'automazione tramite con "InternetExplorer.Application" potresti portarti su foglio excel un tot mirato di informazioni, da aggregare ex-novo.
Tra le altre ipotesi mi viene in mente di aprire l' url con l' hyperlink (su una scheda gia' aperta, evitando NewWindow:=True), usare poi SendKeys per inviare all' applicazione browser i tasti che avviano il "Salva pagina con nome" (nella mia installazione si tratta di Contr-s, Enter), rinominare col vba il file appena creato (oppure usare SendKeys dello step precedente per inviare un nome file, dopo Contr-s e prima di Enter); ripetere per il prossimo url.

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

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 14/06/14 16:16

Ho cambiato tutto per questione di praticità:

ho un elenco infinito di url in celle A1:A51365.
Devo aprire ognuno di essi, dare il salva come pagina web completa (il formato mht) e chiuderle.

In effetti da come ero partito voleva dire utilizzare un giorno e mezzo per aprire solo cento url.

Il problema con IE è che, come hai visto nel file che avevo inviato, sega gran parte dei contenuti e quindi il lavoro sarebbe nullo.

Aprendo il file in IE, mi registro con le mie credenziali, non mi fa visualizzare parte delle info e quindi devo optare per un altro metodo.

ma non so quale.
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 14/06/14 16:26

Ho provato con un test:
Codice: Seleziona tutto
Sub Naviga(DestUrl)

'Dim DestUrl As String
On Error GoTo OpenIE
    If objIE.Visible = False Then objIE.Visible = True
    objIE.Navigate DestUrl
    Do While objIE.busy: DoEvents: Loop 'opzionale, loop se non completato
Exit Sub

OpenIE: 'crealo se manca
    Set objIE = CreateObject("InternetExplorer.Application")
    objIE.Visible = True

Sub esempio()
    Call Naviga("https://it.kompass.com/easybusiness/#/detail/4194296/0")
    Call Naviga("https://it.kompass.com/easybusiness/#/detail/4194297/0")
    Call Naviga("https://it.kompass.com/easybusiness/#/detail/4194297/0")

Sub closeIE()
    On Error Resume Next
    objIE.Quit
    Set objIE = Nothing
End Sub


ma niente...mi da continuamente errore
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 14/06/14 16:35

Ho anche pensato di impostare una query come questa

Codice: Seleziona tutto
Codice: Seleziona tutto
    Sub UnaTant()
    Range("A1").Select
    With ActiveSheet.QueryTables.Add(Connection:="URL;http://www.pippo.it", _
        Destination:=Range("$A$1"))
        .Name = "www.pippo.it"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .WebSelectionType = xlEntirePage
        .WebFormatting = xlWebFormattingNone
        .WebPreFormattedTextToColumns = True
        .WebConsecutiveDelimitersAsOne = True
        .WebSingleBlockTextImport = False
        .WebDisableDateRecognition = False
        .WebDisableRedirections = False
        .Refresh BackgroundQuery:=False
    End With
    End Sub



ma i dati che vengono presi sono quelli inutili come quelli che estrapola IE
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Anthony47 » 15/06/14 03:19

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

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 15/06/14 15:24

Prendendo un po' di spunti ho provato a mettere insieme alcuni passaggi arrivando al codice seguente:

Codice: Seleziona tutto
Sub Macro1()
'
Dim txtRequestString As String
Set IE = CreateObject("internetexplorer.application")

IE.Visible = True
Set WB = Workbooks("Cartel1.xlsx")
    Set SH = WB.Sheets("Foglio1")

    Set Rng = SH.Range("A2:A58")

    For Each rCell In Rng.Cells
        WB.FollowHyperlink Address:=rCell.Value, _
                                         NewWindow:=True
     Next rCell

While IE.busy
    DoEvents
Wend

IE.document.getElementById("SSOID").Value = "Z19516732"
IE.document.getElementById("Advanced").Checked = False
IE.document.all("Search").Click


For i = 1 To 400000000
    i = i + 1
Next i

'ie.Object.Activate
IE.document.getElementById("Advanced").Checked = False
IE.document.getElementById("SSOID").Focus
Application.SendKeys "{TAB 6}" ', True

'bring up the control menu/right click
Application.SendKeys "+{F10}"

'copy shortcut is 8 items down on the list
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"
Application.SendKeys "{DOWN}"

'enter was not working so the shortcut for the menu is 't'
'SendKeys "{ENTER}"
Application.SendKeys "{t}"

Windows("Book21").Activate
Range("A1").Select
ActiveSheet.Paste

End Sub


Mentre con il primo che feci (che apriva di botto tanti tab quanti link) in questo caso mi si blocca. Non riesco a dire di aprire in IE i link che trova nelle celle
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Anthony47 » 16/06/14 23:11

Trattandosi di applicazione per uso business, non sarebbe sbagliato chiedere l' aiuto di un Analista /Programmatore, cosi' facciamo girare anche l' economia del Paese.

Come ultimi contributi, propongo un paio di ipotesi...
La prima basata su CreateObject("InternetExplorer.APPLICATION") (che consente di gestire l' attesa per il caricamento della pagina) piu' SendKeys per l' invio di ulteriori comandi; con l' avvertenza che SendKeys fa un po' un lavoro alla cieca, che in piu' ha richiesto l' inserimento di una serie di wait per avere la confidenza che il comando sia stato completamente eseguito e si puo' passare al comando successivo, e che i tempi sufficienti sul mio pc possano essere esagerati o insufficienti su un altro pc. Inoltre il codice deve essere eseguito su un pc dedicato (perche' la macro invia i comandi all' applicazione attiva; se non e' IE va tutto all' aria).
Corrisponde al seguente codice, da inserire tutto in un "Modulo vba" dedicato.

Codice: Seleziona tutto
Dim IE As Object
Option Base 0

Sub Test11()
Dim rCell As Range, myRan As Range
'
If IE Is Nothing Then Set IE = CreateObject("InternetExplorer.APPLICATION")

Set myRan = ThisWorkbook.Sheets("Foglio1").Range("A2:A100") '<<< Il foglio nel file che contiene le macro con l' elenco url
'
For Each rCell In myRan
    If rCell <> "" Then
        GetTabbb (rCell.Value)
'Personalizzare la prossima con Path e nome file (1) >>>
        mykeys = Array("^s", "C:\Users\UTENTE\Documents\zczcpippo", "{TAB}", "{TAB}", "{TAB}", "{TAB}", "{ENTER}")
        DoEvents
        For J = LBound(mykeys) To UBound(mykeys)
            SendKeys mykeys(J), True
            If J < 2 Then myWait (1) Else myWait (0.2)
Debug.Print mykeys(J)
        Next J
        myWait (0.5)
Debug.Print " "
Debug.Print "Next link>>>>>>>"
        On Error Resume Next
'Personalizzare le prossime due con Path e nome file (2) >>>
        Name "C:\Users\UTENTE \Documents\zczcpippo.mht" As "C:\Users\UTENTE \Documents\zczc" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".mht"
        Name "C:\Users\UTENTE \Documents\zczcpippo.htm" As "C:\Users\ UTENTE \Documents\zczc" & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".htm"
        On Error GoTo 0
    End If
Next rCell
myWait (5)
Debug.Print "Kill IE"
IE.Quit
Set IE = Nothing
'
End Sub

Sub GetTabbb(myUrl)
'
With IE
ReNav:
    On Error GoTo NoNav
Debug.Print ">"
    myWait (0.2)
    .navigate myUrl
    .Visible = True
    myWait (0.2)
    Do While .Busy: DoEvents: Loop    'Attesa not busy
    Do While .readyState <> 4: DoEvents: Loop 'Attesa documento
End With
'
'attesa addizionale
myWait (1)
Exit Sub
NoNav:
Debug.Print ("NoNav")
myWait (0.5)
    On Error GoTo 0
    Resume ReNav
'
End Sub
'
Sub myWait(myStab As Single)
Dim myStTiM As Single
'
    myStTiM = Timer
    Do          'wait myStab
        DoEvents
        If Timer > myStTiM + myStab Or Timer < myStTiM Then Exit Do
    Loop
End Sub

La macro da lanciare e' la Test11
Le istruzioni marcate <<< oppure >>> sono da personalizzare.
La macro crea una sessione InternetExplorer; all' interno di questa apre una dopo l' altra le pagine web elencate; successivamente invia con SendKeys un elenco di comandi (vedi (1) <<<) alla sessione IE con l' obiettivo di salvare in locale la pagina; infine il file salvato viene rinominato.
A tal proposito, come noterai (vedi (1) >>> e (2) >>>), quando salvo una pagina web assegno un nome specifico (vedi (1) >>>) e successivamente rinomino questo file assegnado un nome univoco (desinenza data/ora); mi immagino che tu vorrai rinominare il file in modo piu' creativo, pensando soprattutto a come poi dovranno essere utilizzati, e lo farai modificando le istruzioni (2) >>>

Una seconda possibilita' consiste nell' uso della funzione URLDownloadToFile (una Api di sistema) che abbiamo usato ad esempio qui: viewtopic.php?p=561166#p561186

Con questa funzione si copia in locale il solo codice html, quindi mancheranno ad esempio immagini e altre informazioni linkate dal codice; la cosa potrebbe pero' essere ancora utile se il file viene aperto su un pc connesso a Internet e se le immagini e le altre informazioni linkate sono sempre disponibili sul sito linkato, e se il sorgente non lavora con un foglio di stile css molto sofisticato; cose che devi controllare tu.
Il codice concettuale per questa seconda opzione, da inserire in un "Modulo vba" dedicato, e' del tipo:
Codice: Seleziona tutto
Private 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
'
Sub Test22()
Dim myRan As Range, rCell As Range, Resp As Long, dLock As Long
Dim myUrl As String, myFFName As String, myPath As String

Set myRan = ThisWorkbook.Sheets("Foglio1").Range("A2:A100") '<<< Il foglio nel file che contiene le macro con l' elenco url
myPath = "C:\UTENTE\Documents\FILE_"      '<<< Il path dove saranno salvati i file
'

For Each rCell In myRan
    If rCell <> "" Then
        dLock = 0
        myUrl = rCell.Value
'La prossima andra' ovviamente personalizzata per salvare con un nome file significativo...
        myFFName = myPath & Format(Now(), "yyyy-mm-dd-hh-mm-ss") & ".htm"    '<<<
ReDown:
        dLock = dLock + 1
        Resp = URLDownloadToFile(0, myUrl, myFFName, 0, 0)
        If Resp = 0 Then
            'eventuali azioni quando il file e' stato salvato    '<<<<
        Else
            If dLock < 10 Then
                GoTo ReDown
            Else
            'Scaricamento non riuscito...
                '...Istruzioni da eseguire nella circostanza     '<<<
                MsgBox ("Fallito: " & myUrl)
            End If
            myWait (1)     '!!! Usa la myWait della soluzione precedente
        End If
    End If
Next rCell
'
End Sub

Le istruzioni marcate <<< sono da personalizzare
Nota che anche questa soluzione usa la Sub myWait, assicurati che sia gia' presente.
E' evidente la maggiore semplicita' della soluzione, che nasconde anche una stabilita' impensabile con SendKeys; questo a fronte delle limitazione sul tipo di salvataggio effettuato.

Se questa seconda soluzione non e' sufficiente, l' ipotesi principe per me e' sempre quella di creare in modo programmatico la sessione IE, aprire le pagine web, estrarre dalle pagine le informazioni che servono e usarle per crearsi pagine in un formato proprio.

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

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 21/06/14 15:55

Grazie per gli ennesimi consigli Anthony, mi metto a fare delle prove.

Domanda: il fatto che conisgli un pc dedicato vuol dire che debba avere solo IE per la macchinosità dei tempi di risposta?
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Anthony47 » 21/06/14 17:57

Anthony ha scritto:Inoltre il codice deve essere eseguito su un pc dedicato (perche' la macro invia i comandi all' applicazione attiva; se non e' IE va tutto all' aria)

Se il pc non e' dedicato l' ipotesi che "l' applicazione attiva" sia sempre InternetExplorer e' "zero", quindi interviene la regola "va tutto all' aria".

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

Re: Macro per stampare pagine autogeneranti da un sito

Postdi Gattuccio0 » 22/06/14 13:27

Ho fatto la prova...tempi permettendo la macro funziona alla perfezione. In effetti impiega una vita.
Controllando i file accade quando temevo: i risultati salvati sa IE sono totalmente differenti da quelli di Mozzilla.

Quindi tento la strada di estrarre dalle pagine le informazioni che mi servono. Vi tengo aggiornati.
Gattuccio0
Utente Senior
 
Post: 186
Iscritto il: 22/06/09 12:46


Torna a Applicazioni Office Windows


Topic correlati a "Macro per stampare pagine autogeneranti da un sito":

consumo pagine web
Autore: nikita75
Forum: Software Windows
Risposte: 4

Chi c’è in linea

Visitano il forum: Gianca532011 e 39 ospiti