Preços
PRODUTO
SOLUÇÕES
por casos de uso
AI Gestão de leadsFacturaçãoMídia socialGestão de ProjetosGestão de dadospor setor
saber mais
BlogModelosVÍDEOSYoutubeRECURSOS
COMUNIDADES E MÍDIAS SOCIAIS
PARCEIROS
O Puppeteer simplifica a automação da web oferecendo ferramentas para controlar os navegadores Chrome e Chromium. A page.goto()
o método é essencial para navegar nas páginas de forma eficaz, seja para testar, raspar ou automatizar tarefas. Aqui está o que você encontrará:
page.goto()
: Navegue até URLs com opções como timeout
, waitUntil
e referer
.
domcontentloaded
, load
, networkidle0
ou networkidle2
para páginas dinâmicas ou estáticas.
try-catch
blocos.
Opção de espera | melhor para | Cronometragem (Aprox.) |
---|---|---|
domcontentloaded |
Verificações de estrutura estática | segundo 1-2 |
load |
Páginas estáticas totalmente carregadas | segundo 2-5 |
networkidle2 |
Balanceado para conteúdo dinâmico | segundo 3-8 |
networkidle0 |
Páginas complexas e dinâmicas | segundo 5-10 |
Principais conclusões: Combine suas condições de espera e tratamento de erros com o tipo de página para automação confiável. Mergulhe em métodos avançados para SPAs e processos multietapas para lidar com fluxos de trabalho complexos de forma eficiente.
Latenode usa o navegador Headless movido a Puppeteer, instalado em seu cenário automaticamente, instalado análise profissional de sites e manutenção sequência. Você pode facilmente se integrar à biblioteca usando um novo código e usá-lo com um medicamento serviços - em nossa entrega maior que 300 integração com o programa.
Diferentemente dos scrapers comuns, ele captura a estrutura visual real, reconhecendo elementos de design e blocos de texto. Experimente o Headless Browser neste modelo agora! Esse fluxo de trabalho não apenas captura e analisa dados do site, mas também garante que você possa compartilhar insights facilmente para uma comunicação perfeita.
A page.goto()
O método no Puppeteer é usado para navegar para URLs específicas.
A page.goto()
O método aceita vários parâmetros para personalizar a navegação:
await page.goto(url, {
timeout: 30000,
waitUntil: 'networkidle0',
referer: 'https://example.com'
});
Aqui está uma análise dos principais parâmetros:
Opção de espera | Descrição | melhor para |
---|---|---|
load |
Aciona quando o load evento é disparado. |
Páginas estáticas que são fáceis de carregar. |
domcontentloaded |
Dispara quando o HTML inicial é totalmente carregado. | Verificações rápidas da estrutura da página. |
networkidle0 |
Aguarda até que não haja atividade de rede por 500 ms. | Páginas com conteúdo dinâmico ou complexo. |
networkidle2 |
Aguarda até que restem apenas 2 conexões de rede. | Equilibra velocidade e meticulosidade. |
Essas opções permitem que você controle como e quando a página é considerada totalmente carregada, garantindo uma navegação precisa e confiável.
Uma vez que os parâmetros de navegação são definidos, o próximo passo é lidar com a resposta. O page.goto()
método retorna uma Promise que resolve para um objeto Response. Este objeto fornece detalhes sobre a navegação:
const response = await page.goto(url);
if (response) {
const status = response.status();
const headers = response.headers();
const ok = response.ok(); // true for status codes 200-299
}
Veja como você pode verificar a navegação:
response.status()
para confirmar o status HTTP.
response.headers()
.
Para tratamento de erros, envolva o page.goto()
chamar em um bloco try-catch:
try {
const response = await page.goto(url, { waitUntil: 'networkidle0' });
if (!response.ok()) {
throw new Error(`Page load failed with status: ${response.status()}`);
}
} catch (error) {
console.error('Navigation failed:', error);
}
O objeto de resposta inclui vários métodos úteis:
response.status()
: Recupera o código de status HTTP.
response.headers()
: Obtém os cabeçalhos de resposta.
response.securityDetails()
: Fornece detalhes de SSL/TLS.
response.timing()
: Oferece dados de tempo de navegação.
Essas ferramentas garantem que você possa validar a navegação e lidar com quaisquer problemas de forma eficaz.
Ao trabalhar com os recursos de navegação do Puppeteer, escolher a estratégia de espera correta é essencial para criar uma automação confiável. Seus scripts devem prosseguir somente quando a página estiver totalmente pronta.
O marionetista usa o waitUntil
parâmetro para definir quando uma página é considerada carregada. Aqui está um exemplo:
const navigationOptions = { waitUntil: ['load', 'networkidle0'], timeout: 30000 };
await page.goto('https://example.com', navigationOptions);
Se você especificar várias condições de espera, o Puppeteer aguardará que todas elas ocorram antes de prosseguir. Aqui está uma análise das condições de espera comuns e seu tempo típico:
Condição de espera | Tempo aproximado |
---|---|
domcontentloaded |
segundo 1-2 |
load |
segundo 2-5 |
networkidle2 |
segundo 3-8 |
networkidle0 |
segundo 5-10 |
Escolha suas condições de espera com base na estrutura da sua página e na rapidez com que ela carrega.
A condição de espera correta depende se você está lidando com um site estático ou dinâmico:
// For a static site
await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 15000 });
// For a dynamic site
await page.goto(url, { waitUntil: 'networkidle0', timeout: 45000 });
Certifique-se de que o valor do tempo limite corresponda à complexidade da condição de espera escolhida. Condições mais detalhadas, como networkidle0
, pode precisar de timeouts mais longos para evitar erros. Para tornar seu script ainda mais confiável, combine condições de espera com verificações adicionais.
Para maior precisão, você pode emparelhar condições de espera com verificações de elementos específicos:
await page.goto(url, { waitUntil: 'load' });
await page.waitForSelector('#main-content');
await page.waitForFunction(() => {
return document.readyState === 'complete' && !document.querySelector('.loading-spinner');
});
Este método garante que a página seja completamente carregada e que elementos específicos estejam disponíveis. Ao fazer isso, você minimiza falhas de teste e melhora a confiabilidade da sua automação.
Esta seção explica técnicas avançadas para gerenciar navegação complexa no Puppeteer. Com base nas estratégias básicas de navegação e espera de antes, esses métodos focam em lidar com cenários mais desafiadores.
Lide com erros de navegação de forma eficaz combinando verificações de tempo limite com etapas de recuperação personalizadas:
const navigationPromise = page.goto(url);
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Navigation timed out')), 45000)
);
try {
await Promise.race([navigationPromise, timeoutPromise]);
} catch (error) {
if (error instanceof TimeoutError) {
await page.reload({ waitUntil: 'networkidle0' });
} else {
console.error(`Navigation failed: ${error.message}`);
throw error;
}
}
Essa abordagem garante que os tempos limite sejam gerenciados e que a página possa se recuperar ou recarregar conforme necessário.
Navegar em aplicativos de página única (SPAs) requer uma estratégia diferente, geralmente envolvendo mudanças de rota e comportamentos específicos da estrutura:
// Wait for the route to update
await page.waitForFunction(
'window.location.pathname === "/dashboard"'
);
// React framework example
await page.click('[data-testid="nav-link"]');
await page.waitForFunction(() => {
return document.querySelector('#react-root').__reactContainer !== null;
});
Este método garante uma navegação suave em SPAs aguardando alterações específicas no estado do aplicativo.
Para fluxos de trabalho que envolvem várias etapas, você pode combinar técnicas de navegação para lidar com cenários complexos:
async function complexNavigation(page, targetUrl) {
// Load the initial page
await page.goto(targetUrl);
// Check for authentication completion
await page.waitForSelector('#auth-complete');
// Handle dynamic content
await page.evaluate(() => {
window.scrollTo(0, document.body.scrollHeight);
});
// Verify the page state
await page.waitForFunction(() => {
return window.performance.timing.loadEventEnd > 0;
});
}
Para processos de várias etapas, você também pode usar navegação e ações paralelizadas:
await page.goto(baseUrl);
await Promise.all([
page.waitForNavigation({ waitUntil: 'networkidle0' }),
page.click('button[type="submit"]')
]);
Essas técnicas simplificam a navegação em fluxos de trabalho complexos, garantindo o manuseio eficiente de conteúdo dinâmico e processos de várias etapas.
Aumentar a velocidade e a eficiência da navegação é essencial para criar fluxos de trabalho de automação eficazes. Abaixo estão algumas técnicas práticas para melhorar o desempenho em vários cenários.
Você pode configurar o tamanho do cache do navegador e gerenciar o cache de forma eficiente seguindo estas etapas:
const browser = await puppeteer.launch({
args: ['--disk-cache-size=104857600'], // 100MB cache
userDataDir: './cache-directory'
});
const context = await browser.createIncognitoBrowserContext();
await page._client.send('Network.clearBrowserCache');
await page.setCacheEnabled(true);
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'document') {
request.continue({
headers: {
...request.headers(),
'Cache-Control': 'max-age=3600'
}
});
} else {
request.continue();
}
});
Depois que o cache estiver configurado, você pode voltar sua atenção para o gerenciamento do carregamento de recursos para uma navegação ainda mais rápida.
Para reduzir o carregamento desnecessário de recursos, bloqueie itens não essenciais, como imagens e fontes:
await page.setRequestInterception(true);
page.on('request', request => {
if (request.resourceType() === 'image' || request.resourceType() === 'font') {
request.abort();
} else {
request.continue();
}
});
Essa abordagem ajuda a economizar largura de banda e acelera as interações nas páginas.
Lidar com várias abas de forma eficiente pode melhorar o desempenho aproveitando ao máximo os recursos disponíveis. Veja como você pode gerenciar a navegação em várias abas:
async function navigateMultipleTabs(urls) {
const pages = await Promise.all(
urls.map(async url => {
const page = await browser.newPage();
await page.setDefaultNavigationTimeout(30000);
return page;
})
);
await Promise.all(
pages.map(async (page, index) => {
try {
await page.goto(urls[index], {
waitUntil: 'networkidle0',
timeout: 30000
});
} catch (error) {
console.error(`Failed to load ${urls[index]}: ${error.message}`);
await page.close();
}
})
);
return pages.filter(page => !page.isClosed());
}
Para evitar sobrecarga de recursos, limite o número de abas abertas processando-as em lotes:
const maxConcurrentTabs = 3;
const tabPool = [];
for (let i = 0; i < urls.length; i += maxConcurrentTabs) {
const batch = urls.slice(i, i + maxConcurrentTabs);
const currentTabs = await navigateMultipleTabs(batch);
tabPool.push(...currentTabs);
await Promise.all(
tabPool.map(async tab => {
// Process each tab as needed
await tab.close();
})
);
tabPool.length = 0;
}
Este método de processamento em lote garante uma operação tranquila sem sobrecarregar os recursos do sistema.
Para aproveitar ao máximo o Puppeteer's page.goto()
método, concentre-se nestas estratégias práticas:
waitUntil
opção para o seu tipo de página para maior confiabilidade.
try-catch
blocos e tempos limite para lidar com erros de navegação de forma eficaz.
page.goto()
com condições de espera personalizadas para lidar adequadamente com mudanças de estado.
Essas abordagens se baseiam nas técnicas discutidas anteriormente, ajudando você a navegar em cenários complexos e melhorar o desempenho. Veja como você pode aplicá-las passo a passo:
1. Configurar navegação básica
const page = await browser.newPage();
await page.setDefaultNavigationTimeout(30000);
await page.goto(url, {
waitUntil: 'networkidle0',
timeout: 30000
});
2. Incorporar tratamento de erros
try {
await page.goto(url, {
waitUntil: ['load', 'networkidle0'],
timeout: 30000
});
} catch (error) {
if (error instanceof TimeoutError) {
await page.evaluate(() => window.stop());
throw error;
}
}
3. Otimizar o carregamento de recursos
await page.setRequestInterception(true);
await page.setCacheEnabled(true);
page.on('request', request => {
if (request.resourceType() === 'image') {
request.abort();
} else {
request.continue();
}
});