Aleksey
покажешь реализацию? у меня не завелся гост курсор
У меня по инструкции заработало const loginInput = await Promise.race([ page.waitForXPath('//*[@name="email-or-phone"]'), // signup page.waitForXPath('//*[@name="email-address"]'), // signup page.waitForXPath(`//input[@aria-label="Email or Phone"]`), // login page.waitForXPath(`//input[@id="username"]`) // login ]); const cursor = createCursor(page); await cursor.move(loginInput); await cursor.click(loginInput); await typeAsync(loginInput, request.email);
Aleksey
это не на комон js?
Это кусок кода на node.js с уже созданными инстансами пюпитировских browser и page
Aleksey
А что за сайт который отслеживает движения мышью?
линкедин - пытаюсь автоматизировать на нем регистрацию и не могу пройти капчу Капча решается через антигейт, и если подставлять их решение вручную в html, то все работает, а вот, если пытаться все заполнить автоматом, то получается бесконечная ошбка вида Your noCaptcha user response code is missing or invalid.
Akbarovich
У кого нибудь были такие проблеми?
Null
У кого нибудь были такие проблеми?
А зачем ты меняешь базовую ссылку? Судя по коду 404, он не может по данному URL найти архив с хромом.
Akbarovich
У кого нибудь были такие проблеми?
Просто вышла другая ошибка с дефолтом URL как это
Slavik
Я чет не то сказанул, так у тебя же есть любой браузер на v8
Slavik
Ты просто скачай puppeteer-core
Slavik
И прописывай путь к браузеру
Slavik
На винде он будет с обратными слешами))
Akbarovich
PS C:\Users\akrom\OneDrive\Рабочий стол\web-scruping> npm i puppeteer npm ERR! code 1 npm ERR! path C:\Users\akrom\OneDrive\Рабочий стол\web-scruping\node_modules\puppeteer npm ERR! command failed npm ERR! command C:\Windows\system32\cmd.exe /d /s /c node install.mjs npm ERR! PUPPETEER_DOWNLOAD_HOST is deprecated. Use PUPPETEER_DOWNLOAD_BASE_URL instead. npm ERR! Error: ERROR: Failed to set up chrome-headless-shell v125.0.6422.60! Set "PUPPETEER_SKIP_DOWNLOAD" env variable to skip download. npm ERR! at file:///C:/Users/akrom/OneDrive/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/web-scruping/node_modules/puppeteer/lib/esm/puppeteer/node/install.js:84:27 npm ERR! at process.processTicksAndRejections (node:internal/process/task_queues:95:5) npm ERR! at async Promise.all (index 1) npm ERR! at async downloadBrowser (file:///C:/Users/akrom/OneDrive/%D0%A0%D0%B0%D0%B1%D0%BE%D1%87%D0%B8%D0%B9%20%D1%81%D1%82%D0%BE%D0%BB/web-scruping/node_modules/puppeteer/lib/esm/puppeteer/node/install.js:90:9) { npm ERR! [cause]: Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: Host: npm.taobao.org. is not in the cert's altnames: DNS:*.tbcdn.cn, DNS:*.taobao.com, DNS:*.alicdn.com, DNS:*.cmos.greencompute.org, DNS:cmos.greencompute.org, DNS:m.intl.taobao.com, DNS:*.mobgslb.tbcache.com, DNS:*.alikunlun.com, DNS:alikunlun.com, DNS:*.django.t.taobao.com, DNS:alicdn.com, DNS:*.tbcache.com, DNS:*.tmall.com, DNS:*.1688.com, DNS:*.3c.tmall.com, DNS:*.alibaba.com, DNS:*.aliexpress.com, DNS:*.aliqin.tmall.com, DNS:*.alitrip.com, DNS:*.aliyun.com, DNS:*.cainiao.com, DNS:*.cainiao.com.cn, DNS:*.chi.taobao.com, DNS:*.chi.tmall.com, DNS:*.china.taobao.com, DNS:*.dingtalk.com, DNS:*.etao.com, DNS:*.feizhu.cn, DNS:*.feizhu.com, DNS:*.fliggy.com, DNS:*.fliggy.hk, DNS:*.food.tmall.com, DNS:*.jia.taobao.com, DNS:*.jia.tmall.com, DNS:*.ju.taobao.com, DNS:*.juhuasuan.com, DNS:*.lw.aliimg.com, DNS:*.m.1688.com, DNS:*.m.alibaba.com, DNS:*.m.alitrip.com, DNS:*.m.cainiao.com, DNS:*.m.etao.com, DNS:*.m.taobao.com, DNS:*.m.taopiaopiao.com, DNS:*.m.tmall.com, DNS:*.m.tmall.hk, DNS:*.mei.com, DNS:*.taopiaopiao.com, DNS:*.tmall.hk, DNS:*.trip.taobao.com, DNS:*.xiami.com, DNS:1688.com, DNS:alibaba.com, DNS:aliexpress.com, DNS:alitrip.com, DNS:aliyun.com, DNS:cainiao.com, DNS:cainiao.com.cn, DNS:dingtalk.com, DNS:etao.com, DNS:feizhu.cn, DNS:feizhu.com, DNS:fliggy.com, DNS:fliggy.hk, DNS:juhuasuan.com, DNS:mei.com, DNS:taobao.com, DNS:taopiaopiao.com, DNS:tmall.hk, DNS:xiami.com, DNS:tmall.com, DNS:*.cloudvideocdn.taobao.com, DNS:cloudvideocdn.taobao.com, DNS:tbcdn.cn npm ERR! at Object.checkServerIdentity (node:tls:337:12) npm ERR! at TLSSocket.onConnectSecure (node:_tls_wrap:1684:27) npm ERR! at TLSSocket.emit (node:events:518:28) npm ERR! at TLSSocket._finishInit (node:_tls_wrap:1085:8) npm ERR! at ssl.onhandshakedone (node:_tls_wrap:871:12) { npm ERR! code: 'ERR_TLS_CERT_ALTNAME_INVALID',
gud3
Вопрос к знатокам: можно ли скрестить selenium hub с puppeteer
Slavik
Просто надо создать один объект браузер
Slavik
И страницу
Slavik
И производить действия с ними
gud3
Теорию валидирую уже 3й час. Склоняюсь к тому что selenium hub может работать только с selenium driver
Slavik
Хм
gud3
паппитеру нужен или ремоут порт браузера или сокет, порт hub отдает но не тот(паппитер не можем пойти на host/json/version), сокет тоже доставал разными плясками и без успешно
gud3
вот интересно кто-то на практике смог их подружить
gud3
скорей всего не возможно, вот чел который контрибьютит в репу папитера, говорит что нет https://github.com/puppeteer/puppeteer/issues/4188
gud3
блин а такая идея хорошая, в hub можно видеть и загрузку браузеров и свободные ноды + видео поток(что там творится в headless)
gud3
Slavik
Ааа, умно то как
Abdul
привет
Abdul
как можно сделать так что если элемента на странице не оказалось то обновить страницу, и когда появится элемент, взять его текст
Abdul
как можно сделать так что если элемента на странице не оказалось то обновить страницу, и когда появится элемент, взять его текст
у меня сейчас либо возвращает нужный текст если он на странице, если нет то обновляет и скрипт заканчивается не возвращая мне текст
Лешка
while цикл поставь)))
gud3
Привет всем, подскажите пожалуйста каким докер имеджем из хаба вы пользуетесь для поднятия chrome в отдельно контейнере и доступу к Chrome DevTools Protocol?
Den
Всем привет. А сюда с тупыми и нубскими вопросами можно?
Den
давай
я пытаюсь спарсить вот эту штуку с сайта https://maslomarket.com/podbor/ мне подсказали алогоритм, что мол сперва получаю список всех урлов возможных, а позже уже каждую отдельную страницу буду парсить. помучал чат гпт, ютуб ролики посмотрел(ничего похоже не нашел). Но ничего не получается у меня. я не программист, так чисто учусь парсингу. поэтому особо тряпками не кидайтесь пожалуйста
Den
Данные конечной страницы смогу спарсить, а вот список урлов не могу
Лешка
ну тут по каждому бренду по каждой машине надо бегать
Лешка
все варианты перетыкать и сохранить все линки
Лешка
ну проще сказать конечно но в целом возможно
Den
ну тут по каждому бренду по каждой машине надо бегать
это я понимаю. но не понимаю, как сделать. чат выдал вот такой код, однако оно не работает: import puppeteer from 'puppeteer'; (async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); // Переходим на страницу с AJAX-формой await page.goto('https://maslomarket.com/podbor/', { waitUntil: 'networkidle2' }); // Ждем, пока форма и dropdown загрузятся await page.waitForSelector('.mmPodborList__selects'); // Функция для получения опций из select элемента const getOptions = async (selector) => { return await page.evaluate((selector) => { return Array.from(document.querySelector(selector).options).map(option => option.value).filter(value => value); }, selector); }; // Получаем список марок const brandOptions = await getOptions('.mmPodborList-select[data-type="BRAND"] select'); // Создаем пустой массив для хранения всех ссылок let allLinks = []; // Проходим по каждой марке for (const brand of brandOptions) { // Выбираем марку await page.select('.mmPodborList-select[data-type="BRAND"] select', brand); await page.waitForSelector('.mmPodborList-select[data-type="MODEL"] select'); // Получаем список моделей const modelOptions = await getOptions('.mmPodborList-select[data-type="MODEL"] select'); // Проходим по каждой модели for (const model of modelOptions) { // Выбираем модель await page.select('.mmPodborList-select[data-type="MODEL"] select', model); await page.waitForSelector('.mmPodborList-select[data-type="GENERATION"] select'); // Получаем список поколений const generationOptions = await getOptions('.mmPodborList-select[data-type="GENERATION"] select'); // Проходим по каждому поколению for (const generation of generationOptions) { // Выбираем поколение await page.select('.mmPodborList-select[data-type="GENERATION"] select', generation); await page.waitForSelector('.mmPodborList-select[data-type="ENGINE"] select'); // Получаем список двигателей const engineOptions = await getOptions('.mmPodborList-select[data-type="ENGINE"] select'); // Проходим по каждому двигателю for (const engine of engineOptions) { // Выбираем двигатель await page.select('.mmPodborList-select[data-type="ENGINE"] select', engine); await page.waitForTimeout(3000); // Ждем, пока страница обновится // Получаем текущий URL const currentUrl = await page.evaluate(() => window.location.href); allLinks.push(currentUrl); } } } } // Выводим список всех ссылок console.log('All Links:', allLinks); // Закрываем браузер await browser.close(); })();
Лешка
на с целом это похоже на правду но думаю нужно детали фиксить
Den
на с целом это похоже на правду но думаю нужно детали фиксить
понял, пойду селекторы проверю тогда. спасибо
Slavik
Ну ваще как это делается, у тебя на каждой модели есть название и линк, линк состоит из https://maslomarket.com/podbor/название марки/, парсишь тупо названия брендов и добавляешь к ним юрл и сохраняешь в файл
Slavik
Тоже самое с моделями
Slavik
И т.д
Slavik
Куда тебе удобнее
Slavik
это я понимаю. но не понимаю, как сделать. чат выдал вот такой код, однако оно не работает: import puppeteer from 'puppeteer'; (async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); // Переходим на страницу с AJAX-формой await page.goto('https://maslomarket.com/podbor/', { waitUntil: 'networkidle2' }); // Ждем, пока форма и dropdown загрузятся await page.waitForSelector('.mmPodborList__selects'); // Функция для получения опций из select элемента const getOptions = async (selector) => { return await page.evaluate((selector) => { return Array.from(document.querySelector(selector).options).map(option => option.value).filter(value => value); }, selector); }; // Получаем список марок const brandOptions = await getOptions('.mmPodborList-select[data-type="BRAND"] select'); // Создаем пустой массив для хранения всех ссылок let allLinks = []; // Проходим по каждой марке for (const brand of brandOptions) { // Выбираем марку await page.select('.mmPodborList-select[data-type="BRAND"] select', brand); await page.waitForSelector('.mmPodborList-select[data-type="MODEL"] select'); // Получаем список моделей const modelOptions = await getOptions('.mmPodborList-select[data-type="MODEL"] select'); // Проходим по каждой модели for (const model of modelOptions) { // Выбираем модель await page.select('.mmPodborList-select[data-type="MODEL"] select', model); await page.waitForSelector('.mmPodborList-select[data-type="GENERATION"] select'); // Получаем список поколений const generationOptions = await getOptions('.mmPodborList-select[data-type="GENERATION"] select'); // Проходим по каждому поколению for (const generation of generationOptions) { // Выбираем поколение await page.select('.mmPodborList-select[data-type="GENERATION"] select', generation); await page.waitForSelector('.mmPodborList-select[data-type="ENGINE"] select'); // Получаем список двигателей const engineOptions = await getOptions('.mmPodborList-select[data-type="ENGINE"] select'); // Проходим по каждому двигателю for (const engine of engineOptions) { // Выбираем двигатель await page.select('.mmPodborList-select[data-type="ENGINE"] select', engine); await page.waitForTimeout(3000); // Ждем, пока страница обновится // Получаем текущий URL const currentUrl = await page.evaluate(() => window.location.href); allLinks.push(currentUrl); } } } } // Выводим список всех ссылок console.log('All Links:', allLinks); // Закрываем браузер await browser.close(); })();
Ну вот вроде похоже
Den
Ну вот вроде похоже
не работает оно.
Den
к сожалению
Slavik
А что тебе нужно?
Pavlo
Всем привет. Пытаюсь кликать на элемент: <div class="buttons-wrapper"> <div class="b3id-widget-button b3-widget-button b3-submit-button b3id-submit-button" data-resend-time-ms="0" data-refreshing-text="" data-refreshed-text="" data-ui-reference="13288" data-button-type="2" data-start-event-id="-75"> <div role="button" class="goog-inline-block jfk-button jfk-button-action b3-button b3id-button b3-ripple-container b3-primary-button" tabindex="0" style="user-select: none;" data-start-event-id="-76">Make a payment <div class="b3id-ripple b3-ripple" aria-hidden="true"></div> </div> <p class="b3-error b3id-button-error" style="display: none;"></p></div> </div> пытаюсь кликать вот так: try { await paymentForm.evaluate(() => { var targetElement = document.querySelector('.buttons-wrapper [role="button"]'); var clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); targetElement.dispatchEvent(new MouseEvent('mousedown', clickEvent)); targetElement.dispatchEvent(new MouseEvent('mouseup', clickEvent)); targetElement.dispatchEvent(clickEvent); }, page); } catch (e) { job.log(prettyObject(e)); } из chrome dev tools все работает и клик отрабаывает, а вот если через puppeteer то ничего не происходит. Помогите, пж
Slavik
Всем привет. Пытаюсь кликать на элемент: <div class="buttons-wrapper"> <div class="b3id-widget-button b3-widget-button b3-submit-button b3id-submit-button" data-resend-time-ms="0" data-refreshing-text="" data-refreshed-text="" data-ui-reference="13288" data-button-type="2" data-start-event-id="-75"> <div role="button" class="goog-inline-block jfk-button jfk-button-action b3-button b3id-button b3-ripple-container b3-primary-button" tabindex="0" style="user-select: none;" data-start-event-id="-76">Make a payment <div class="b3id-ripple b3-ripple" aria-hidden="true"></div> </div> <p class="b3-error b3id-button-error" style="display: none;"></p></div> </div> пытаюсь кликать вот так: try { await paymentForm.evaluate(() => { var targetElement = document.querySelector('.buttons-wrapper [role="button"]'); var clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); targetElement.dispatchEvent(new MouseEvent('mousedown', clickEvent)); targetElement.dispatchEvent(new MouseEvent('mouseup', clickEvent)); targetElement.dispatchEvent(clickEvent); }, page); } catch (e) { job.log(prettyObject(e)); } из chrome dev tools все работает и клик отрабаывает, а вот если через puppeteer то ничего не происходит. Помогите, пж
Не понятно о чем ты? В плане яерез кукольника не работает?
Сам
const targetElement = document.querySelector('.buttons-wrapper div.[role="button"]'); попробуй вот так
Сам
const targetElement = document.querySelector('.buttons-wrapper div[role="button"]'); или так
Pavlo
const targetElement = document.querySelector('.buttons-wrapper div.[role="button"]'); попробуй вот так
Что-то странное. получаю ошибку: { name: 'DOMException' } но при этом клик отрабатывает
Сам
изза парсинга я уволился
Сам
заеб полный
Сам
жиза
эх удачи бро
Pavlo
эх удачи бро
Пасиба. за помощь
Red
Why puppeteer load page to slow than regular chrom ?
Null
Why puppeteer load page to slow than regular chrom ?
There shouldn't be any differences. Do you have load measurements or have you visually identified the differences?
Null
Всем привет. Пытаюсь кликать на элемент: <div class="buttons-wrapper"> <div class="b3id-widget-button b3-widget-button b3-submit-button b3id-submit-button" data-resend-time-ms="0" data-refreshing-text="" data-refreshed-text="" data-ui-reference="13288" data-button-type="2" data-start-event-id="-75"> <div role="button" class="goog-inline-block jfk-button jfk-button-action b3-button b3id-button b3-ripple-container b3-primary-button" tabindex="0" style="user-select: none;" data-start-event-id="-76">Make a payment <div class="b3id-ripple b3-ripple" aria-hidden="true"></div> </div> <p class="b3-error b3id-button-error" style="display: none;"></p></div> </div> пытаюсь кликать вот так: try { await paymentForm.evaluate(() => { var targetElement = document.querySelector('.buttons-wrapper [role="button"]'); var clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true, view: window }); targetElement.dispatchEvent(new MouseEvent('mousedown', clickEvent)); targetElement.dispatchEvent(new MouseEvent('mouseup', clickEvent)); targetElement.dispatchEvent(clickEvent); }, page); } catch (e) { job.log(prettyObject(e)); } из chrome dev tools все работает и клик отрабаывает, а вот если через puppeteer то ничего не происходит. Помогите, пж
Когда в devtools нажимаешь на элемент, то происходит выбор элемента, даже если он находится внутри iframe, и дальше код выполняется внутри этого iframe. А в pptr ты, возможно, не выбрал iframe. Начни с этого, довольно частая ошибка при таких симптомах.
Nessy 🫧
Всем привет! Подскажите, пожалуйста, почему не получается подменить fingerprint в хроме? Проверка на https://browserleaks на параметры WebGL, font fingerprint и Canvas – всегда показывает одинаковые значения, т.е. подмена не работает ни по одному параметру. Скрипты я просил у ChatGPT, потому что в интернете готовых скриптов просто НЕТ. ‼️ (или я плохо искал?) Разумеется, ставил всевозможные плагины: extra, stealth и т.д. Правда: если поможете – честно отблагодарю 🙏 // Я понимаю, что у каждого сайта свой метод сбора отпечатков, но если он не подменяется на одном, значит значит есть вероятность, что не подменяется и на нужном мне сайте. /// В firefox успешно подменяется, кстати. Но мне нужен хром! Вариант с аддонами для браузера типо Canvas Blocking и т.п. мне не подходит.
ISergey
Всем привет! Подскажите, пожалуйста, почему не получается подменить fingerprint в хроме? Проверка на https://browserleaks на параметры WebGL, font fingerprint и Canvas – всегда показывает одинаковые значения, т.е. подмена не работает ни по одному параметру. Скрипты я просил у ChatGPT, потому что в интернете готовых скриптов просто НЕТ. ‼️ (или я плохо искал?) Разумеется, ставил всевозможные плагины: extra, stealth и т.д. Правда: если поможете – честно отблагодарю 🙏 // Я понимаю, что у каждого сайта свой метод сбора отпечатков, но если он не подменяется на одном, значит значит есть вероятность, что не подменяется и на нужном мне сайте. /// В firefox успешно подменяется, кстати. Но мне нужен хром! Вариант с аддонами для браузера типо Canvas Blocking и т.п. мне не подходит.
Их лучше не менять . (В мире миллионы ноутов у которых к примеру встроенная gpu от intel и все примерно одинаковые канвас будут давать .)
Кирилл
Добрый день. Не получается увидеть страницу Озона. Налетаю на защиту. В каком направлении рыть?
Кирилл
Nessy 🫧
Его лучше не менять а вносить шум
То есть можно внести шум, но фингерпринт останется прежним?
Sasha
Как сказали выше он не всегда уникален
Nessy 🫧
Как сказали выше он не всегда уникален
А как тогда быть, если НИ ОДИН параметр не получается поменять в хроме? WebGL (только отключить получается), font fingerprint, Canvas, AudioContext – абсолютно все остаётся прежнее, мое "родное".