Pull to refresh

Comments 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()
Это существенно дешевле, чем каждый раз запускать новый инстанс браузера
UFO just landed and posted this here

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

Это не «как режим инкогнито», это он и есть в чистом виде :) Если запускать не в headless режиме это хорошо видно.
Sign up to leave a comment.

Articles