Ich weiß, dass der Standard-Download-Ordner für kleine Projekte kein großes Problem darstellt. Bei größeren Projekten hingegen wirst du die mit Puppeteer heruntergeladenen Dateien sicherlich in verschiedenen Verzeichnissen organisieren wollen. Und genau hier kommt CDP ins Spiel. Um dieses Ziel zu erreichen, behalten wir den aktuellen Code bei und ergänzen ihn lediglich.
Als Erstes fällt einem ein, den Pfad zum aktuellen Verzeichnis aufzulösen. Glücklicherweise können wir das integrierte Modul `node:path` verwenden. Wir müssen lediglich das Modul `path` in unser Projekt importieren und die Methode `resolve` verwenden, wie Sie gleich sehen werden.
Der zweite Aspekt ist die Einstellung des Pfads in unserem Browser mithilfe von CDP. Wie bereits erwähnt, verwenden wir die Methode `.setDownloadBehavior` der Page Domain. So sieht unser aktualisierter Code mit den beiden Ergänzungen aus:
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()
})()
Das erreichen wir mit dem hinzugefügten Code:
- Wir erstellen eine neue CDPSession, um das „Raw Chrome Devtools Protocol“ zu nutzen
- Wir lösen das `Page.setDownloadBehavior`-Ereignis aus, wobei a. `behavior` auf `allow`-Downloads gesetzt ist b. `downloadPath` mit `node:path` aufgebaut wird, um auf den Ordner zu verweisen, in dem wir unsere Dateien speichern
Und das ist alles, was Sie tun müssen, wenn Sie das Verzeichnis ändern möchten, in dem Dateien mit Puppeteer gespeichert werden. Darüber hinaus haben wir auch unser Ziel erreicht, einen Web-Scraper zum Herunterladen von Dateien zu erstellen.