Как стать автором
Обновить

Комментарии 13

Есть ли способ записи видео со страницы в хэдлэсс режиме на сервере?
Даже не смотря на то, что это перевод, можно добавить не много от себя и обьяснить что ж это за зверь такой и чем он лучше?)
А кто-то сталкивался с задачей обработки загружаемых по ссылке файлов? Крайне желательно с получением в nodejs файла в виде строки, без сохранения его на диск. Пока видится перехват внутри evulate onRequest, создание и исполнение XHR и возврат полученного тела ну или сереилизованного ответа в nodejs.
Могу посоветовать обратить внимание на событие `response`:

page.on('response', response => {
  // Skip http bad statuses.
  if (!response.ok()) return;
  
  const headers = response.headers();

  // Skip any content that type not application/octet-stream
  if (headers['Content-Type'] !== 'application/octet-stream') return;

  const buffer = await response.buffer();
  
  // Do what you want
});

await page.goto('https://example.com/some.file');

Вместо вызова `response.buffer()` можно ещё использовать `response.text()`, если работа идёт с текстовыми файлами.

P.S. этот код полностью исполняется в контексте Nodejs
Как я понимаю здесь не получится предотвратить запись файла на диск?
В последних версиях puppeteer есть Page.setCacheEnabled(false); [соответствует Network.setCacheDisabled({cacheDisabled: true}); в chrome-remote-interface], а раньше просто размер кэша устанавливали в один байт (--disk-cache-size=1 --media-cache-size=1).
Сейчас возникло подозрение, что setCacheEnabled просто запрещает использование кэша, но не мешает сохранять его на диск. Нужно будет проверить.
Если работать с хромом напрямую, то скорее всего можно через
Network.enable();
и
Network.loadingFinished(async (params) => {
  let content = await Network.getResponseBody({requestId: params.requestId});
  /* ....... */
});

Честно говоря, не знаю, есть ли у puppeteer прямой доступ к используемому chrome-remote-interface, но у нас в одном проекте (правда, на основе chrome-pool) доступ к загружаемым стилям и скриптам происходит именно таким образом (там логика чуть сложнее, с использованием requestIntercepted, requestWillBeSent и requestServedFromCache, но суть именно в loadingFinished и getResponseBody).
«Почти всё, что может сделать браузер (кроме интерполирования и запуска JavaScript), можно сделать с помощью простых инструментов Linux»

Так 99% случаев именно изза js его и используют
Ощущение что статья написана каким-то джуном

1. Не используйте headless-браузер вообще

Никакой аргументации не приведено.

Почти всё, что может сделать браузер (кроме интерполирования и запуска JavaScript),

Так headless браузер как раз в основном и используют для сценариев с js

3. Ваш друг page.evaluate


Два приведенных кода сработают по разному. click() внтури evalute и click() через хендлер отличаются как минимум достоверностью события (event.isTrusted)

const puppeteer = require("puppeteer");
(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    page.on("console", (m) => console.log(m.text()));
    await page.evaluate(function () {
        const elem = this.document.documentElement;
        elem.addEventListener("click", e => console.log(e.isTrusted));
        elem.click();
    });
    const elem = await page.$('html');
    await elem.click();
    await browser.close();
})()


4. Распараллеливайте браузеры, а не веб-страницы

Вообще в апи puppeteer есть возможность создавать чистые контексты в
рамках одного запущенного браузера с помощью createIncognitoBrowserContext()
Это существенно дешевле, чем каждый раз запускать новый инстанс браузера
НЛО прилетело и опубликовало эту надпись здесь

Смотря что подразумевать под чистым контекстом. Тут как раз написано что будут отдельные cookie/cache и т.п.
Т.е. это как режим инкогнито (их может быть несколько)

Это не «как режим инкогнито», это он и есть в чистом виде :) Если запускать не в headless режиме это хорошо видно.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории