Автоматизируйте. Меняйте.
Развивайте.
[email protected]
[email protected]
t.me/nodul
Форум Nodul
Готовые автоматизации
Партнерам
Вакансии
+569-231-213
Хотите ускорить автоматизацию с Puppeteer? Управление кэшем браузера — ключевой момент. Это руководство расскажет, как отключать, очищать и оптимизировать кэш для повышения производительности.
Эффективное управление кэшем может значительно сократить использование данных, повысить точность тестов и ускорить процессы автоматизации. Давайте разберёмся, как это сделать!
Отключение кэша в Puppeteer полезно для тестирования и автоматизации, где требуется загрузка страницы без использования кэша. Вот как это можно сделать и на что обратить внимание.
Вы можете отключить кэширование с помощью метода setCacheEnabled():
await page.setCacheEnabled(false);
Запустите эту команду перед переходом на любую страницу. По умолчанию кэширование включено, поэтому его нужно отключать, если тесты требуют "чистой" загрузки ресурсов. Для более глобального решения см. следующий раздел.
Чтобы отключить кэширование на уровне браузера, запустите Chromium с определёнными флагами:
const browser = await puppeteer.launch({
args: ['--disable-cache']
});
Этот метод удобен, когда нужно контролировать кэширование для всей сессии браузера, дополняя подход с setCacheEnabled().
Когда кэш отключён, все ресурсы загружаются заново, что может замедлить работу и увеличить объём передаваемых данных. Например, тесты на сайте CNN показали увеличение передачи данных на 88% при отключённом кэшировании. Чтобы найти баланс между точностью и производительностью, учитывайте следующие советы:
Отключение кэша отлично подходит для имитации поведения новых пользователей, но учитывайте компромиссы в зависимости от целей тестирования.
Автоматизированные тесты часто требуют очистки кэша для обеспечения стабильных результатов.
Вы можете очистить кэш, используя команды Chrome DevTools Protocol (CDP):
const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');
await page.setCacheEnabled(false);
Этот подход очищает кэш браузера и отключает кэширование, обеспечивая "чистый лист" для автоматизации.
Также можно очистить и кэш, и куки одновременно:
const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');
await client.send('Network.clearBrowserCookies');
Иногда может потребоваться очистить не весь кэш, а только определённые данные. Вот как можно управлять куки:
// Очистить все куки
const cookies = await page.cookies();
await page.deleteCookie(...cookies);
// Удалить конкретную куку:
// await page.deleteCookie({ name: 'cookie_name', url: 'https://example.com' });
// Установить срок действия кук
const cookies = await page.cookies();
for (let cookie of cookies) {
cookie.expires = -1;
}
await page.setCookie(...cookies);
Это позволяет точно управлять куками во время тестов.
При работе с несколькими вкладками рекомендуется изолировать данные кэша, используя отдельные контексты браузера:
const browser = await puppeteer.launch();
const context = await browser.createIncognitoBrowserContext();
const page = await context.newPage();
const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');
// Закрыть контекст после завершения задач
await context.close();
Использование отдельных контекстов предотвращает влияние кэша между вкладками, что идеально для параллельного тестирования.
Эффективное управление кэшем в Puppeteer может сократить передачу данных до 92%, значительно ускоряя автоматизацию.
Чтобы балансировать между скоростью и актуальностью данных, можно перехватывать запросы и ответы для реализации умного кэширования. Вот пример:
const cache = new Map();
async function handleRequest(request) {
const url = request.url();
if (cache.has(url)) {
const cachedResponse = cache.get(url);
if (isFresh(cachedResponse)) {
return request.respond(cachedResponse);
}
}
// Продолжить запрос, если он не закэширован
request.continue();
}
async function handleResponse(response) {
const headers = response.headers();
if (headers['cache-control'] && headers['cache-control'].includes('max-age')) {
const responseData = {
status: response.status(),
headers: headers,
body: await response.buffer()
};
cache.set(response.url(), responseData);
}
}
Эта настройка минимизирует ненужные сетевые запросы, сохраняя при этом актуальность важных данных за счёт проверки заголовка cache-control.
Настройте кэширование под свои нужды, создавая конкретные правила. Например:
const customCacheRules = {
shouldCache: (response) => {
const headers = response.headers();
return headers['cache-control'] &&
headers['cache-control'].includes('max-age') &&
Number(headers['cache-control'].match(/max-age=(\d+)/)[1]) > 0;
},
getExpirationTime: (headers) => {
const maxAge = headers['cache-control'].match(/max-age=(\d+)/)[1];
return Date.now() + (parseInt(maxAge) * 1000);
}
};
Эти правила помогают определить, какие ответы кэшировать и как долго их хранить.
После настройки правил оцените их влияние с помощью метрик производительности:
const metrics = {
totalRequests: 0,
cachedResponses: 0,
dataSaved: 0
};
async function trackCacheMetrics(request, response) {
metrics.totalRequests++;
if (response.fromCache()) {
metrics.cachedResponses++;
metrics.dataSaved += parseInt(response.headers()['content-length'] || 0);
}
}
Отслеживайте ключевые метрики, такие как общее количество запросов, закэшированные ответы и сэкономленные данные. Вот сравнение на основе тестов:
Эти результаты показывают, насколько хорошо продуманное кэширование может улучшить производительность Puppeteer.
При использовании Puppeteer включение перехвата запросов отключает встроенное кэширование браузера. Это может привести к увеличению передачи данных и замедлению загрузки страниц. Чтобы решить эту проблему, можно реализовать пользовательское кэширование:
const browser = await puppeteer.launch();
const page = await browser.newPage();
// Инициализация хранилища кэша
const responseCache = new Map();
await page.setRequestInterception(true);
page.on('request', async request => {
const url = request.url();
if (responseCache.has(url)) {
await request.respond(responseCache.get(url));
return;
}
request.continue();
});
page.on('response', async response => {
const url = response.url();
const headers = response.headers();
if (headers['cache-control'] && headers['cache-control'].includes('max-age')) {
responseCache.set(url, {
status: response.status(),
headers: headers,
body: await response.buffer()
});
}
});
Чтобы избежать утечек памяти, убедитесь, что ресурсы очищаются правильно:
async function cleanupResources(page) {
await page.removeAllListeners();
const client = await page.target().createCDPSession();
await client.send('Network.clearBrowserCache');
await client.detach();
await page.close();
}
Комбинируя эти методы, вы можете снизить нагрузку и повысить производительность Puppeteer.
Вот несколько практических советов по эффективному управлению кэшем, основанных на тестировании и анализе:
Для повышения производительности можно блокировать определённые ресурсы, такие как изображения или таблицы стилей, чтобы ускорить загрузку страниц:
const browserOptions = {
userDataDir: './cache-directory',
args: [
'--disable-background-timer-throttling',
'--disable-extensions'
]
};
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'image' || request.resourceType() === 'stylesheet') {
request.abort();
} else {
request.continue();
}
});
Использование этих стратегий поможет оптимизировать работу с Puppeteer, сохраняя контроль над использованием ресурсов.
Эффективное управление кэшем в Puppeteer может значительно повысить производительность и сократить использование ресурсов. В этом руководстве рассмотрено, как отключать, очищать и настраивать кэш для достижения лучших результатов. Ниже приведено краткое резюме основных стратегий и их эффекта.
Тестирование показало, насколько важно правильно управлять кэшем. Вот основные стратегии и их результаты:
"При оптимизации Puppeteer помните, что способов ускорить его запуск и завершение не так много. Скорее всего, наибольший прирост скорости вы получите, ускорив рендеринг целевых страниц." — Jon Yongfook, основатель Bannerbear.