Capturas de tela e PDFs
Capture a aparência da página: uma captura de tela da página inteira ou de um elemento, ou a página inteira como PDF. O Pydoll usa a própria renderização do Chrome, então a saída corresponde ao que o navegador mostra, e você não roda uma ferramenta de renderização separada.
Capturar a tela da página
Chame take_screenshot() com um caminho de arquivo. A extensão define o formato.
import asyncio
from pydoll.browser.chromium import Chrome
async def main():
async with Chrome() as browser:
tab = await browser.start()
await tab.go_to('https://en.wikipedia.org/wiki/Python_(programming_language)')
await tab.take_screenshot('python.png')
asyncio.run(main())
O python.png gerado, o artigo da Wikipedia como a Pydoll capturou.
Escolher o formato
O formato segue a extensão do arquivo: PNG (sem perdas), JPEG (menor, com perdas), ou WebP. quality vai de 0 a 100 e se aplica aos formatos com perdas.
await tab.take_screenshot('page.png') # sem perdas
await tab.take_screenshot('page.jpeg', quality=85) # arquivo menor
await tab.take_screenshot('page.webp', quality=90)
O formato vem da extensão
Uma extensão não suportada levanta InvalidFileExtension. Tanto .jpg quanto .jpeg funcionam; .jpg é normalizado para .jpeg internamente.
Capturar a página rolável inteira
Por padrão você obtém o viewport visível. Passe beyond_viewport=True para capturar tudo abaixo da dobra, até o final.
Páginas longas custam memória
Em páginas muito longas, beyond_viewport=True demora mais e usa mais memória, porque a página inteira é renderizada de uma vez.
Obter a imagem em memória
Passe as_base64=True para receber uma string base64 em vez de escrever um arquivo. Use para embutir a imagem ou enviá-la a algum lugar, sem arquivo temporário para limpar.
data = await tab.take_screenshot(as_base64=True)
html = f'<img src="data:image/png;base64,{data}" />'
Capturar a tela de um único elemento
Chame take_screenshot() em um elemento para capturar apenas esse elemento. O Pydoll o rola para a área visível primeiro.
await tab.go_to('https://en.wikipedia.org/wiki/Python_(programming_language)')
infobox = await tab.find(class_name='infobox')
await infobox.take_screenshot('infobox.png')
É assim também que você captura conteúdo dentro de um iframe: tab.take_screenshot() só enxerga a página de nível superior, então encontre um elemento dentro do frame e capture esse elemento no lugar.
iframe = await tab.find(tag_name='iframe')
content = await iframe.find(id='content')
await content.take_screenshot('iframe-content.png')
tab.take_screenshot() |
element.take_screenshot() |
|
|---|---|---|
| Escopo | Viewport ou página inteira | Um elemento |
beyond_viewport |
Sim | Não se aplica |
as_base64 |
Sim | Sim |
| Rola para a área visível | Não | Sim |
| Alcança conteúdo de iframe | Não | Sim |
Exportar a página como PDF
print_to_pdf() renderiza a página pelo pipeline de impressão do Chrome. Passe um caminho, ou as_base64=True para os bytes em memória.
import asyncio
from pathlib import Path
from pydoll.browser.chromium import Chrome
async def main():
async with Chrome() as browser:
tab = await browser.start()
await tab.go_to('https://en.wikipedia.org/wiki/Python_(programming_language)')
await tab.print_to_pdf(Path('python.pdf'))
asyncio.run(main())
Controlar a saída
| Parâmetro | Padrão | O que faz |
|---|---|---|
path |
None |
Onde salvar. Obrigatório, a menos que as_base64=True. |
landscape |
False |
Orientação paisagem em vez de retrato. |
display_header_footer |
False |
Adiciona o título, a URL e os números de página do Chrome. |
print_background |
True |
Inclui gráficos e cores de fundo. |
scale |
1.0 |
Fator de zoom, 0.1 a 2.0. Abaixo de 1.0 cabe mais por página. |
as_base64 |
False |
Retorna uma string base64 em vez de escrever um arquivo. |
# relatório em paisagem com cabeçalho e rodapé, levemente reduzido
await tab.print_to_pdf(
Path('report.pdf'),
landscape=True,
display_header_footer=True,
scale=0.9,
)
# econômico em tinta: sem gráficos de fundo
await tab.print_to_pdf(Path('draft.pdf'), print_background=False)
# bytes em memória, sem arquivo
pdf_data = await tab.print_to_pdf(as_base64=True)
Salvar uma página para visualização offline
save_bundle() grava a página e seus assets (CSS, JS, imagens, fontes, mídia) em um .zip que você pode abrir depois. O arquivo contém um index.html com as URLs reescritas para os arquivos locais.
Passe inline_assets=True para embutir tudo em um único index.html autocontido usando data URIs e tags <style>/<script> inline:
O que é empacotado
Documentos, folhas de estilo, scripts, imagens, fontes e mídia. Recursos que falharam ao carregar, foram cancelados, ou usam URIs data: são ignorados.
Lidar com os erros comuns
from pydoll.exceptions import InvalidFileExtension, MissingScreenshotPath
# sem caminho e as_base64 é False
try:
await tab.take_screenshot()
except MissingScreenshotPath:
print('Pass a path, or set as_base64=True.')
# extensão não suportada
try:
await tab.take_screenshot('image.bmp')
except InvalidFileExtension as error:
print(error)
Próximos passos
- Percorrer o DOM: encontre o elemento que você quer capturar, inclusive dentro de iframes.
- Iframes: trabalhe com o conteúdo de frames em profundidade.
- Referência da API Tab: assinaturas completas de
take_screenshot,print_to_pdfesave_bundle.