Foros del Web » Programando para Internet » Python »

[SOLUCIONADO] Ejecutar función onclick con BeautifulSoup??

Estas en el tema de Ejecutar función onclick con BeautifulSoup?? en el foro de Python en Foros del Web. Estoy haciendo un script que analiza una web en concreto en busca de productos pero estos productos están paginados. Para que te lleve a la ...
  #1 (permalink)  
Antiguo 04/07/2015, 09:30
 
Fecha de Ingreso: diciembre-2004
Mensajes: 7
Antigüedad: 19 años, 11 meses
Puntos: 0
Ejecutar función onclick con BeautifulSoup??

Estoy haciendo un script que analiza una web en concreto en busca de productos pero estos productos están paginados. Para que te lleve a la siguiente página tiene un link que tiene un atributo onclick con una función, la cuál te lleva a la siguiente página.

¿Cómo puedo ejecutar esa función con BeautifulSoup? ¿Debo usar Mechanize? ¿O mejor Selenium? A ver si me dais alguna idea porque soy nuevo en Python y no he usado nunca ni Mechanize ni Selenium.

Gracias de antemano!!
  #2 (permalink)  
Antiguo 04/07/2015, 22:58
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Ejecutar función onclick con BeautifulSoup??

Veo que estas haciendo crawling y scrapping de datos, creo que lo mejor es analizar como hace el paginado. Tal vez solo añade un parámetro a la url, tal vez no, lo hace llamadas a apis donde regresa json o tal vez hace una llamada y trae solo html y hace un reemplazo.

Tienes que analizar que peticiones http esta haciendo y ver como puedes simular eso en python.
¿Que pagina es, tal vez te podamos ayudar?
  #3 (permalink)  
Antiguo 05/07/2015, 03:30
 
Fecha de Ingreso: diciembre-2004
Mensajes: 7
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Ejecutar función onclick con BeautifulSoup??

Cita:
Iniciado por razpeitia Ver Mensaje
Veo que estas haciendo crawling y scrapping de datos, creo que lo mejor es analizar como hace el paginado. Tal vez solo añade un parámetro a la url, tal vez no, lo hace llamadas a apis donde regresa json o tal vez hace una llamada y trae solo html y hace un reemplazo.

Tienes que analizar que peticiones http esta haciendo y ver como puedes simular eso en python.
¿Que pagina es, tal vez te podamos ayudar?
La página donde están los artículos es la siguiente:
https://www.aromas.es/categorias/perfumes/01

Dentro de la web, el link que te muestra la siguiente página es el "Ver Más".
Por lo que he podido comprobar, para mostrarte la siguiente página necesita saber donde estás (perfumes de hombre, de mujer, etc) para mostrarte así la siguiente página de la categoría en la que estes. También he comprobado que esto lo debe de guardar algún hidden, cookie o similar, ya que por ejemplo, si copias la url de la página 2 de perfumes de hombre y te vas a la sección perfumes de mujer, pegas el link que habiamos copiado en la barra de direcciones del navegador y accedes, la página se hace un lío. Te muestra el encabezado y demas de perfumes de hombre (de la que pegamos la url) pero los artículos de mujer (donde nos encontrabamos).

Estoy escribiendo desde el móvil por lo que perdonad si no me explicado demasiado bien.

Última edición por franthebaby; 05/07/2015 a las 03:37
  #4 (permalink)  
Antiguo 05/07/2015, 21:37
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Ejecutar función onclick con BeautifulSoup??

Ok vamos a ver un poco:

Primera petición (Ok, todo parece normal).
Código HTML:
Ver original
  1. https://www.aromas.es/categorias/perfumes/01

Segunda petición (WTF?! varios parametros y un jsessionid)
Código HTML:
Ver original
  1. https://www.aromas.es/categorias/perfumes/01;jsessionid=91A7A8305ED54A8F5953E91D9AF69320?p_p_id=ProductosPortlet_WAR_aromasportlets&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-3&p_p_col_pos=3&p_p_col_count=4&_ProductosPortlet_WAR_aromasportlets_accion=buscar&_ProductosPortlet_WAR_aromasportlets_operacion=paginar&_ProductosPortlet_WAR_aromasportlets_pagina=2

Mismos parámetros (diferentes valores) pero sin el jsessionid
Código HTML:
Ver original
  1. https://www.aromas.es/categorias/perfumes/01?p_p_id=ProductosPortlet_WAR_aromasportlets&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-3&p_p_col_pos=3&p_p_col_count=4&_ProductosPortlet_WAR_aromasportlets_accion=buscar&_ProductosPortlet_WAR_aromasportlets_operacion=paginar&_ProductosPortlet_WAR_aromasportlets_pagina=3

Despues de abrir y cerrar varias ventanas en modo privado me di cuenta que, si usas la segunda url pero cambias la pagina (la que tiene jsessionid) te lleva a esa pagina. Al parecer tiene una cookie o una sessión que persiste pero nuestro script en python no persiste datos a menos que lo hagamos explicitamente.

Con lo cual podemos hacer un script simple como:
Código Python:
Ver original
  1. # coding: utf-8
  2. import urllib2
  3.  
  4. url = "https://www.aromas.es/categorias/perfumes/01;jsessionid=91A7A8305ED54A8F5953E91D9AF69320?p_p_id=ProductosPortlet_WAR_aromasportlets&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-3&p_p_col_pos=3&p_p_col_count=4&_ProductosPortlet_WAR_aromasportlets_accion=buscar&_ProductosPortlet_WAR_aromasportlets_operacion=paginar&_ProductosPortlet_WAR_aromasportlets_pagina=%d"
  5. url_list = [url % i for i in range(1, 11)]
  6.  
  7. for i, url in enumerate(url_list, start=1):
  8.     response = urllib2.urlopen(url)
  9.     html = response.read()
  10.     response.close()
  11.  
  12.     with open('perfumes-%02d.html' % i, 'wb') as f:
  13.         f.write(html)
  #5 (permalink)  
Antiguo 06/07/2015, 02:15
 
Fecha de Ingreso: diciembre-2004
Mensajes: 7
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Ejecutar función onclick con BeautifulSoup??

Ese script que pones no creo que funcione puesto que, como dices, la web guarda en alguna cookie o session un parametro que le dice donde estamos (perfumes de mujer, de hombre, maquillaje, etc).
Cuando pulsamos el botón "Ver Más" parece que lo único que hace es mostrarte la siguiente página (el número de la página si va en la url) de la categoría en la que te encuentres.

Si haces la siguiente prueba, entenderás lo que te comento:

Vamos al inicio de la categoría Perfumes de Mujer
Código:
https://www.aromas.es/categorias/perfumes/mujer/0101
Pulsamos en "Ver Más" para acceder a la segunda página de Perfumes de Mujer. Una vez estemos en la segunda página, tendremos la siguiente URL en nuestra barra de direcciones:
Código:
https://www.aromas.es/categorias/perfumes/mujer/0101?p_p_id=ProductosPortlet_WAR_aromasportlets&p_p_lifecycle=1&p_p_state=normal&p_p_mode=view&p_p_col_id=column-3&p_p_col_pos=2&p_p_col_count=3&_ProductosPortlet_WAR_aromasportlets_accion=buscar&_ProductosPortlet_WAR_aromasportlets_operacion=paginar&_ProductosPortlet_WAR_aromasportlets_pagina=2
Copiamos la URL que nos muestra la barra de direcciones y ahora vamos a otra categoría, Maquillajes --> Uñas, por ejemplo. Una vez ahí, pegamos el link que hemos copiado antes y observamos que productos nos muestra...

Resultado: El resultado es que mostrará la segunda página pero... ¿De qué categoria? El link le indica que debería ser de Perfumes de Mujer pero algún parámetro le indica que nos encontramos en Maquillaje --> Uñas, por lo que te mostrará los productos de la segunda página de Maquillaje --> Uñas.
También podrás ver que, aunque te muestra los productos de la categoría en la que te encuentras, el título y demás si que corresponden a la categoría que le indica la URL que hemos pegado.
  #6 (permalink)  
Antiguo 06/07/2015, 07:36
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Ejecutar función onclick con BeautifulSoup??

Cita:
Iniciado por franthebaby Ver Mensaje
Ese script que pones no creo que funcione puesto que, como dices, la web guarda en alguna cookie o session un parametro que le dice donde estamos.
Si, si funciona, si no, no me hubiera molestado en hacerlo y publicarlo.
De hecho así consegui las primeras 10 paginas de perfumes.

Ojo tal vez esa sesion expiro, pero puedes generar una nueva.
  #7 (permalink)  
Antiguo 06/07/2015, 09:36
 
Fecha de Ingreso: diciembre-2004
Mensajes: 7
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Ejecutar función onclick con BeautifulSoup??

Cita:
Iniciado por razpeitia Ver Mensaje
Si, si funciona, si no, no me hubiera molestado en hacerlo y publicarlo.
De hecho así consegui las primeras 10 paginas de perfumes.

Ojo tal vez esa sesion expiro, pero puedes generar una nueva.
No he podido probarlo aún, luego cuando salga de trabajar lo probaré.

Yo decía que pensaba que no funcionaría sin probarlo, simplemente leyendo el código.

Luego cuando lo pruebe, veo que tal y te comento.

Por cierto, muchísimas gracias por tu ayuda y tu tiempo
  #8 (permalink)  
Antiguo 07/07/2015, 13:14
 
Fecha de Ingreso: diciembre-2004
Mensajes: 7
Antigüedad: 19 años, 11 meses
Puntos: 0
Respuesta: Ejecutar función onclick con BeautifulSoup??

Bueno pues por fin he podido probar tu código. Funciona perfectamente.

Voy a rediseñar un poco mi código para aplicar la solución que me has dado.

Muchas gracias por tu ayuda. Da gusto pertenecer a un foro así.

Etiquetas: gui, ip, onclick
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:06.