Как остановить Puppeteer от перезаписи дубликатов загрузок?

#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)
}