¿Por qué headless tiene que ser falso para que Puppeteer funcione?
Estoy creando una API web que extrae una URL determinada y la envía de vuelta. Estoy usando Puppeteer para hacer esto. Hice esta pregunta: Titiritero no se comporta como en Developer Console
y recibí una respuesta que sugería que solo funcionaría si headless estaba configurado como falso. No quiero abrir constantemente una interfaz de usuario del navegador que no necesito (¡solo necesito los datos!), así que estoy buscando por qué headless tiene que ser falso y puedo obtener una solución que permita headless = true .
Aquí está mi código:
express()
.get("/*", (req, res) => {
global.notBaseURL = req.params[0];
(async () => {
const browser = await puppet.launch({ headless: false }); // Line of Interest
const page = await browser.newPage();
console.log(req.params[0]);
await page.goto(req.params[0], { waitUntil: "networkidle2" }); //this is the url
title = await page.$eval("title", (el) => el.innerText);
browser.close();
res.send({
title: title,
});
})();
})
.listen(PORT, () => console.log(`Listening on ${PORT}`));
Esta es la página que estoy intentando eliminar: https://www.nordstrom.com/s/zella-high-waist-studio-pocket-7-8-leggings/5460106?origin=coordinating-5460106-0-1 -FTR-recbot-recently_viewed_snowplow_mvp&recs_placement=FTR&recs_strategy=recently_viewed_snowplow_mvp&recs_source=recbot&recs_page_type=categoría&recs_seed=0&color=NEGRO
La razón por la que podría funcionar en modo UI pero no sin cabeza es que los sitios que luchan agresivamente contra el scraping detectarán que estás ejecutando un navegador sin cabeza.
Algunas posibles soluciones:
Usarpuppeteer-extra
Encontrado aquí: https://github.com/berstend/puppeteer-extra Consulte sus documentos para saber cómo usarlo. Tiene un par de complementos que pueden ayudar a superar la detección del modo sin cabeza:
puppeteer-extra-plugin-anonymize-ua
-- anonimiza a su agente de usuario. Tenga en cuenta que esto podría ayudar a superar la detección del modo sin cabeza, pero como verá si visita https://amiunique.org/ , es poco probable que sea suficiente para evitar que lo identifiquen como un visitante recurrente.puppeteer-extra-plugin-stealth
-- esto podría ayudar a ganar el juego del gato y el ratón de no ser detectado como un animal sin cabeza. Hay muchos trucos que se emplean para detectar el modo sin cabeza y otros tantos trucos para evadirlos.
Ejecute una instancia/UI de Chromium "real"
Es posible ejecutar una única interfaz de usuario de navegador de manera que le permita adjuntar el titiritero a esa instancia en ejecución. Aquí hay un artículo que lo explica: https://medium.com/@jaredpotter1/connecting-puppeteer-to-existing-chrome-window-8a10828149e0
Básicamente, estás iniciando Chrome o Chromium (¿o Edge?) desde la línea de comandos --remote-debugging-port=9222
(¿o algún puerto antiguo?) además de otros modificadores de línea de comandos dependiendo del entorno en el que lo estés ejecutando. Luego usas el titiritero para conectarte a ese entorno en ejecución. instancia en lugar de hacer que realice el comportamiento predeterminado de iniciar una instancia Chromium sin cabeza: const browser = await puppeteer.connect({ browserURL: ENDPOINT_URL });
. Lea los documentos del titiritero aquí para obtener más información: https://pptr.dev/#?product=Puppeteer&version=v5.2.1&show=api-puppeteerlaunchoptions
Se ENDPOINT_URL
muestra en la terminal cuando inicia el navegador desde la línea de comando con la --remote-debugging-port=9222
opción.
Esta opción requerirá algo de mojo de servidor/operaciones, así que prepárate para hacer muchas más búsquedas de Stack Overflow. :-)
Estoy seguro de que existen otras estrategias, pero esas son las dos con las que estoy más familiarizado. ¡Buena suerte!
La respuesta de Todd es exhaustiva, pero vale la pena probarla antes de recurrir a algunas de las recomendaciones que hay que aplicar a la siguiente línea de agente de usuario extraída del problema relevante de Puppeteer GitHub. Comportamiento diferente entre { headless: false } y { headless: true } :
const ua =
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36";
await page.setUserAgent(ua);
await page.goto(yourURL);
Ahora, el sitio Nordstorm proporcionado por OP parece ser capaz de detectar robots incluso con headless: false
, al menos por el momento. Pero otros sitios son menos estrictos y he encontrado que la línea anterior es útil en algunos de ellos, como se muestra en Puppeteer can't find elements when Headless TRUE y Puppeteer, lo que devuelve una matriz en blanco , entre muchos otros casos.
Visite el hilo de problemas de GH anterior para obtener otras ideas y consulte useragents.me y el paquete npm de agentes de usuario para obtener una lista rotativa de agentes de usuario actuales. Es posible que el que se proporciona aquí no funcione.
https://bot.sannysoft.com/ es una herramienta útil para comprobar hasta qué punto su script puede verse como un bot.