Entonces, estoy usando Puppeteer (un navegador sin cabeza) para rastrear un sitio web, y cuando accedo a esa URL, ¿cómo puedo cargar jQuery para usarlo dentro de mi función page.evaluate()?
Todo lo que tengo ahora es un archivo .js y estoy ejecutando el siguiente código. Va a mi URL según lo previsto hasta que aparece un error en page.evaluate() ya que parece que no está cargando jQuery como pensé que lo haría desde el código en la línea 7: await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.2.1.min.js'})
¿Alguna idea de cómo puedo cargar jQuery correctamente aquí, para poder usar jQuery dentro de mi función page.evaluate()?
(async() => { let url = "[website url I'm scraping]" let browser = await puppeteer.launch({headless:false}); let page = await browser.newPage(); await page.goto(url, {waitUntil: 'networkidle2'}); // code below doesn't seem to load jQuery, since I get an error in page.evaluate() await page.addScriptTag({url: 'https://code.jquery.com/jquery-3.2.1.min.js'}) await page.evaluate( () => { // want to use jQuery here to do access DOM var classes = $( "td:contains('Lec')") classes = classes.not('.Comments') classes = classes.not('.Pct100') classes = Array.from(classes) }); })();Tu estás en el camino correcto.
Además, no veo que se use ningún código jQuery en su función de evaluate . No hay función document.getElement .
La mejor manera sería agregar una copia local de jQuery para evitar errores de origen cruzado.
Se pueden encontrar más detalles en la pregunta ya respondida aquí .
ACTUALIZACIÓN: probé un pequeño fragmento para probar jquery. La versión del titiritero es la 10.4.0.
(async () => { const browser = await puppeteer.launch({headless:false}); const page = await browser.newPage(); await page.goto('https://google.com',{waitUntil: 'networkidle2'}); await page.addScriptTag({path: "jquery.js"}) await page.evaluate( () => { let wrapper = $(".L3eUgb"); wrapper.css("background-color","red"); }) await page.screenshot({path:"hello.png"}); await browser.close(); })();La captura de pantalla es
Entonces, el código jquery definitivamente está funcionando.
Compruebe también si el sitio web del host aún no tiene una instancia de jQuery. En ese caso, necesitaría usar jquery noConflict
$.noConflict();¡Arreglado!
Me di cuenta de que olvidé incluir el código donde hice algunos clics de navegación adicionales después de ir a mi URL inicial, por lo que el problema fue agregar la etiqueta de secuencia de comandos a mi URL inicial en lugar de después de navegar a mi URL de destino final.
También necesitaba usar
await page.waitForNavigation({waitUntil: 'networkidle2'})antes de agregar la etiqueta del script para que la página se cargara por completo antes de agregar el script.