Влад
Так ты предоставь больше данных. Покажи код, покажи ссылку на проблемную страницу (если можно). Опиши как часто делаешь запросы.
Код слишком большой, и мало документирован, поэтому попробую описать вкратце. Я каждые 15 секунд парсю данные с https://ru.tradingeconomics.com/currencies вот этого сайта. И проблема в том что на какойто десятый или двадцатый раз (рандомно) парсинга страница начинает грузиться бесконечно
Влад
если ставлю timeout без ограничения по загрузке страницы то страница просто бесконечно грузиться, если ставлю ограничения по временни то выдает ошибку что мол время ожидания то которое я поставил прошло
Влад
Я понимаю что если api есть то и парсить не нужно, но вот если мне нужно именно парсить ибо нету api ? что тогда делать ? какому алгоритму парсинга мне следовать ?
Alhimik
ну... вот допустим мне нужно именно парсить, что же тогда делать ?
Ты усложнил задачу и пытаешься решать появившуюся проблему. Если срабатывает лимит на частоту загрузок, то нужно делать запросы реже или использовать прокси.
Alhimik
Я понимаю что если api есть то и парсить не нужно, но вот если мне нужно именно парсить ибо нету api ? что тогда делать ? какому алгоритму парсинга мне следовать ?
Я не про апи. Я про то что все данные приходят по сокетам, тебе нужно брать эти данные и применять к таблице в памяти. И не придётся ничего парсить. У тебя каждую секунду будет актуальная информация.
Влад
Я не про апи. Я про то что все данные приходят по сокетам, тебе нужно брать эти данные и применять к таблице в памяти. И не придётся ничего парсить. У тебя каждую секунду будет актуальная информация.
а ты случайно не знаешь где взять бесплатные прокси ? просто чтобе протестировать как они работают в puppeter, ато я еще не работал с ними
Alhimik
а ты случайно не знаешь где взять бесплатные прокси ? просто чтобе протестировать как они работают в puppeter, ато я еще не работал с ними
С бесплатными прокси ещё больше проблем, если нет опыта. Так как они очень быстро помирают, их нужно часто менять, отслеживать плохие и т.д.
Влад
😢эта жызнь полна боли и разочорования
Влад
а можна как то так сделать чтобе если елемент на странице не загружаеться больше 30секунд то страница перезагружалась ?
Влад
😃
Alhimik
Оберни ожидание селектора в try/catch и поставь таймаут. В блоке catch делай перезагрузку страницы.
Alhimik
page._client.on("Network.webSocketFrameReceived", ({response}) => { if (response.payloadData.slice(0, 2) !== "42") { return; } const data = JSON.parse(response.payloadData.slice(2)); console.log(data); }); await page.goto("https://ru.tradingeconomics.com/currencies");
Alhimik
Внутри data будут такие данные приходить, уже в готовом виде: [ [ 'currencies', [ { s: 'USDISK:CUR', p: 136.15, nch: -0.69, pch: -0.5 }, { s: 'USDHUF:CUR', p: 388.532, nch: 1.022, pch: 0.26 }, { s: 'USDJPY:CUR', p: 134.183, nch: 0.088, pch: 0.07 }, { s: 'DXY:CUR', p: 106.21428, nch: -0.29172, pch: -0.27 }, { s: 'AUDUSD:CUR', p: 0.69843, nch: 0.00413, pch: 0.59 }, { s: 'USDSEK:CUR', p: 10.1695, nch: -0.0432, pch: -0.42 }, { s: 'USDTWD:CUR', p: 30.003, nch: 0.05, pch: 0.17 }, { s: 'USDMXN:CUR', p: 20.40999, nch: -0.04601, pch: -0.22 } ] ]
Влад
^
здесь типа если оно будет грузить больше 42 секунд то будет перезагрузка страницы ?
Alhimik
здесь типа если оно будет грузить больше 42 секунд то будет перезагрузка страницы ?
Нет. У них на сайте для вебсокетов используется библиотека socket.io, у них там перед сообщением префиксы разные есть. Я проверяю, чтобы остальные сообщения не обрабатывались. Так как в них может не быть JSON и будет выброшено исключение при попытке распарсить.
Alhimik
теперь я вообще запустался
Это ответ на предыдущий вопрос про получение данных с сайта.
Alhimik
Не нужно перезагружать страницу и потом парсить HTML, если всё в готовом виде приходит по сокетам.
Влад
Не нужно перезагружать страницу и потом парсить HTML, если всё в готовом виде приходит по сокетам.
да причем здесь сокеты ? я говорю об универсальном решении. Задача такова - если текущая страница загружаеться больше 40 секунд то ее нужно перезагрузить
Влад
😭
Влад
агаа, тогдаа шя попробую
Alhimik
try { // selector } catch (err) { await page.reload(); }
Alhimik
Но алгоритм тот же. Оборачивай page.goto() с таймаутом в try/catch и в кэтче делай что нужно.
Влад
ой не то
Влад
скинул
Alhimik
воо, я правельно сделал ?
Лучше почитать документацию чтобы не делать такое :)
Влад
я жду загрузки селектора, и если он не загружаеться то перезагружаю страницу
Alhimik
вот так ? правельно ?
Да. Таймаут на 40 секунд (или сколько тебе нужно было) добавь только.
Влад
отак ?
Влад
ой
Влад
вот так ?
Alhimik
отак ?
waitUntil нет в опциях у селекторов.
Alhimik
тогда вот так ?
Таймаут в миллисекундах, поэтому надо 40000.
Alhimik
?
Да. Но за такими вопросами в следующий раз лучше в документацию.
Влад
❤️
Влад
а у меня вот еще вопросик) Вот такая вот ошибка вылезает на сервере, она связанна с puppeter
Влад
😄
Влад
вот что у меня написано при запуске браузера
Bogdan
может кто сталкивался? перестал пупитер возврощать координаты для елемента. Просто возврощает все нули. Раньше все работало.
Bogdan
Тестирую в браузере обычном работает, но когда через пупитер запускаю браузер, и даже пишу тоже самое в консоле нифигаю
Bogdan
Для конкретного сайта или для всех?
Я вроде решил проблему, там походу js прятал
Alhimik
Я вроде решил проблему, там походу js прятал
Понятно. Я думал снова что-то с iframe.
Влад
как правильно указать executablePath ? в puppeter
Влад
в интеренте хрен найдешь ответ на этот вопрос
Alhimik
в интеренте хрен найдешь ответ на этот вопрос
В документации есть ответ. const browser = await puppeteer.launch({ executablePath: '/path/to/chrome', });
Влад
😒
Alhimik
пробовал, но у меня по этому пути нету chormiuma
По какому этому? Там написано что нужно указать путь к установленному хрому.
Влад
По какому этому? Там написано что нужно указать путь к установленному хрому.
а откуда мне взять этот путь ? и о какой хроме идет речь ? который у меняя в модулях node.js установлен или как ?
Alhimik
а откуда мне взять этот путь ? и о какой хроме идет речь ? который у меняя в модулях node.js установлен или как ?
Не понимаю чего ты хочешь. Если он у тебя в модулях установлен, то и запускай как обычно. Указание пути нужно чтобы запустить другой хром, например, установленный в системе.
🅰️nimeCoder
Там кстати не хром, а хромиум вроде
🅰️nimeCoder
Причём если именно тот что идёт в комплекте еще и кастомная сборка
Alhimik
Там кстати не хром, а хромиум вроде
Можно указать вообще любой браузер, основанный на хроме/хромиуме. Так как CDP у всех в наличии.
Ruslan
Всем привет! Ребят подскажите есть ли возможность отключить через puppeteer всплывающие сообщения браузера
Ruslan
Ruslan
Извините что фотка просто не могу с сервака скрин сделать
🅰️nimeCoder
Переопределить в window в прелоад скрипте при создании новых страниц
Alex*
А вот это не поможет? await page.evaluate(() => document.alert = window.alert = alert = () => {};)
Ruslan
https://devdocs.io/puppeteer/index#class-dialog
это не помогает что-то
Alhimik
А причём тут alert? Насколько я вижу это запрос на уведомления.
Alhimik
Добавь в аргументы запуска --disable-notifications.
Ruslan
Добавь в аргументы запуска --disable-notifications.
вот я как раз до этого додумался искал подходящий аргумент
Alhimik
Ну или просто зайди в настройки и запрети уведомления (chrome://settings/content/notifications).
Alhimik
Ну и ещё один вариант https://pptr.dev/api/puppeteer.browsercontext.overridepermissions