Saltar al contenido

Hacer búsqueda en web entre varias opciones


Gnoma

Recommended Posts

A ver, he leído un montón y lo he intentado de unas pocas formas... pero hay algo que no logro hacer.  Quiero hacer una macro que extraiga datos de una web. Hasta ahí todo correcto. Consigo extraer los datos que necesito, excepto 1 de ellos.  Me explico...

https://www.futwiz.com/en//fifa23/player/emmanuel-dennis/16645

Si os vais a esta página, veréis un jugador de futbol. He sido capaz de extraer los datos del jugador, tal como nombre, equipo, liga, nacionalidad, precio PC, precio PS, Rango de precios, etc y que los escriba en diferentes columnas. Todo esto funciona perfecto, un poco lento, pero funciona.  

Lo que me falta es que extraiga el tipo de carta que es. Es decir, hay "platas normales", "platas únicos",  "oros normales" y "oros  únicos". (Hay más clases pero centrémonos en esos 4 tipos). 

Buscando dentro de cada uno de los tipos de jugadores encuentro que existen 4 diferentes "div class" para cada una de ellas, es decir:

<div class="card-23 card-23-silver" ...     Esto seria plata único

<div class="card-23 card-23-silver-nr"... Esto sería plata normal

<div class="card-23 card-23-gold"... Esto seria oro único

<div class="card-23 card-23-gold-nr".... y esto seria oro normal.

Si extraigo datos de la web, de la forma que extraigo las otras celdas obtengo los datos del jugador. Sin embargo en este caso solo quiero saber qué tipo de carta es, no sus stats.  

Osea en realidad lo que quiero es que busque "card-23 card-23-silver" si existe, que lo escriba en la fila que está el jugador, en una columna nueva sino que busque el siguiente tipo "card-23 card-23-silver-nr" si existe, que lo escriba en la misma celda. Y así hasta completar los 4 tipos (o más que añada más adelante".

Os adjunto el fichero con las macros a ver si me podéis echar una manilla porfa.

 

Como información adicional. La macro actualiza solo las líneas indicadas entre los valores de "S1" y "U1".

Gracias por adelantado a quien me ayude :D

 

 

FICHERO CON MACROS (6).xlsm

Enlace a comentario
Compartir con otras webs

He probado con este trozo de código, pero no funciona bien.

Set curcell = Worksheets("Hoja1").Cells(Counter, 14)
    Dim MyObject1 As Object                  ' Create object variable.
    Set MyObject1 = [G2]                     ' Create valid object reference.

        On Error Resume Next


If IE.document.getElementsByClassName("card-23 card-23-silver-nr") = True Then
curcell.Value = "silver-nr"


ElseIf IE.document.getElementsByClassName("card-23 card-23-silver") = True Then
curcell.Value = "silver"


ElseIf IE.document.getElementsByClassName("card-23 card-23-gold-nr") = True Then
curcell.Value = "gold-nr"


ElseIf IE.document.getElementsByClassName("card-23 card-23-gold") = True Then
curcell.Value = "gold"
Else: curcell.Value = 0
End If

 

Ayuda please :_(

Enlace a comentario
Compartir con otras webs

Hola Abraham,

Lo primero gracias por contestar. Te explico de nuevo lo que estoy buscando... Empiezo de 0 para explicarme mejor.

Quiero hacer un Excel para tener actualizados los precios de jugadores de futbol del FIFA. En dicho Excel quiero meter un  link de futwiz y que la macro de Excel que he creado actualice sus datos. La mayoría de estos datos son fijos. Es decir,  no cambian. Como por ejemplo el nombre, la posición que ocupan,  nacionalidad, etc.  Otros valores sin embargo, como el precio si van cambiando.  

La mayoría de las cosas ya he conseguido que se actualicen con la macro. Es decir, si pongo un link y hago correr la macro Excel indicando las líneas a actualizar, me actualiza bien las columnas con los datos del jugador. 

La pregunta que ayer hacía era para obtener el tipo de carta. Como explicaba en el primer post, hay muchos tipos de carta. Los más importantes son oro común, oro único, plata común y plata único. Hay más tipos pero para empezar vamos con esos 4 tipos de carta.

Ayer finalmente conseguí que al menos me diga si es una carta única o no. 

Pero sinceramente no entiendo porqué funciona o como.... Ya que me daba el resultado contrario al que yo esperaba.

Esta es la parte de la macro que conseguí que funcionara sin saber aún como lo hace...

 

Set curcell = Worksheets("Hoja1").Cells(Counter, 14)      'Con este comando decimos que se coloque en la columna 14 y fila "Counter" que es una variable definida anteriormente para que vaya cambiado para que cambie de fila.
    Dim MyObject As Object    ' Create object variable.        'Este comando lo copie aunque no termino de entender para qué es necesario crear esta variable
    Set MyObject = [G2]    ' Create valid object reference.    'Este comando lo copie excepto lo de [G2] Simplemente fijo ese valor en la variable.
        On Error Resume Next 'Este comando lo copie con la idea de 

If IE.document.getElementsByClassName("card-23 card-23-gold-nr") = True Then 'Con este comando decimos que si encuentra el elemento de clase "card-23 card-23-gold-nr" entonces...
curcell.Value = "Único"   'Con este comando decimos que si ha encontrado el elemento de clase anterior escriba en la celda actual "Único". Pero en mi opinión hay algo que no entiendo aquí. Ya que debería ser al contrario, si encuentra "card-23 card-23-gold-nr" eso seria una carta oro normal, no única.

Else: curcell.Value = "Normal" 'Con este comando decimos que NO ha encontrado el elemento de clase anterior escriba en la celda actual "Normal"

End If

 

Resumen: 

Quiero que actualice el tipo de carta. Existen al menos 4 tipos. Pero no consigo saber como hacerlo. Lo único que he conseguido es que me diga si es único o no. Y en mi opinión hace lo contrario de lo que yo creo que le pido.

A ver si esta vez me he explicado mejor... Si hay algo que no se entiende no dudes en preguntarme.

Enlace a comentario
Compartir con otras webs

En 30/11/2022 at 20:22 , Abraham Valencia dijo:

No me entendiste, me refiero a que, esos valores que te faltan ¿En qué parte de la web están? Indícalo, nosotros no conocemos esa web, la podemos ver, para al ser tú quien requiere ayuda debes dar detalles. 

Hola Abraham, 

El tipo de carta viene en el código de la página de cada jugador. Si hago click derecho sobre la carta y le digo "inspeccionar" se puede ver como a cada carta la nombran de una forma u otra.

En el código de las paginas de cada jugador (en el primer post tienes el link de 1 jugador) puedes encontrar que el "elemento de clase" (<div class="*****") de una carta plata única, es nombrada "card-23 card-23-silver", que una carta oro única es nombrada como "card-23 card-23-gold" o también "card-23 card-23-silver-nr" o "card-23 card-23-gold" si son platas u oros "normales".

Solo hay un tipo de carta en cada página. Es decir, NO puede haber 2 tipos para el mismo jugador.

De esa forma es como he obtenido todos los demás datos de cada jugador. Sin embargo, como puedes ver en la macro del excel... es diferente. Me explico...

En el código de la macro por ejemplo tengo este comando:

curcell.Value = IE.document.getElementsByClassName("pname-h1")(0).innerText

Lo que haría ese comando es obtener el elemento de clase "pname-h1" (nombre del jugador) y ponerlo en la celda seleccionada justo antes. El elemento de clase se llama "pname-h1" y la respuesta a ese comando sería el nombre del jugador.

Ahora lo que realmente quiero es hacer una búsqueda en ese código. Y buscar los 4 tipos de carta descritos anteriormente. Si encuentra uno de esos 4 tipos que lo escriba en la celda. Si no encuentra ninguno de esos 4 tipos que escriba en la celda "Otro" o "especial".

Según la respuesta de Sergio no puedo subir archivos a otras páginas para explicar mejor lo que necesito. Y el archivo que puedo subir aquí me dice que máximo de 32,16kB. Solo una imagen ya pesa 900kB y ayer subí 4.

A ver si esto explica mejor lo que necesito y donde encontrarlo.  

Por último me dices en el mensaje que iexplorer no es lo mejor. Y estoy de acuerdo. Pero no tengo mucha idea de programar. Simplemente intento leer de un lado y de otro. A base de prueba y error... aprendiendo poco a poco. Como sería el código si quisiera que abriese chrome?

Si me animé a registrarme aquí es porque me he quedado ya bloqueado, no sé qué mas probar. A ver si me puedes echar una mano en mejorar esa macro por favor.

Gracias por adelantado

Alex

Enlace a comentario
Compartir con otras webs

En 2/12/2022 at 8:26 , Gnoma dijo:

Hola Abraham, 

El tipo de carta viene en el código de la página de cada jugador. Si hago click derecho sobre la carta y le digo "inspeccionar" se puede ver como a cada carta la nombran de una forma u otra.

Ya lo puse en el primer post y en el anterior. Te digo como lo obtengo, a ver si así se entiende. 

Voy a futwiz, miro cualquier jugador. No importa cual.  Por ejemplo este mismo  https://www.futwiz.com/en/fifa23/player/andre-ramalho/16818

Aparece una carta a la izquierda arriba con la foto del jugador con sus stats. Hago click derecho en la carta y le digo al navegador "inspeccionar". De esa forma me abre el código de la pagina. Ahí puedo ver todo lo que contiene la carta. Su cara, equipo, nacionalidad, posición, etc.

<div class="card-23 card-23-gold-nr
">
<div class="card-23-face"><div class="card-23-face-inner"><img src="https://cdn.futwiz.com/assets/img/fifa23/faces/210007.png" alt="Andre Ramalho 76 Rated"></div></div>
 <div class="card-23-badge"><img src="https://cdn.futwiz.com/assets/img/fifa23/badges/247.png" alt="Badge"></div>
<div class="card-23-flag"><img src="https://cdn.futwiz.com/assets/img/fifa23/flags/54.png" alt="Nation"></div>
<div class="card-23-name">André Ramalho</div>
<div class="card-23-rating">76</div>
<div class="card-23-position">CB</div>
<div class="card-23-atts">
<div class="card-23-atts1">
<div class="card-23-attnum card-23-attnum1">50</div><div class="card-23-attlabel card-23-attlabel1">PAC</div>
<div class="card-23-attnum card-23-attnum4">66</div><div class="card-23-attlabel card-23-attlabel4">DRI</div>
</div>
<div class="card-23-atts2">
<div class="card-23-attnum card-23-attnum2">59</div><div class="card-23-attlabel card-23-attlabel2">SHO</div>
<div class="card-23-attnum card-23-attnum5">77</div><div class="card-23-attlabel card-23-attlabel5">DEF</div>
</div>
<div class="card-23-atts3">
<div class="card-23-attnum card-23-attnum3">67</div><div class="card-23-attlabel card-23-attlabel3">PAS</div>
<div class="card-23-attnum card-23-attnum6">77</div><div class="card-23-attlabel card-23-attlabel6">PHY</div>
</div>
</div>
<div class="card-23-headeroverlay"></div>
<div class="card-23-split card-23-flag-split"></div>
<div class="card-23-split card-23-name-split"></div>
<div class="card-23-split card-23-atts-split"></div>
<div class="card-23-split card-23-chem-split"></div>
<div class="card-23-chemstyleimg"></div>
</div>

En la primera de las líneas de código, dice el tipo de jugador. En este caso es "card-23 card-23-gold-nr" y eso significa que es un "oro normal".  Así es como miro que tipo de jugador es.

A ver si esta vez me expliqué bien.

Enlace a comentario
Compartir con otras webs

En 3/12/2022 at 3:46 , Abraham Valencia dijo:

Nuevamente, era tan fácil como indicar en qué parte de la web está el valor que no logras extraer.  Si lo indicaste con una imagen y era muy grande ¿Por qué no reducirla? Suerte.

Te sirvió con lo que puse en el último post  para saber lo que busco y donde lo busco?

Enlace a comentario
Compartir con otras webs

  • 2 weeks later...

:(

Veo que es complicado recibir una respuesta que me ayude ...

Hace casi 2 semanas desde que puse mi última respuesta sin ninguna posible solución. No sé... no me parece que lo que busco sea tan complicado...  Agradezco si algún alma caritativa puede echarme un cable.

Enlace a comentario
Compartir con otras webs

Hola

Un ejemplo que, creo, podría ayudarte. Ojo, trata de entenderlo y adaptarlo a lo que necesitas:

Sub BuecarenWeb()

Dim ie As Object
Dim Textoabuscar$
Set ie = CreateObject("InternetExplorer.Application")

ie.Navigate "https://www.futwiz.com/en/fifa23/player/andre-ramalho/16818"

Do Until ie.ReadyState = 4
     DoEvents
Loop

ie.Visible = True

Application.Wait (Now + TimeValue("00:00:01"))

Textoabuscar = InStr(1, ie.Document.body.innerhtml, "card-23 card-23-gold-nr")

If Textoabuscar > 0 Then
  MsgBox "Existe"
Else
    MsgBox "No existe"
End If

'ie.Quit
'
'Set ie = Nothing

End Sub

 

Enlace a comentario
Compartir con otras webs

Genial! Con ese código que pusiste modificándolo a mis necesidades y variables ya he conseguido lo que quería! Muchas gracias!

Al conseguir que funcione con los 4 tipos que dije anteriormente (Oro, plata, normal y único) al final he metido todos los tipos que hay (que son como 20 o 30 tipos en total).

Solo me falta una cosa por obtener... Voy a investigar primero a ver si lo consigo yo solo. Si quieres te pongo el código que he usado para que detecte el tipo de carta.

De nuevo, gracias!

 

Enlace a comentario
Compartir con otras webs

En 30/11/2022 at 3:13 , Abraham Valencia dijo:

Hola

Tú sabes dónde está cada cosa que te interesa en esa web, pero ¿Y nosotros? Indícalo para entenderte mejor. Ah, ojo, hoy en día usar el objeto Internet Explorer no es lo más recomendable.

Hola Abraham,

He intentado hacer esto que dices y que abra el navegador chrome. 

A la hora de navegar no sé como tengo que hacer para que navegue a a donde quiero. Tengo una columna que son links. Y luego una variable que va desde un numero hasta otro (Counter). Pongamos que va desde la 10 hasta la 15. De esa forma hago un loop que mira esas 6 urls. Todo esto con internet explorer va bien. Pero con chrome no lo consigo hacer.

Así como seria en Internet Explorer y funciona bien

Sub Abrir_ie()

' Abre internet explorer
Dim IE
Set IE = CreateObject("InternetExplorer.Application")
IE.Visible = True
' Crea la variable Counter
For Counter = [S1] To [U1]
Set curcell = Worksheets("Hoja1").Cells(Counter, 36)
IE.Navigate curcell.Value
' Espera un tiempo determinado
Application.Wait (Now + TimeValue("00:00:03"))
Next

End Sub

Como puedes ver Counter va desde los números que habrá en las celdas [S1] y U1. De esa forma es fácil cambiar las filas que quiero actualizar. 

Así sería para abrir Chrome. Consigo que se abra. Pero no que navegue a "curcell" que sería la celda actual. 

Sub Abrir_chrome()

Dim chromePath As String
' Crea la variable Counter
For Counter = [S1] To [U1]
Set curcell = Worksheets("Hoja1").Cells(Counter, 3)
chromePath = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""
Shell (chromePath & " -url curcell")
' Espera un tiempo determinado
Application.Wait (Now + TimeValue("00:00:03"))

Next

End Sub

Los links están en la columna 3, por eso .Cells(Counter, 3).

Si en lugar de eso pongo....

Shell (chromePath & " -url http:www.google.com")

...Abre chrome y navega a donde le digo. Pero no sé como hacer para que con el comando Shell navegue a la celda en la que se encuentra como sí hacia con Internet Explorer. Puedes echarme una mano?

 

Enlace a comentario
Compartir con otras webs

Hola de nuevo @Abraham Valencia,

He intentado por todos los medios hacer la busqueda con chrome. Pero no lo consigo.

Este código que sigue a continuación funciona bien con Internet Explorer

Sub Actualizar_precio_unicamente()

' Abre internet explorer
Dim ie
Set ie = CreateObject("InternetExplorer.Application")
ie.Visible = True
' Crea la variable Counter
For Counter = [S1] To [U1]
Set curcell = Worksheets("Hoja1").Cells(Counter, 36)
ie.Navigate curcell.Value

' Espera un tiempo determinado
Application.Wait (Now + TimeValue("00:00:10"))

' Añade el precio PS en la columna 4
Set curcell = Worksheets("Hoja1").Cells(Counter, 4)
curcell.Value = ie.document.getElementsByClassName("price-num")(0).innertext

        On Error Resume Next

Next
End Sub

Sin embargo cuando he querido que haga la búsqueda en Chrome no lo he conseguido. He leído algo de las librerias Selenium. Y he probado algunos códigos que he encontrado... Sin exito.

Aquí el código que tengo ahora para intentar hacer búsquedas con Chrome.

Sub Abrir_chrome()

Dim chromePath As String
Dim ie

For Counter = [S1] To [U1]
Set curcell = Worksheets("Hoja1").Cells(Counter, 3)

' Crea la variable Counter

chromePath = """C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"""
Shell (chromePath & " -url " & curcell)
Set ie = CreateObject("Shell.Application")

' Espera un tiempo determinado
Application.Wait (Now + TimeValue("00:00:03"))
    
'Añade el precio PS en la columna 4
Set curcell = Worksheets("Hoja1").Cells(Counter, 4)
curcell.Value = ie.document.getElementsByClassName("price-num")(0).innertext

'MsgBox ie.document.findElementsByClassName("price-num").Text(0)

    
        On Error Resume Next

Next
End Sub

Se abre Chrome, entre los links indicados en las celdas S1 y U1. Hasta ahí todo bien. Lo que no hace es la búsqueda...

curcell.Value = ie.document.getElementsByClassName("price-num")(0).innertext

Ese comando no sé como debería ser usando Chrome. ¿Me podéis echar otro cable por favor?

Gracias por adelantado 

Enlace a comentario
Compartir con otras webs

Hola

Para hacer Web Scraping como el que necesitas a través de Chrome, como ya viste, necesariamente tienes que usar el complemento Selenium, no hay otra forma de controlar dicho navegador con VBA. Particularmente yo no lo uso ni lo usaré, por lo que no podría ayudarte con ello, si decides instalarlo.

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

  • 97 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      177
    • Comentarios
      90
    • Revisiones
      27

  • Crear macros Excel

  • Mensajes

    • Hola, Ya he podido, reoslverlo. Por favor dar por terminado, este tema. Muchas gracias Mariano
    • Buenas a todos, trato de transponer o pivotar el archivo que adjunto. El archivo tiene 3 columnas ( en este caso, como pueden ser más 😞 Cód.artículo, Cód.características y Valor. El objetivo es dejar como primera columna el Cód.artículo y como fila de encabezado Cód.características, y luego cruzando datos con Valor. No sé si me he explicado bien Gracias de antemano. Libro1.xlsx
    • Hola que tal amigos programadores por favor me podrían ayudar con una macro que me genere un archivo CSV delimitado por comas, la estructura del archivo CSV no deberá llevar encabezado, los datos del archivo CSV serán obtenidos de la hoja “Datos”. En la columna A: deberá tener la clave clues que se toma de la columna B de la hoja Datos En la Columna B: el Código (son 230 codigos que van del rango G1:IB1 de la hoja datos) En la Columna C: el valor almacenado a su correspondiente al código y clues En la Columna D: el número del mes que se obtendrá de la de la columna E de la hoja Datos En la Columna E: el año que se tomará de la columna F de la hoja de Datos   Son 230 códigos por lo que la macro generará 230 filas por cada clave clues que tenga la hoja Datos En el archivo anexo una hoja llamada CSV para que vean la estructura que tendrá, el archivo CSV estará delimitado por comas   Les agradecería mucho que me ayuden por favor, Dios los bendiga Exportar datos a csv.xlsx
    • Hola buenas tardes.   Debido al trabajo debo estar comparando en un periodo unos archivos dentro de una carpeta o subcarpeta. en base a la fecha de creacion o modificacion.  pero tengo que estar viendo carpeta por carpeta y aveces son varios. Con una macro intente  listar los archivos de cualquier carpeta y subcarpeta, esto activandolo segun la celdaactiva. El problema es que tiene algunos errores. 1. si la carpeta cuenta con subcarpetas me los manda a muchas filas abajo. Mi idea es hoja(Así debe quedar) Que con una macro pueda seleccionar la carpeta desde el buscador y me de la lista de archivos a partir de la fila 6. siendo columna A= fecha de modificación, columna B =Fecha de creación y columna C=Nombre del archivo con hiperlink. Con otro o con la misma macro poder seleccionar otra carpeta y sus subcarpetas, según sea el caso. y me liste a partir de la columna F de la fila 6 Siendo La columna F=Nombre del archivo, columna H=fecha de creación, columna I=ultima modificación   Para así poder acceder y comparar mis archivos, directamente desde excel.   Muchas gracias Mariano       Listar archivos de 2 carpetas para comparar.xlsm
    • Hola buenas, Os presento mis dudas. Tengo un libro  (llamémosle LibroDestino) con dos módulos, uno de definición de variables "ModDef" y otro de inicializacion de esas mismas variables "ModCfg". Necesito que al copiarme una hoja de otro libro(llamémosle LibroOrigen), mediante un procedimiento, sobrescribir el modulo de inicialización de variables del LibroDestino con el  contenido del módulo que hay en el LibroOrigen. Destacar que los dos módulos de cada libro tienen el mismo nombre "ModCfg". Y tienen una única variable llamada "Mensaje". En el LibroDestino tiene el valor "Hola" y en el LibroOrigen el valor "Adiós" Este procedimiento lo realiza perfectamente,  es decir se sobrescribe, pero si en el mismo procedimiento quiero utilizar el nuevo valor de esa variable, me conserva el valor de la variable anterior. Para hacer las comprobaciones he ejecutado un MsgBox al empezar y al acabar el procedimiento, pero en los dos casos me devuelve el valor original del LibroDestino el valor "Hola", cuando mi idea es que al sobrescribir el modulo con el nuevo valor de la variable, el último MsgBox me devuelva el valor "Adios". Mi objetivo es poder tener la inicialización de esas variables en un libro que no sea el de trabajo (LibroDestino), ya que según la hoja que importe puedo requerir que las variables tengan un valor u otro. ¿Por que no me coge en el procedimiento el nuevo valor de la variable? ¿Cómo podría conseguirlo? He tenido que activar en VBA  la referencia Microsoft visual basic for applications extensibility 5.3 desde  Herramientas -> Referencias. Creo que es la única manera de poder trabajar con los módulos desde VBA, aunque si se pudiera de otra manera creo que sería mas óptimo. Mil gracias de antemano, un saludo!         Libro1_Prueba.xlsm Libro2_Prueba.xlsm
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.