Condividi:        

Interrogare molteplici links.

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

Interrogare molteplici links.

Postdi Gianca532011 » 27/03/24 16:43

Ciao a tutti , ho questo problema dal quale non riesco a uscire, ovvero vorrei aprire una serie di collegamenti a blocchi di 5 o 10 alla volta , poi interrogarli e scaricare i dati di mio interesse , il tutto con selenium . Quindi ho trovato una prima macro che vi propongo che apre i links elencati in una pagina "url" in colonna D - ed è qui la complicazione - qui c'è solo una parte del link, mentre la parte mancante - identificata da myIsin è sul foglio "Dati" . In pratica bisogna creare due cicli for in cui il secondo faccia la scansione degli Isin riportati sul foglio Dati -e li associ- uno alla volta ai links da completare che trovasi su foglio url, quindi apra n. links e infine faccia l'interrogazione con selenium con il Metodo Anthony . seconda macro . Mica semplice, se serve un file fate sapere.
la prima parte dei link è simile a questa:

https://www.xxxxxx.it/borsa/obbligazioni/mot/obbligazioni-in-euro/dati-completi.html?isin=& myIsin&lang=it

il myIsin deriva dal foglio Dati dove sono elencati in colonna da A2 gli sin stessi .

Codice: Seleziona tutto
Option Explicit

Sub OpenHyperLinks()

    Dim Sh As Worksheet
     Dim xHyperlink As Hyperlink
    Dim WorkRng As Range
    Dim Rng As Range
   Set Sh = Worksheets("url")
    With Sh
        Set Rng = .Range("A2:A" & .Cells(.Rows.Count, "A").End(xlUp).Row)
    End With
   
    On Error Resume Next
    'Set WorkRng = Application.Selection
    For Each xHyperlink In Rng.Hyperlinks
        xHyperlink.Follow
    Next
     MsgBox ("Finito !")
   
End Sub


Codice: Seleziona tutto
Option Explicit
Sub Aggiorna()
    Dim Wpage As New Selenium.ChromeDriver
    Dim Element As Selenium.WebElement
    Dim r As Long, c As Integer
    Dim myIsin As String, LastR As Long, i As Long, LastC As Long
    Dim iTables As Selenium.WebElements
    Dim AllTabs, J As Long, K As Long, L As Long, myHead As String, P As Long
    ' Dim Nome As Selenium.WebElement
    'Dim uR As Long
    Dim Wks As Worksheet, Wks1 As Worksheet
    'Dim indirizzo As String
    Dim Destinazione As String    '  N_foglio As String
    Dim myUrl As String
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set Wks = Worksheets("url")
    Set Wks1 = Worksheets("Dati")
    LastR = Wks1.Cells(Rows.Count, "A").End(xlUp).Row            'Quanti Isin?
    LastC = Wks1.Cells(1, Columns.Count).End(xlToLeft).Column    'Quante colonne?
    '
    Wks1.Range("B2").Resize(LastR + 10, LastC + 5).ClearContents

    'Crea Driver:
    If Wpage Is Nothing Then
        Set Wpage = CreateObject("Selenium.ChromeDriver")
        Wpage.Start "Chrome"
        Wpage.AddArgument ("--headless")
    End If
   
    With Wpage
       
       Dim indirizzo As Hyperlink
        For i = 2 To LastR

            myIsin = Wks1.Range("A" & i)
            indirizzo = Wks.Range("D" & i) & myIsin
           
           ' Sheets.Add After:=Sheets(Sheets.Count)
            'ActiveSheet.Name = N_foglio

            '  .Wait 5000

            .get indirizzo
            If .FindElementsByCss("table").Count > 0 Then
                Set iTables = .FindElementsByCss("table")
                For Each Element In driver.FindElementsByCss("table")    '
                    'se  l'elemento è diverso da  Vuoto o da spazio
                    AllTabs = GimmeTablesArr(Wpage, myUrl)      'Ottieni la matrice delle tabelle
                    If Not IsEmpty(AllTabs(1)) Then                                   '<<< IF /END IF Aggiuntivo
                        For J = 2 To LastC                          'Cerca l'intestazione di ogni colonna...
                            myHead = Cells(1, J).Value
                            For K = 1 To UBound(AllTabs)            '... in tutte le tabelle della pagina...
                                For L = 1 To UBound(AllTabs(K))     '.... in tutte le righe di ogni tabella
                                    'Se "Trovato" allora scrivi il valore:
                                    If InStr(1, AllTabs(K)(L, 1), myHead, vbTextCompare) = 1 Then
                                        If Cells(i, J) = "" Then Cells(i, J) = AllTabs(K)(L, 2)
                                    End If
                                Next L
                            Next K
                        Next J
                    End If
                Next
            End If

        Next i
       
        End With
        'Quit Selenium
        '.Close
        'wpage.Quit

        'allinea a dx
        Range("A" & LastR & LastC).Select
        With Selection
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlBottom
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = False
            .ReadingOrder = xlContext
            .MergeCells = False
        End With


        Set Wpage = Nothing
        MsgBox ("Informazioni raccolte...")
    End Sub

Function GimmeTablesArr(lDriver As Object, myUrl As String) As Variant
    Dim PColl As WebElements, myItm As Object, TBColl As Object, pCount As Long
    Dim i As Long, myTim As Single
    Dim TArr()
    '
    With lDriver
        '.Get myUrl

        myTim = Timer
        '
        Set TBColl = lDriver.FindElementsByTag("table")
        If TBColl.Count > 0 Then i = TBColl.Count Else i = 1    'Aggiunta
        ReDim TArr(1 To i)

        '
        For i = 1 To TBColl.Count
            TArr(i) = TBColl(i).AsTable.Data
        Next i
        GimmeTablesArr = TArr
    End With

    Debug.Print "GTArr:", "Tables: " & i - 1, Format(Timer - myTim, "0.00"), myUrl
End Function

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

Sponsor
 

Re: Interrogare molteplici links.

Postdi Anthony47 » 28/03/24 01:52

Credo che la tua domanda sia in effetti:
ho una macro che deve aprire parecchie pagine web da cui estrarre dati, ma il suo funzionamento, basato sui driver Selenium, e' molto lento; allora per velocizzare il tutto ho pensato di lavorare in parallelo su piu' pagine contemporaneamente. Come si puo' fare?

La prima risposta, sulla base dei pochi esperimenti da me fatti, e': purtroppo sei fuori strada.
Da quello che ho visto il funzionamento di Selenium è infatti "modale", cioe' il vba viene sospeso fino a che Selenium non determina che il comando e' completato. Insomma non riesci ad avviare il comando Due fintanto che il comando Uno non e' dichiarato completato; avere 5 sessioni parallele e' insomma inutile.
Potresti pero' creare piu' sessioni Excel, che possono lavorare in parallelo processando ognuna un subset di Isin; poi quando tutte le importazioni sono finite chiudi tutte le sessioni eccetto la prima e vai ad assemblare in un unico output tutti i dati raccolti.
Sul mio Pc nuove sessioni Excel sono create se uso il tasto Alt quando avvio il programma; un metodo pratico per capire se due cartelle di lavoro "girano" su sessioni diverse e' copiare un range da un file e provare a fare "incolla speciale" sull'altro file: se sono in sessioni diverse non ha le classiche scelte "Tutto", "Solo formule", "Solo valori" etc etc.

E' possibile anche che l'inefficienza sia nella logica della macro stessa.
La macro mi pare che presupponga di raccogliere prima tutte le tabelle dalla pagina e poi si cerca tra il tutto raccolto i singoli dati di interesse. Ci sarebbe da valutare se questo e' il metodo piu' veloce (probabilmente lo e' se i dati di interesse sono tanti; facile che non lo sia se i dati di interesse sono pochi). In pratica si tratta di fare il benchmark del metodo .asTable che al momento raccoglie facile facile tutte le tabelle della pagina web.

Ma se questi lavori di automazione web sono sempre "un gioco di tempo è di pazienza", cercare il modo migliore per fare la cosa sposta il tempo e la pazienza "al quadrato". Insomma il suggerimento e' di provare con piu' sessioni Excel, credo che lavorando con due o tre in parallelo il miglioramento sara' netto.
Avatar utente
Anthony47
Moderatore
 
Post: 19223
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Interrogare molteplici links.

Postdi Gianca532011 » 28/03/24 11:56

Ciao Anthony, ho provato con il metodo delle doppia istanza ma ... quando lancio le macro di interrogazione il primo file si aggiorna correttamente ma il secondo no, scrive i dati nel foglio sbagliato, come se lo scenario non fosse completamente indipendente. Quindi mi sa che non se ne esce.
Ma la mia idea di apertura multipla delle pagine web seguita da una interrogazione asTable , scarico i dati di mio interesse , chiudo la web page, passo alla seconda ... capisco che comunque i tempi sono quelli dettati dalla procedura Selenium, però ho un accesso al server meno invasivo oppure è lo stesso ? Se è lo stesso tante vale restare con la procedura attuale pass- passo .
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 329
Iscritto il: 27/05/11 10:18

Re: Interrogare molteplici links.

Postdi Gianca532011 » 31/03/24 17:40

Giusto per la cronaca, semmai interessasse a qualcuno sono alla fine riuscito, pur con molta pena, a fare una doppia interrogazione su due diversi links nell'ambito di una stessa macro. Pero ora è una interrogazione successiva all'altra, ma forse si riesce ad aprire anche due bot in contemporana :
Codice: Seleziona tutto
Private Bot1 as New Selenium.ChromeDriver
Private Bot2 as New Selenium.ChromeDriver


almeno cosi dicono qui.

https://stackoverflow.com/questions/718 ... -same-time
Giancarlo
win 10 - Office 2016 Ita
Gianca532011
Utente Senior
 
Post: 329
Iscritto il: 27/05/11 10:18

Re: Interrogare molteplici links.

Postdi Anthony47 » 31/03/24 23:13

Certo, funziona. La domanda è: riduce i tempi di elaborazione rispetto all'uso di un unico driver?
Avatar utente
Anthony47
Moderatore
 
Post: 19223
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Interrogare molteplici links.":


Chi c’è in linea

Visitano il forum: Nessuno e 17 ospiti