Hola a todos. Llevo meses empleando una macro para hacer scrapping la cual tengo que modificar dado que la web ya no admite IE. A través de tutoriales conseguí escribir un código que me permite obtener los datos, llevo varias semanas y tengo dos problemas:
Primero, no consigo que la macro copie los datos de página 2 debajo de los datos de la página 1, los de la 3 debajo de las 2,..., sino que siempre copia encima de lo anterior.
Segundo, copiar los datos en la hoja de excel actual (solo consigo que copie los datos si creo una nueva hoja)
Este es el código inicial que funciona bien, debajo pongo a donde he llegado con Selenium. Empleo "i" para marcar el número de elementos a obtener de cada web, "i2" es el número de páginas que tiene esa sección de la tienda
Código:
Sub aMonitores()
Dim ie As Object
Set ie = CreateObject("InternetExplorer.Application")
With ie
.Visible = False
For i2 = 1 To 13
Worksheets("aMonitores").Select
.navigate "......page=" & (i2) & ""
Application.Wait (Now + TimeValue("0:00:1"))
Do
DoEvents
Loop Until ie.readyState = READYSTATE_COMPLETE
Dim doc As HTMLDocument
Set doc = ie.document
While ie.readyState <> 4
Wend
On Error Resume Next
Dim i As Integer
For i = 0 To 11
'product link, probably wrong class name
Range("A7").Offset(i + (i2 * 12), 0).Value = doc.getElementsByClassName("ProductsListstyled__ProductContainer-a3dwak-1 kpaiIf")(0).getElementsByClassName("Linkstyled__StyledLinkRouter-sc-1drhx1h-2 hihJjl ProductListItemstyled__StyledLink-sc-16qx04k-0 dYJAjV")(i).href
'actual data
Range("D7").Offset(i + (i2 * 12), 0).Value = doc.getElementsByClassName("StyledBox-sc-1vld6r2-0 bncFqw StyledFlexBox-sc-1w38xrp-4 lmlWlG")(i).innerText
Next i
Next i2
'tell me how many products are exhibit on the web
Range("B1").Value = doc.getElementsByClassName("Cellstyled__StyledCell-sc-1wk5bje-0 NLfJA")(0).getElementsByClassName("Typostyled__StyledInfoTypo-sc-1jga2g7-0 kTxGyM")(0).innerText
Range("C1").Value = doc.getElementsByClassName("Cellstyled__StyledCell-sc-1wk5bje-0 NLfJA")(0).getElementsByClassName("Typostyled__StyledInfoTypo-sc-1jga2g7-0 bfsyWw")(0).innerText
'count the data obtained
Range("C2").Select
ActiveCell.FormulaR1C1 = "=COUNTA(R[3]C[-2]:R[4998]C[-2])"
Range("E2").Select
ActiveCell.FormulaR1C1 = "=COUNTA(R[3]C[-2]:R[4998]C[-2])"
Range("F2").Select
ActiveCell.FormulaR1C1 = "=COUNTA(R[3]C[-2]:R[4998]C[-2])"
ie.Quit
Application.EnableEvents = True
End With
End Sub
Código con Selenium:
Código:
Option Explicit
Private cd As Selenium.ChromeDriver
Sub mm()
Set cd = New Selenium.ChromeDriver
Worksheets("aMonitores").Select
Dim ws As Worksheet
Dim i As Integer
Dim i2 As Integer
For i2 = 1 To 13
cd.Get ".....?page=" & (i2) & ""
Dim clases As Selenium.WebElements
Dim clase As Selenium.WebElement
On Error Resume Next
For i = 1 To 12
Set clases = cd.FindElementsByCss(".StyledBox-sc-1vld6r2-0.bncFqw.StyledFlexBox-sc-1w38xrp-4.lmlWlG")
clases.Text.ToExcel ThisWorkbook.Worksheets.Add.Range("A1")
Next i
Next i2
cd.Close
End Sub
Lo he intentado con otras opcines como:
- Sustituir la línea de CSS del segundo código en el primero
- Escribir (i) en la línea delcd.findelementsbycssen el segundo código
Y otras tantas que no logro recordar
Muchas gracias por vuestro tiempo.
Featured Replies
Archivado
Este tema está ahora archivado y está cerrado a más respuestas.
Primero, no consigo que la macro copie los datos de página 2 debajo de los datos de la página 1, los de la 3 debajo de las 2,..., sino que siempre copia encima de lo anterior.
Segundo, copiar los datos en la hoja de excel actual (solo consigo que copie los datos si creo una nueva hoja)
Este es el código inicial que funciona bien, debajo pongo a donde he llegado con Selenium. Empleo "i" para marcar el número de elementos a obtener de cada web, "i2" es el número de páginas que tiene esa sección de la tienda
Código con Selenium:
Lo he intentado con otras opcines como:
- Sustituir la línea de CSS del segundo código en el primero
- Escribir (i) en la línea del cd.findelementsbycss en el segundo código
Y otras tantas que no logro recordar
Muchas gracias por vuestro tiempo.