#node.js #puppeteer
Вопрос:
У меня есть сценарий кукловода, который запускается в cronjob на Ubuntu в безголовом режиме. (также работает с headless: false при тестировании на моем ПК (OS X), который в основном удаляет определенную веб-страницу, которая динамически загружает данные на основе некоторых параметров и загружает целую кучу PDF-файлов. Проблема в том, что ссылки для загрузки файлов недоступны, так как каждый файл содержит ссылку, указывающую на ссылку для загрузки, которая хранится в базе данных. Поэтому единственным решением, которое я нашел, было жестко запрограммировать действие : пройдите по списку файлов, щелкните правой кнопкой мыши(появится кнопка загрузки) и нажмите «Загрузить» для каждого файла (проверьте фрагмент кода ниже).
// get li elements with pdf files
const listdownload = await page.$('#j_idt68 > div > #idPanelContent > div > div > #idDetaliicomunicare > div > div > div > ul > li > .ui-treenode-children > li > span');
// loop through each element then right click click download
for (let iteminlistdownload of listdownload){
await iteminlistdownload.click({button: 'right',});
await delay(3000);
let [viz] = await page.$x('//*[@id="idDetaliicomunicare:j_idt163"]/ul/li/a');
viz.click().catch(e => {});
await delay(3000);
}
Там могут быть сотни, тысячи файлов, и вы можете только представить, что довольно сложно определить, какие файлы являются дубликатами. Когда происходит загрузка, дубликаты не просто переименовываются с помощью (1), (2) .. и т. Д., Как это обычно бывает, А просто перезаписывают предыдущую версию, что нехорошо, так как мне нужен каждый из них. (Одно и то же имя файла не обязательно означает одно и то же содержимое. может быть одно и то же имя, но разное содержание).
Есть ли способ сохранить дубликаты тоже?
Комментарии:
1. Я не знаю, как это сделать, но в качестве альтернативы вы можете просто переименовать каждый файл в уникальное имя после его загрузки?
2. @Бенни, привет. Извините за столь поздний ответ. Я вроде как перестал проверять почту. К сожалению, я не могу этого сделать, так как эти файлы загружаются государственными бенефициарами и являются собственностью нашего правительства (включая веб-сайт, который я просматриваю).
Ответ №1:
во-первых, вы должны получить pdf-файл в полноэкранном режиме и использовать встроенную функцию puppeteer pdf
await page.pdf({ path: 'page.pdf' });
назовите его URL-адресом, чтобы отслеживать дубликаты
затем вы можете поместить функцию загрузки кукольника в условный оператор, который проверяет, существует ли файл с таким именем, оттуда вы можете либо не загружать, либо выполнить другую версию кода кукольника, которая переименовывает путь загрузки, добавив или изменив строку пути
const fs = require('fs')
const path = './file.pdf'
try {
if (fs.existsSync(path)) {
// file exists and do not execute download
}
} catch(err) {
console.error(err)
}