Comments 13
Есть ли способ записи видео со страницы в хэдлэсс режиме на сервере?
+2
Даже не смотря на то, что это перевод, можно добавить не много от себя и обьяснить что ж это за зверь такой и чем он лучше?)
+2
А кто-то сталкивался с задачей обработки загружаемых по ссылке файлов? Крайне желательно с получением в nodejs файла в виде строки, без сохранения его на диск. Пока видится перехват внутри evulate onRequest, создание и исполнение XHR и возврат полученного тела ну или сереилизованного ответа в nodejs.
0
Могу посоветовать обратить внимание на событие `response`:
Вместо вызова `response.buffer()` можно ещё использовать `response.text()`, если работа идёт с текстовыми файлами.
P.S. этот код полностью исполняется в контексте Nodejs
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
+1
Как я понимаю здесь не получится предотвратить запись файла на диск?
0
В последних версиях puppeteer есть Page.setCacheEnabled(false); [соответствует Network.setCacheDisabled({cacheDisabled: true}); в chrome-remote-interface], а раньше просто размер кэша устанавливали в один байт (--disk-cache-size=1 --media-cache-size=1).
0
Если работать с хромом напрямую, то скорее всего можно через
Честно говоря, не знаю, есть ли у puppeteer прямой доступ к используемому chrome-remote-interface, но у нас в одном проекте (правда, на основе chrome-pool) доступ к загружаемым стилям и скриптам происходит именно таким образом (там логика чуть сложнее, с использованием requestIntercepted, requestWillBeSent и requestServedFromCache, но суть именно в loadingFinished и getResponseBody).
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).
+1
«Почти всё, что может сделать браузер (кроме интерполирования и запуска JavaScript), можно сделать с помощью простых инструментов Linux»
Так 99% случаев именно изза js его и используют
Так 99% случаев именно изза js его и используют
+1
Ощущение что статья написана каким-то джуном
Никакой аргументации не приведено.
Так headless браузер как раз в основном и используют для сценариев с js
Два приведенных кода сработают по разному. click() внтури evalute и click() через хендлер отличаются как минимум достоверностью события (event.isTrusted)
Вообще в апи puppeteer есть возможность создавать чистые контексты в
рамках одного запущенного браузера с помощью createIncognitoBrowserContext()
Это существенно дешевле, чем каждый раз запускать новый инстанс браузера
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()
Это существенно дешевле, чем каждый раз запускать новый инстанс браузера
+1
Sign up to leave a comment.
Опыт 2 миллионов headless-сессий