Sé que la carpeta de descargas predeterminada no supone un gran problema para proyectos pequeños. Sin embargo, en proyectos más grandes, seguramente querrás organizar los archivos descargados con Puppeteer en diferentes directorios. Y ahí es donde entra en juego CDP. Para lograr este objetivo, mantendremos el código actual y solo le añadiremos elementos.
Lo primero que se nos ocurre es resolver la ruta al directorio actual. Por suerte, podemos usar el módulo integrado `node:path`. Todo lo que tenemos que hacer es importar el módulo `path` a nuestro proyecto y usar el método `resolve`, como verás en un momento.
El segundo aspecto es configurar la ruta en nuestro navegador utilizando CDP. Como dije antes, utilizaremos el método `.setDownloadBehavior` de Page Domain. Así es como queda nuestro código actualizado con las dos adiciones:
import puppeteer from "puppeteer"
import path from 'path'
(async () => {
const browser = await puppeteer.launch({ headless: false })
const page = await browser.newPage()
const client = await page.target().createCDPSession()
await client.send('Page.setDownloadBehavior', {
behavior: 'allow',
downloadPath: path.resolve('./documents')
});
await page.goto('https://www.nasa.gov/centers/dryden/research/civuav/civ_uav_doc-n-ref.html',
{ waitUntil: 'networkidle0' })
const tr_elements = await page.$x('html/body/div[1]/div[3]/div[2]/div[2]/div[5]/div[1]/table[2]/tbody/tr')
for (let i = 1; i<=tr_elements.length; i ++) {
const text = await tr_elements[i].evaluate(el => el.textContent)
if (text.toLocaleLowerCase().includes('doc')) {
try {
await page.click(`#backtoTop > div.box_710_cap > div.box_710.box_white.box_710_white > div.white_article_wrap_detail.text_adjust_me > div.default_style_wrap.prejs_body_adjust_detail > table:nth-child(6) > tbody > tr:nth-child(${i}) > td:nth-child(3) > a`)
} catch {}
}
}
await browser.close()
})()
Esto es lo que hacemos con el código añadido:
- Estamos creando una nueva CDPSession para «comunicarnos mediante el protocolo Chrome Devtools sin procesar»
- Estamos emitiendo el evento `Page.setDownloadBehavior` donde a. `behavior` se establece en `allow` para permitir descargas b. `downloadPath` se construye con `node:path` para apuntar a la carpeta donde almacenaremos nuestros archivos
Y eso es todo lo que tienes que hacer si quieres cambiar el directorio en el que se guardan los archivos con Puppeteer. Además, también hemos logrado nuestro objetivo de crear un rastreador web para la descarga de archivos.