import { chromium, Download } from 'playwright';
import fs from 'fs';
import path from 'path';
import { URL } from 'url';
async function downloadPDFsFromPage(pageUrl: string, downloadDir: string = 'pdf_downloads') {
// Ensure download directory exists
if (!fs.existsSync(downloadDir)) {
fs.mkdirSync(downloadDir, { recursive: true });
}
console.log('downloadPDFsFromPage',pageUrl);
const browser = await chromium.launch({
headless: false, // Set to true for headless mode
executablePath: "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome",
args: ["--no-sandbox", "--disable-setuid-sandbox"],
});
console.log('browser',browser);
const context = await browser.newContext({
acceptDownloads: true
});
const page = await context.newPage();
await page.goto(pageUrl, { waitUntil: 'domcontentloaded' });
// Get all PDF links (anchors ending with .pdf)
const pdfLinks: string[] = await page.$$eval(
"a[href$='.pdf']",
anchors => anchors.map(a => (a as HTMLAnchorElement).href)
);
console.log(`Found ${pdfLinks.length} PDF(s).`);
for (const rawLink of pdfLinks) {
const pdfUrl = new URL(rawLink, pageUrl).toString();
// Open link in a new tab to trigger download
const [download] = await Promise.all([
page.waitForEvent('download'),
page.click(`a[href='${pdfUrl}']`).catch(async () => {
const pdfPage = await context.newPage();
await pdfPage.goto(pdfUrl);
await pdfPage.close();
})
]);
const urlObj = new URL(pdfUrl);
const filename = path.basename(urlObj.pathname);
const filepath = path.join(downloadDir, filename);
await (download as Download).saveAs(filepath);
console.log(`Downloaded: ${filepath}`);
}
await browser.close();
}
await downloadPDFsFromPage( url , '/Users/liv/Documents/data');
Ожидаемый результат - все PDF будет загружен, но в действительности браузер открывает только первый PDF, но не загружает его, остальные страницы PDF не открываются, а браузер просто закрыт.
>
Вот минимальный код, работающий в Mac, < /p> [code]import { chromium, Download } from 'playwright'; import fs from 'fs'; import path from 'path'; import { URL } from 'url';
// Get all PDF links (anchors ending with .pdf) const pdfLinks: string[] = await page.$$eval( "a[href$='.pdf']", anchors => anchors.map(a => (a as HTMLAnchorElement).href) );
console.log(`Found ${pdfLinks.length} PDF(s).`);
for (const rawLink of pdfLinks) { const pdfUrl = new URL(rawLink, pageUrl).toString(); // Open link in a new tab to trigger download const [download] = await Promise.all([ page.waitForEvent('download'), page.click(`a[href='${pdfUrl}']`).catch(async () => { const pdfPage = await context.newPage(); await pdfPage.goto(pdfUrl); await pdfPage.close(); }) ]); const urlObj = new URL(pdfUrl); const filename = path.basename(urlObj.pathname); const filepath = path.join(downloadDir, filename); await (download as Download).saveAs(filepath); console.log(`Downloaded: ${filepath}`); }
await browser.close(); }
await downloadPDFsFromPage( url , '/Users/liv/Documents/data'); [/code] Ожидаемый результат - все PDF будет загружен, но в действительности браузер открывает только первый PDF, но не загружает его, остальные страницы PDF не открываются, а браузер просто закрыт. >