Condividi:        

Selenium multipagina

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

Selenium multipagina

Postdi Gianca532011 » 26/12/25 17:28

Non so se il quesito è già stato trattato o meno comunque il problema è questo : da un sito devo scaricare una serie di dati disposti in tabella di circa 25 righe ma spalmati su 50 e più pagine . Ora ho tentato di adattare un file di Anthony con Selenium, ci sono parzialmente riuscito nel senso che il sw scarica via via le pagine in successione MA le sovrappone sempre nella stessa pagina invece di accodarle una sotto l'atra. Se mi date una mano , vi ringrazio da subito

Qui il codice

Codice: Seleziona tutto
Option Explicit
Dim WPage As Object

Sub PrintTables()
    Dim Ticker As String, myUrl As String
    Dim intest, element As Object
    Dim r As Long, c As Long, J As Long
' attivare Selenium Library
    Dim url As String

    Cells.Clear

    '
    'Crea Driver:
    If WPage Is Nothing Then
        Set WPage = CreateObject("Selenium.ChromeDriver")
    End If
    Sheets("AllTables").Activate
    Range("A:M").ClearContents
    '
    With WPage
    .Start "Chrome", ""
    .Get "https://www.xxxxxxxxxxx"

    '.FindElementByClass("cl-consent__btn").Click
   'Delay (2)
    .FindElementByXPath("//a[@data-role='b_agree']").Click
  Delay (4)
    r = 2: c = 1
    intest = Array("Nome", "Ultimo prezzo", "Var %", "Ora ult. prezzo", "Volume progr.", _
                   "Migliore denaro", "Migliore lettera", "Prezzo di rifer.", "Apertura", "Codice ISIN", "MF Risk")
    Range("A1:K1") = intest

    For J = 1 To 60  '  pagine totali

        'Prima pagina:
        Call GetAllTablesArr(myUrl, 1, 1)       'Posiziona in colonna A
        'Delay (4)
        r = Cells(Rows.Count, 1).End(xlUp).Row + 1
        On Error Resume Next
        WPage.FindElementByCss("body > div.skin-wrap > div.content_flex_wrapper > section.markets.container-fluid > div > div:nth-child(3) > div > nav > ul > li:nth-child(7)").Click
        On Error GoTo 0
       ' Delay (8)
    Next J

  End With
    'Quit Selenium
    WPage.Quit
 
    Set WPage = Nothing
    MsgBox ("Informazioni raccolte...")
End Sub

Sub GetAllTablesArr(myUrl As String, Optional rNum0 As Long = 1, Optional cNum0 As Long = 1)
    Dim TBColl As Object
    Dim I As Long, J As Long, myTim As Single
    Dim RNum As Long, CNum As Long

    Dim TArr

    If WPage Is Nothing Then
        Set WPage = CreateObject("Selenium.ChromeDriver")
    End If
    'myUrl = "https://www.milanofinanza.it/quotazioni/ricerca/listino-completo-2ae?refresh_cens"

    'WPage.Get myUrl
    '
    myTim = Timer
    '
    Set TBColl = WPage.FindElementsByTag("table")
    RNum = rNum0: CNum = cNum0
    '
    For I = 1 To TBColl.Count               'Scan delle Tabelle presenti
        TArr = TBColl(I).AsTable.Data
        RNum = RNum + 1
        Cells(RNum, CNum).Value = "## Table " & I
        If (UBound(TArr) * UBound(TArr, 2)) > 0 Then
            Cells(RNum + 1, CNum).Resize(UBound(TArr), UBound(TArr, 2)).Value = TArr
        End If
        RNum = RNum + UBound(TArr) + 1
        DoEvents
    Next I
    Debug.Print "FINE", RNum, Format(Timer - myTim, "0.00"), myUrl
End Sub

Function Delay(Seconds As Long)
    Dim StopTime As Date: StopTime = DateAdd("s", Seconds, Now)
    Do While Now < StopTime
        DoEvents
    Loop
End Function



Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 368
Iscritto il: 27/05/11 10:18

Sponsor
 

Re: Selenium multipagina

Postdi Anthony47 » 27/12/25 22:38

In un vecchio post scrissi:
La prestazione e' ottenuta tramite una Sub GetAllTablesArr che necessita dei seguenti parametri:
-l'Url della pagina
-Riga e Colonna dove posizionare i dati

Nel tuo codice tu invece richiami la GetAllTablesArr con
Codice: Seleziona tutto
Call GetAllTablesArr(myUrl, 1, 1)

Insomma sei tu che dici di mettere ogni nuovo blocco sempre a partire da riga 1 colonna 1

Dovresti invece calcolare quale e’ la prima riga libera e passare quella riga alla GetAllTablesArr
Non sapendo io come sono i tuoi dati non so suggerire il miglior modo per calcolare la prima riga libera; ma il seguente codice cerca l’ultima riga occupata tra le colonne A:M e poi passa la riga successiva come parametro della chiamata alla GetAllTablesArr:

Codice: Seleziona tutto
Dim LastR As Long
    For J = 1 To 60  '  pagine totali
        On Error Resume Next
        LastR = Range("A:M").Find(What:="*", After:=Range("A1"), _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlPrevious).Row
        On Error GoTo 0

        Call GetAllTablesArr(myUrl, LastR + 1, 1)
        ‘etc etc (segue codice)

Se basta controllare la colonna A per individuare la prima riga disponibile, allora e’ probabile che la riga
Codice: Seleziona tutto
r = Cells(Rows.Count, 1).End(xlUp).Row + 1
presente nel tuo codice dovesse proprio servire per dire alla successiva Call la posizione di partenza per la successiva pagina. Nel qual caso sarebbe possibile semplificare il codice complessivo in
Codice: Seleziona tutto
r = 1                                     ‘Riga di partenza

    For J = 1 To 60  '  pagine totali

        'Prima pagina:
        Call GetAllTablesArr(myUrl, r, 1)       'Posiziona in colonna A
        'Delay (4)
        r = Cells(Rows.Count, 1).End(xlUp).Row + 1   ‘prossima riga di partenza
        ‘etc etc


Ciao

PS: Vedo che ti sei "inventato" una funzione Delay; sappi che Selenium ha una sua funzione Wait, che inserisce un ritardo in MilliSec; quindi invece che Delay (4) potresti usare WPage.Wait 4000
Avatar utente
Anthony47
Moderatore
 
Post: 19684
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Selenium multipagina

Postdi Gianca532011 » 28/12/25 19:15

Grazie Anthony , cosi funziona quasi bene.
Quasi perchè dato che le pagine sono tantie da un certo punto in poi si accavallano e scarica ripetutatamente sempre la stessa . Non è che e colpa della GetTable che è costruita per sondare tutte le tabelle , mentre nel mio caso ho sempre la tabella 1 che si ripete ad ogni pagina ??
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 368
Iscritto il: 27/05/11 10:18

Re: Selenium multipagina

Postdi Anthony47 » 28/12/25 23:12

La presenza di ulteriori tabelle "fantasma" potrebbero solo inserire spazi vuoti tra i dati, non accavallare i dati.
Prova a utilizzare il codice con LastR = Range("A:M").Find(What:="*" etc etc per identificare la riga libera.

Se importa piu' volte la stessa tabella potrebbe esserci un problema di timing, tipico di pagine create dinamicamente con script locali: prova a inserire un delay dopo il click, o cerca di individuare un algoritmo che possa individuare il momento in cui la pagina si e' creata e stabilizzata.
Avatar utente
Anthony47
Moderatore
 
Post: 19684
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Selenium multipagina":


Chi c’è in linea

Visitano il forum: Nessuno e 12 ospiti