Esta es mi primera publicación de StackOverflow, así que intentaré describir mi problema lo mejor que pueda.
Quiero crear un programa para recuperar las reseñas de las páginas de TripAdvisor, traté de hacerlo a través de la API pero no respondieron cuando solicité la clave API, por lo que mi alternativa es hacerlo con un WebCrawler.
Para hacerlo tengo un proyecto Spring y uso HtmlUnit, una herramienta que nunca usé, así que para probarlo mi primer ejercicio es recuperar el título de una página web, así que tengo implementado el siguiente código:
@PostConstruct public void init() throws Exception { TimeZone.setDefault(TimeZone.getTimeZone("Europe/Madrid")); getRequest.getPageName(); }Eso llama al siguiente método:
@Test public void getPageName() throws Exception { try (final WebClient webClient = new WebClient()) { final HtmlPage page = webClient.getPage("https://www.tripadvisor.com"); System.out.println(page.getTitleText()); } catch (Exception e){ System.out.println("ERROR " + e); } }Cuando ejecuto el código con https://www.google.com obtengo la respuesta "Google" como se esperaba, pero cuando lo pruebo con https://www.tripadvisor.com o https://www.youtube.com Me sale un error que no puedo entender:
Caused by: net.sourceforge.htmlunit.corejs.javascript.EvaluatorException: syntax error (https://static.tacdn.com/assets/DDGchX.17d9b05f.js#1)Investigué rápidamente para ver qué significa el problema, encontré un par de publicaciones sobre un caso similar, pero no puedo entender cuál es la causa. ¿Está relacionado con un problema de Javascript? O un problema de permisos?
Si se requiere más información para analizar el problema, no dude en solicitarla, gracias de antemano por el tiempo dedicado de cualquier lector y disculpe si no respeté alguna de las reglas/protocolos de StackOverflow.
try (final WebClient webClient = new WebClient()) { webClient.getOptions().setThrowExceptionOnScriptError(false); final HtmlPage page = webClient.getPage("https://www.tripadvisor.com"); // final HtmlPage page = webClient.getPage("https://www.youtube.com"); System.out.println("****************"); System.out.println(page.getTitleText()); System.out.println("****************"); } catch (Exception e){ System.out.println("ERROR " + e); }Al menos con la versión reciente oh HtmlUnit esto produce
**************** Tripadvisor: Read Reviews, Compare Prices & Book ****************¿Qué hace setThrowExceptionOnScriptError?
/** * Changes the behavior of this webclient when a script error occurs. * @param enabled indicates if exception should be thrown or not */HtmlUnit utiliza Rhino ( https://github.com/mozilla/rhino ) como base para la compatibilidad con JavaScript. Y Rhino no es compatible con todas las funciones de lenguaje disponibles en JavaScript hoy (mejorando con cada versión https://htmlunit.sourceforge.io/changes-report.html ). Pero al menos algunas de las páginas usan estas funciones (por ejemplo, para rastrearlo) y, debido a esto, ve el error. HtmlUnit se diseñó originalmente como un marco de prueba, por lo que se detiene ante cada error.
Si cambia eso (vea la configuración de la opción anterior), aún obtiene la salida del registro para cada error, pero el procesamiento de JavaScript continúa (lo mismo en los navegadores reales). También puede cambiar el registro; consulte https://htmlunit.sourceforge.io/logging.html .