Saltar al contenido

Copiar datos de una pagina web


Recommended Posts

publicado

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.

publicado

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

publicado

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" >

publicado

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.

publicado

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

publicado

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

publicado

Muchas gracias por la ayuda Allan.

Detenidamente voy a explorar el código, pero ante una vista por encima vi que los id de cada alimento están en una tabla en la hoja "Table". Éstos fueron pasados manualmente? o los extrajiste con una macro?

publicado

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

Archivado

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

×
×
  • 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.