Sei que a pasta de downloads padrão não é um grande problema para projetos pequenos. Para projetos maiores, por outro lado, certamente vai querer organizar os ficheiros descarregados com o Puppeteer em diretórios diferentes. E é aí que o CDP entra em ação. Para atingir este objetivo, vamos manter o código atual e apenas adicionar-lhe algo.
A primeira coisa que nos ocorre é resolver o caminho para o diretório atual. Felizmente, podemos usar o módulo node:path integrado. Tudo o que precisamos de fazer é importar o módulo `path` para o nosso projeto e usar o método `resolve`, como verá daqui a pouco.
O segundo aspeto é definir o caminho no nosso navegador utilizando o CDP. Como disse anteriormente, vamos utilizar o método `.setDownloadBehavior` do Page Domain. Eis como fica o nosso código atualizado com as duas adições:
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()
})()
Eis o que estamos a fazer com o código adicionado:
- Estamos a criar uma nova CDPSession para «comunicar em proto-logo Chrome Devtools»
- Estamos a emitir o evento `Page.setDownloadBehavior` onde a. `behavior` é definido como `allow` para permitir downloads b. `downloadPath` é construído com `node:path` para apontar para a pasta onde iremos armazenar os nossos ficheiros
E isso é tudo o que tem de fazer se quiser alterar o diretório onde os ficheiros são guardados com o Puppeteer. Além disso, também alcançámos o nosso objetivo de criar um web scraper para download de ficheiros.