Saltar al contenido

Copiar datos de una pagina web


Recommended Posts

Hola a todos.

Tratando de terminar mi proyecto me encontré con un lindo problema.

Hace unos meses pasé los valores nutricionales de carbohidratos, proteínas y lípidos de una pagina que tiene un vademécum de la mayoría de los alimentos que hay en el mercado argentino.

La cuestión es que a medida que fui realizando mi proyecto me di cuenta que no era suficiente con esos datos que tenia y que necesitaba la totalidad de los valores nutricionales de cada alimento. Los alimentos que pase fueron 1550 aproximadamente, lindo trabajito...

Investigando un poco me di cuenta que me podría haber ahorrado ese trabajito realizando una macro.

Bueno, vayamos al problema real...

Lo que necesitaria es, una vez en la pagina, seleccionar la primer categoria "FoodCategory" (Así se llama el combobox que elige las categorías de comidas) y clickear sobre 'Aceites, cuerpos grasos y aderezos' y apretar el botón 'Generar Lista'. Una vez que me genera la lista, abrir cada uno de los alimentos que aparece en esa lista y copiar el nombre y valores nutricionales para enviarlos a mi hoja.

Cualquier tipo de ayuda será bienvenida, no quiero estar otras semanas pasando esos datos a una hoja.

Adjunto una hoja que tiene los valores nutricionales que necesito y la forma de organizarlo.

Saludos y gracias de antemano.

Enlace a comentario
Compartir con otras webs

Voy a reformular mi pregunta, dado que me parece demasiado abarcativa.

La pagina tiene el siguiente código de fuente

 <p style="font-size:0.8em;">Seleccionar Categoria:</p>

<select name='FoodCategory' style="font-size:12px;">
<option value='Todas'>Todas
<option value='Aceites, cuerpos grasos y aderezos'>Aceites, cuerpos grasos y aderezos
<option style="color:#777777; " value='Aceites, cuerpos grasos y aderezos-aceites'>  aceites
<option style="color:#777777; " value='Aceites, cuerpos grasos y aderezos-aderezos'>  aderezos
<option style="color:#777777; " value='Aceites, cuerpos grasos y aderezos-cremas'>  cremas
<option style="color:#777777; " value='Aceites, cuerpos grasos y aderezos-grasas sólidas'>  grasas sólidas
<option value='Azúcares, dulces y golosinas'>Azúcares, dulces y golosinas
<option style="color:#777777; " value='Azúcares, dulces y golosinas-golosinas'>  golosinas
<option style="color:#777777; " value='Azúcares, dulces y golosinas-polvos para preparar cacao'>  polvos para preparar cacao
<option style="color:#777777; " value='Azúcares, dulces y golosinas-dulces y mermeladas'>  dulces y mermeladas
<option style="color:#777777; " value='Azúcares, dulces y golosinas-azúcares (incluye miel)'>  azúcares (incluye miel)
<option value='Barras de cereal'>Barras de cereal
<option value='Bebidas'>Bebidas
<option style="color:#777777; " value='Bebidas-bebidas deportivas'>  bebidas deportivas
<option style="color:#777777; " value='Bebidas-jugos concentrados y en polvo'>  jugos concentrados y en polvo
<option style="color:#777777; " value='Bebidas-jugos líquidos'>  jugos líquidos
<option style="color:#777777; " value='Bebidas-infusiones'>  infusiones
<option style="color:#777777; " value='Bebidas-gaseosas'>  gaseosas
<option style="color:#777777; " value='Bebidas-aguas con sabor'>  aguas con sabor
<option style="color:#777777; " value='Bebidas-jugos con leche'>  jugos con leche
<option style="color:#777777; " value='Bebidas-amargos'>  amargos
<option value='Caldos y Sopas'>Caldos y Sopas
<option value='Carnes'>Carnes
<option style="color:#777777; " value='Carnes-procesadas y sustitutos'>  procesadas y sustitutos
<option style="color:#777777; " value='Carnes-frescas'>  frescas
<option style="color:#777777; " value='Carnes-Fiambres y embutidos'>  Fiambres y embutidos
<option style="color:#777777; " value='Carnes-visceras y menudencias'>  visceras y menudencias
<option style="color:#777777; " value='Carnes-mariscos'>  mariscos
<option value='Cereales para desayuno y granolas'>Cereales para desayuno y granolas
<option value='Cereales, pastas y legumbres'>Cereales, pastas y legumbres
<option style="color:#777777; " value='Cereales, pastas y legumbres-pastas simples'>  pastas simples
<option style="color:#777777; " value='Cereales, pastas y legumbres-arroces'>  arroces
<option style="color:#777777; " value='Cereales, pastas y legumbres-harinas'>  harinas
<option style="color:#777777; " value='Cereales, pastas y legumbres-premezclas'>  premezclas
<option style="color:#777777; " value='Cereales, pastas y legumbres-pastas rellenas'>  pastas rellenas
<option style="color:#777777; " value='Cereales, pastas y legumbres-masas de empanadas y tartas'>  masas de empanadas y tartas
<option style="color:#777777; " value='Cereales, pastas y legumbres-legumbres'>  legumbres
<option style="color:#777777; " value='Cereales, pastas y legumbres-otros cereales y subproductos'>  otros cereales y subproductos
<option value='Comida Rápida'>Comida Rápida
<option value='Edulcorantes'>Edulcorantes
<option value='Frutas'>Frutas
<option style="color:#777777; " value='Frutas-procesadas'>  procesadas
<option style="color:#777777; " value='Frutas-Frescas'>  Frescas
<option style="color:#777777; " value='Frutas-desecadas'>  desecadas
<option value='Frutas secas y semillas'>Frutas secas y semillas
<option value='Hortalizas'>Hortalizas
<option style="color:#777777; " value='Hortalizas-procesadas'>  procesadas
<option style="color:#777777; " value='Hortalizas-Frescas'>  Frescas
<option value='Huevos'>Huevos
<option value='Leches'>Leches
<option value='Pan, galletitas y pasteleria'>Pan, galletitas y pasteleria
<option style="color:#777777; " value='Pan, galletitas y pasteleria-galletitas y tostadas (no dulces)'>  galletitas y tostadas (no dulces)
<option style="color:#777777; " value='Pan, galletitas y pasteleria-pan envasado'>  pan envasado
<option style="color:#777777; " value='Pan, galletitas y pasteleria-tortas y bizcochuelos'>  tortas y bizcochuelos
<option style="color:#777777; " value='Pan, galletitas y pasteleria-galletitas dulces'>  galletitas dulces
<option style="color:#777777; " value='Pan, galletitas y pasteleria-facturas y productos de pastelería'>  facturas y productos de pastelería
<option style="color:#777777; " value='Pan, galletitas y pasteleria-pan (sin envase)'>  pan (sin envase)
<option value='Postres y helados'>Postres y helados
<option style="color:#777777; " value='Postres y helados-gelatina y otros postres'>  gelatina y otros postres
<option style="color:#777777; " value='Postres y helados-postres lácteos y helados de crema'>  postres lácteos y helados de crema
<option style="color:#777777; " value='Postres y helados-helados de agua'>  helados de agua
<option value='Quesos'>Quesos
<option style="color:#777777; " value='Quesos-untables y ricotta'>  untables y ricotta
<option style="color:#777777; " value='Quesos-pasta blanda'>  pasta blanda
<option style="color:#777777; " value='Quesos-rallados y en hebras'>  rallados y en hebras
<option style="color:#777777; " value='Quesos-pasta semidura'>  pasta semidura
<option style="color:#777777; " value='Quesos-pasta dura'>  pasta dura
<option value='Salsas'>Salsas
<option value='Snacks'>Snacks
<option value='Yogures'>Yogures
</select>
</div> [/CODE]

yo lo que tendría que hacer es seleccionar en

[CODE]<select name='FoodCategory' style="font-size:12px;">[/CODE]

y clickear sobre

[CODE]<option value='Aceites, cuerpos grasos y aderezos'>[/CODE]

, para luego clickear en el botón

[CODE]<!--boton listar -->
<div style="float:right; width:150px; margin-top:14px;">
<p align="right"><input type='submit' class='button' value='Generar Listado'></p>
</div>[/CODE]

No se como hacer referencia a estos códigos

Enlace a comentario
Compartir con otras webs

Por si sirve de ayuda, en la url de cada alimento sólo varía el número de referencia, el resto es todo igual. De todas formas, al acceder a cada ficha de alimento, veo que solamente es necesaria la siguiente url:

http://www.nutrinfo.com/tabla_composicion_quimica_alimentos.php?FoodId=XXXX

donde XXXX es el código del alimento.

Enlace a comentario
Compartir con otras webs

Gracias Sergio, como punto de partida me sirve y mucho. Para empezar tendría que hacer un bucle en el cual comenzaría en 1 y se le va agregando 1.

Private Sub CommandButton1_Click()
Dim url As String
Dim IE As Object

url = "http://www.nutrinfo.com/tabla_composicion_quimica_alimentos.php?FoodId="
For x = 1 to 99999
Set IE = CreateObject("InternetExplorer.Application")
With IE
.Visible = True
.navigate url & x
Do While .Busy Or .ReadyState <> READYSTATE_COMPLETE
DoEvents
Loop

End With

End Sub[/CODE]

Ahora bien como hago referencia a los datos dentro del macro?

Yo tendria que hacer referencia a todo lo que esta en: <div id="columna-vademecum2" >

Enlace a comentario
Compartir con otras webs

Bueno, leyendo en este foro y otros mas se "me ocurrió" que podría guardar el texto de la columna de la derecha en una variable y extraer solo los datos que necesito... el texto de la columna queda en la variable "texto", agrego dos variables mas que busque "Carbohidratos " y " g", una vez que las encuentra, con un MsgBox que me diga que hay entre las dos variables. Ahora bien, resulta que me dice la primer palabra con el numero, pero yo solo necesito el numero (en este caso el numero es "18"). El código es el siguiente y no sé que estaré haciendo mal.


Private Sub CommandButton1_Click()

Dim url As String
Dim IE As Object
Dim texto As String


url = "http://www.nutrinfo.com/tabla_composicion_quimica_alimentos.php?FoodId=1"
Set IE = CreateObject("InternetExplorer.Application")
With IE
.Visible = True
.navigate url
Do While .ReadyState <> 4: Loop
'obtenemos el texto de la página
texto = IE.Document.getElementById("columna-vademecum2").innerText
principio = "Carbohidratos "
Final = " g"
'Primero con la posición inicial
posicion1 = InStr(texto, principio)
'ahora con la posición final
posicion2 = InStr(texto, Final)
'recuperamos el texto que hay entre esas dos posiciones
dato = Mid(texto, posicion1, (posicion2 - posicion1))
MsgBox "****Este es el texto:***" & vbNewLine & vbNewLine & dato

End With

Set IE = Nothing

End Sub
[/CODE]

Cualquier sugerencia será bienvenida.

Saludos y muchas gracias.

Enlace a comentario
Compartir con otras webs

Revisa al archivo adjunto creo que eso es lo que necesitas. En la hoja "Table" van todos los valores que necesitas sacar, creo que faltan como tres productos, revisa el codigo y lo ajustas para futuras necesidades, basicamente el loop baja cada pagina web con el numero de producto, Para lo que necesitas no es necesario sacarlo del html. es mejor descargar la pagina a una hoja y de ahi sacar lo que se necesita. Me avisas si necesitas mas ayuda

Saludos desde Costa Rica

Help.zip

Enlace a comentario
Compartir con otras webs

Nota: Yo puse el codigo de cada producto en la hoja "data" range("I6:I43") para no hacer muy grande el loop pero bien podrias tener un loop que recorra desde producto 1 hasta el 2000 ya que veo que el producto mas bajo tiene un Id de 10 y el mas alto de 1210, con esto abarcarias todos los productos que pudieran poner a futuro, tienes que tener en cuenta que el URL tiene un 1 al final eso es la pagina si pusieran mas productos deberias crear otra variable para iterar entre 1 & 2 segun la pagina donde se encuentre el producto. Ademas si necesitaras mas datos de esa pagina seria cuestion de poner un poco mas de codigo y extraerla.. corre el codigo con F8 y veras como funciona.. cada pagina wed se descarga en la hoja "Format".

Saludos

Enlace a comentario
Compartir con otras webs

Como te comente en el post anterior los puse ahi manualmente a manera de ejemplo para que el loop no fuera muy grande, pero bien puedes modificar el loop para recorra desde el codigo 1 to 2000 con eso abarcarias cualquier alimento que se encuentre en ese rango.

Saludos

Allan

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 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
    • Agradecido Antoni! Tus sugerencias me ayudaron mucho! Como pudiese hacerte llegar el archivo?
    • Prueba este código. Sin el archivo no te puedo ajustar más. Private Sub btnCargaBancos_Click() 'El tipo de dato debe especificase para cada variable Dim TasaCompra As Double, TasaVenta As Double, InvBanesco As Double, InvVzla As Double Dim MontoBanesco As Double, MontoVzla As Double, TasaDiaBan As Double, TasaDiaVzla As Double Dim TasaActual As Double 'Hay que comprobar que los textbox tienen contenido numérico 'Los datos numéricos solo pueden contener números y el separador decimal, cualquier otro caracter dará error al convertir If Not IsNumeric(txtInverBanesco) Or _ Not IsNumeric(txtInverVzla) Or _ Not IsNumeric(txtTasaCompra) Or _ Not IsNumeric(txtTasaVenta) Then MsgBox "Los datos deben ser numéricos", vbCritical Exit Sub End If InvBanesco = CDbl(txtInverBanesco) InvVzla = CDbl(txtInverVzla) TasaCompra = CDbl(txtTasaCompra) TasaVenta = CDbl(txtTasaVenta) 'Los datos de los divisores no pueden ser 0 (Indeterminación matemática) If TasaCompra = 0 Or _ InvBanesco = 0 Or _ InvVzla = 0 Then MsgBox "Los datos no admiten valor cero", vbCritical Exit Sub End If MontoBanesco = (InvBanesco / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) MontoVzla = (InvVzla / TasaCompra) * (1 - 0.18 / 100) * (TasaVenta * (1 - 0.18 / 100)) TasaDiaBan = (MontoBanesco / InvBanesco) * (1 - 0.055) TasaDiaVzla = (MontoVzla / InvVzla) * (1 - 0.055) If TasaDiaBan < TasaDiaVzla Then TasaActual = TasaDiaBan Else TasaActual = TasaDiaVzla End If 'En VBA, los datos numéricos no admiten ser formateados, formatear directamente en las celdas, 'MontoBanesco = FormatNumber(MontoBanesco, 2, True, vbFalse) 'MontoVzla = FormatNumber(MontoVzla, 2, True, vbFalse) 'TasaActual = FormatNumber(TasaActual, 5, True, False) txtBcoBanesco = MontoBanesco txtBcoVenezuela = MontoVzla txtTasaDiaria = TasaActual End Sub  
  • 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.