Sotrosca / zona-prop-scraper

Scraper de Zonaprop
17 stars 12 forks source link

IndexError: list index out of range #3

Open tomasHolaHello opened 2 years ago

tomasHolaHello commented 2 years ago

@Sotrosca como va? bueno, te cuento que estuve trabajando y aprendiendo bastante del código que compartiste. Hay un error que me encuentro frecuentemente pero no he podido solucionarlo. Al realizar una búsqueda suele tirarme este error:

Running scraper for https://www.zonaprop.com.ar/casas-venta-san-isidro-1-ambiente This may take a while... Traceback (most recent call last): File "C:\xampp\htdocs\tasador\zona-prop-scraper\zonaprop-scraping.py", line 38, in
main(url) File "C:\xampp\htdocs\tasador\zona-prop-scraper\zonaprop-scraping.py", line 22, in main estates = scraper.scrap_website() File "C:\xampp\htdocs\tasador\zona-prop-scraper\src\scraper.py", line 54, in scrap_website estates_quantity = self.get_estates_quantity() File "C:\xampp\htdocs\tasador\zona-prop-scraper\src\scraper.py", line 72, in get_estates_quantity estates_quantity = re.findall(r'\d+.?\d+', soup.find_all('h1')[0].text)[0] IndexError: list index out of range

Esto lo hace intermitentemente. Es decir, talvez al primer intento me tira este error, pero si insisto con la consulta ya no lo tira. Al mismo tiempo, hay consultas particulares que siempre arrojan este resultado sin importar cuanto pueda uno insistir en conseguirlo.

Por lo que entiendo hay un problema con un array vacío:

estates_quantity = re.findall(r'\d+.?\d+', soup.find_all('h1')[0].text)[0] IndexError: list index out of range

aunque no me doy cuenta si el problema es el segundo parámetro que se le pasa a la funcion re.findall():

soup.find_all('h1')[0].text

o el mismo re.findall():

re.findall(param_1, param_2)[0]

tomasHolaHello commented 2 years ago

@Sotrosca como va? Estuve indagando un poco para sortear el error y me encontré con eso:

  1. El error surge cuando en el método get_estates_quantity() que intenta levantar el valor de la cantidad de coincidencias de la búsqueda
  2. La línea de la discordia es, tal como te lo mencionaba anteriormente, estates_quantity = re.findall(r'\d+.?\d+', soup.find_all('h1')[0].text)[0] Entiendo que este error surge cuando r'\d+.?\d+' intenta encontrar un numero separado por punto en el string soup.find_all('h1')[0].text (corregíme si estoy equivocado) Esta búsqueda es nula, por lo tanto el indicador de índice final [0] se encuentra fuera del array.
  3. Cuando este error se da, el resultado que que nos arroja CloudScraper es: Captura Inspeccionando el código nos encontramos con que <h1> es: image Por lo tanto al intentar encontrar un valor numérico separado por punto, fracasa ya que el string es www.zonaprop.com.ar

Algunas sugerencia: Al desconocer si existe algún método propio de cloudscraper par verificar el resultado del scrap, se me ocurrió lo siguiente

  1. Verificar que la búsqueda no arroje el valor de www.zonaprop.com.ar en <h1> antes de proseguir
  2. En caso que lo haga, crear u bucle para repetir u numero limitado de veces el scrap. A veces funciona.
  3. En lugar de buscar el valor numérico con r'\d+.?\d+', yo utilicé split(). Utilizado así pro defecto, devuelve un array con las palabras separadas por espacios en blanco. una vez hecho esto, el indice [0] será la cantidad de coincidencias de la búsqueda

Para cerrar, solo mencionar que no se si se podrá zafar de ese mensaje que te indicaba en el punto 3, me temo que no, y que tiene que ver con insistir tanto en las consultas. Vi que vos tenés un archivo/test/mock/html_page.html que me imagino que lo has usado de base. Yo intente usarlo para no mostrarle mi cara al server de zonaprop con el riesgo de que bloqueen mi IP o algo así, pero no supe como hacer para que levante esa pagina y no la online. Te agradecería si me tiras una mano con eso.

Saludos!