Para un proyecto, estoy extrayendo reseñas de hoteles usando python. Tengo una lista de más de 100 hoteles y estoy extrayendo 1.500 reseñas de cada uno. El problema es que algunos de los hoteles no tienen tantas reseñas. Lo que pasa es que cuando no se llega a 1.500 el bucle se para y da error.
Aquí está mi código:
# The number of reviews to obtain per hotel reviewsToGet = 1500 # Loop for all hotels for index, row in hotelsToScrap.iterrows(): # Present feedback on which hotel is being processed print("Processing hotel", index) # Reset counter per hotel reviewsExtracted = 0 # Loop until it extracts the pre-defined number of reviews while reviewsExtracted<reviewsToGet: # Define URL to use based on the number of reviews extracted so far urlToUse = row['URL'] if reviewsExtracted>0: repText = "-Reviews-or"+str(reviewsExtracted)+"-" urlToUse = urlToUse.replace("-Reviews-",repText) # Open and read the web page content soup = openPageReadHTML(urlToUse) # Process web page hotelReviews = processPage(soup, index, hotelReviews) # Update counter reviewsExtracted = reviewsExtracted + 5 # Present feedback on the number of extracted reviews print("Extracted ",reviewsExtracted,"/",reviewsToGet) # Save the extracted reviews data frame to an Excel file hotelReviews.to_excel("ExtractedReviewsComplete.xlsx")¿Qué hago para que arranque la extracción aunque no llegue a los 1.500?
Es difícil saberlo sin conocer el error exacto, pero supongo que cuando la condición del bucle while es verdadera, es cuando reviewsExtracted es menor que reviewsToGet y en realidad no hay más revisiones, parte de su código todavía está tratando de extraer revisiones, pero ¡En realidad no hay más reseñas! Aquí:
repText = "-Reviews-or"+str(reviewsExtracted)+"-" urlToUse = urlToUse.replace("-Reviews-",repText) Simplemente configura la nueva URL urlToUse usando el valor reviewsExtracted , que probablemente no esté en el sitio web.
Por lo tanto, agregaría una condición más para verificar primero si hay revisiones para extraer antes de extraer, o usar try y except para detectar el error exacto, creo que sucede en esta línea:
soup = openPageReadHTML(urlToUse)De su publicación, supongo que el número 1500 es un techo , por ejemplo. "Esta es la cantidad máxima de reseñas que quiero obtener para cada hotel. Si un hotel tiene menos de 1500 reseñas, obtenga todas y continúe".
Sugeriría cambiar su enfoque de confiar en las 1500 reseñas máximas como condición para usarlo como una señal que indica cuándo detenerse y pasar al siguiente hotel.
Sin embargo, si solo desea que su implementación actual se ejecute, haga lo que han dicho varios de los otros comentaristas: implemente el manejo de excepciones para que su proceso pueda continuar cuando encuentre un error.
Ejemplo, usando su código:
reviewsToGet = 1500 # Loop for all hotels for index, row in hotelsToScrap.iterrows(): print("Processing hotel", index) reviewsExtracted = 0 try: # Loop until it extracts the pre-defined number of reviews while reviewsExtracted<reviewsToGet: # Define URL to use based on the number of reviews extracted so far urlToUse = row['URL'] if reviewsExtracted>0: repText = "-Reviews-or"+str(reviewsExtracted)+"-" urlToUse = urlToUse.replace("-Reviews-",repText) # Open and read the web page content soup = openPageReadHTML(urlToUse) # Process web page hotelReviews = processPage(soup, index, hotelReviews) # Update counter reviewsExtracted = reviewsExtracted + 5 # Present feedback on the number of extracted reviews print("Extracted ",reviewsExtracted,"/",reviewsToGet) except Exception as err: print("[+] Exception encountered! Most likely because hotel has too few reviews, but check stack trace. Continuing anyways.") pass # Save the extracted reviews data frame to an Excel file hotelReviews.to_excel("ExtractedReviewsComplete.xlsx")El enfoque más simple sería realizar un while dentro de un bloque try-except{} de la siguiente manera:
# The number of reviews to obtain per hotel reviewsToGet = 1500 # Loop for all hotels for index, row in hotelsToScrap.iterrows(): # Present feedback on which hotel is being processed print("Processing hotel", index) # Reset counter per hotel reviewsExtracted = 0 # Loop until it extracts the pre-defined number of reviews while reviewsExtracted<reviewsToGet: try: # Define URL to use based on the number of reviews extracted so far urlToUse = row['URL'] if reviewsExtracted>0: repText = "-Reviews-or"+str(reviewsExtracted)+"-" urlToUse = urlToUse.replace("-Reviews-",repText) # Open and read the web page content soup = openPageReadHTML(urlToUse) # Process web page hotelReviews = processPage(soup, index, hotelReviews) # Update counter reviewsExtracted = reviewsExtracted + 5 # Present feedback on the number of extracted reviews print("Extracted ",reviewsExtracted,"/",reviewsToGet) except: continue # Save the extracted reviews data frame to an Excel file hotelReviews.to_excel("ExtractedReviewsComplete.xlsx")PD: en lugar de capturar la excepción sin procesar, debe capturar solo las excepciones requeridas que desea evitar.