03.04.2023, 01:07
|
Новичок на форуме
|
|
Регистрация: 03.04.2023
Сообщений: 8
|
|
Puppeteer и работа с GET запросами
Добрый вечер. Чуть чуть знаком для личного использования с данным продуктом, столкнулся с задачей, что мне необходимо отслеживать от сайта входящие GET запросы в асинхронном режиме (бесконечно долго, до закрытия страницы браузера) и обрабатывать только пришедшие от нужной url.(грубо говоря кидать в консоль лог). Задача совсем не типичная для моих навыков работы, понимаю, что тут пяток строк кода, но я не смог найти в документации чего-то подобного. Подскажите пожалуйста, как реализовать данный функционал.
Спасибо.
|
|
03.04.2023, 14:08
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
|
|
03.04.2023, 15:55
|
Новичок на форуме
|
|
Регистрация: 03.04.2023
Сообщений: 8
|
|
Спасибо Вам большое. Отличный пример, как раз то что будет полезно.
|
|
07.04.2023, 01:56
|
Новичок на форуме
|
|
Регистрация: 03.04.2023
Сообщений: 8
|
|
Добрый вечер.. Решил не создавать новую тему, подскажите пожалуйста, пытаюсь сделать обработку уже пост запросов, которые отсылает браузер, хочу получить ответы. В теории понимаю, скорее всего, в момент получения тела запроса, еще ответа нет и необходимо сделать ожидание его загрузки.. Наверно так.
Спасибо.
import puppeteer from 'puppeteer';
(async () => {
const browser = await puppeteer.launch({
headless: false,
slowMo: 50,
args: ['--start-fullscreen'], // we can use '--start-fullscreen' || --start-maximized
});
const page = await browser.newPage();
await page.setViewport({width: 1720, height: 980});
await page.setRequestInterception(true);
page.on('request', interceptedRequest => {
if (interceptedRequest.isInterceptResolutionHandled()) return;
if (
interceptedRequest.url().endsWith('.png') ||
interceptedRequest.url().endsWith('.jpg')
){
interceptedRequest.abort();
console.log('-');
}
else {
interceptedRequest.continue();
if (interceptedRequest.url() == 'https://website.com/api/'){
console.log('url');
console.log(interceptedRequest.url());
console.log('headers');
console.log(interceptedRequest.headers());
console.log('postData - Отправляемый запрос');
console.log(interceptedRequest.postData());
}
}
});
await page.goto('https://website.com');
await page.type('input[type="email"]', "weqwe@mail.ru", {delay : 3});
await page.type('input[type="password"]', "фывапролдж", {delay : 3});
await page.waitForTimeout(3000);
await page.click ('div.holder.login > div');
//await browser.close();
})();
|
|
07.04.2023, 14:11
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
|
|
08.04.2023, 01:23
|
Новичок на форуме
|
|
Регистрация: 03.04.2023
Сообщений: 8
|
|
Спасибо, сегодня посмотрю. Пробовал, и документацию просматривал, просидел весь вечер, пытаясь понять проблему, мышление у меня пхпшника и все должно вроде как решаться проще. В JS какие-то вещи для меня не логичные. Без попыток самостоятельно разобраться не люблю задавать вопросы.
|
|
08.04.2023, 10:49
|
Новичок на форуме
|
|
Регистрация: 03.04.2023
Сообщений: 8
|
|
Добрый день.
Взял за основу из Ваших ссылок -
page.on('response', async(response) => {
const request = response.request();
if (request.url().includes('desiredrequest.json')){
const text = await response.text();
console.log(text);
}
})
Понял, что вызывать надо второй метод (page.on response) для ожидания ответа. Можно ли сделать, чтобы данный код работал в условии проверки
if (interceptedRequest.url() == 'https://website.com/api/'){
console.log('url');
console.log(interceptedRequest.url());
console.log('headers');
console.log(interceptedRequest.headers());
console.log('postData - Отправляемый запрос');
console.log(interceptedRequest.postData());
// Вызывался тут
}
или надо делать отдельные обработчики для
page.on('request', и page.on('response',
и объединять занесенные в массив из реквеста и респонса данные по каким-то параметрам?
|
|
08.04.2023, 16:12
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
page.on('request', async (request) => {
console.log('url', request.url());
if (request.url() !== 'https://website.com/api/') {
return;
}
console.log('headers', request.headers());
console.log('postData - Отправляемый запрос', request.postData());
});
|
|
08.04.2023, 19:19
|
Новичок на форуме
|
|
Регистрация: 03.04.2023
Сообщений: 8
|
|
Сообщение от Nexus
|
page.on('request', async (request) => {
console.log('url', request.url());
if (request.url() !== 'https://website.com/api/') {
return;
}
console.log('headers', request.headers());
console.log('postData - Отправляемый запрос', request.postData());
});
|
Простите, не совсем Вас понял. А где запрос на получение данных из ответа? Запрос ( postDate и header) я уже получал, в Вашем коде Вы поменяли проверку на принадлежность ссылки к нужному для обработки запросу.
|
|
08.04.2023, 19:47
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,795
|
|
Сообщение от QuZ
|
Простите, не совсем Вас понял. А где запрос на получение данных из ответа?
|
Ознакомьтесь с типом HTTPRequest.
Посмотрите на метод response и на тип данных, который он возвращает.
|
|
|
|