Primeiros passos
O Pydoll automatiza o Chrome ou o Edge que você já tem instalado, então a configuração são dois passos: instalar o pacote e rodar um script. Esta página leva você de uma pasta vazia até um script funcional que abre uma página real e lê dados dela.
Você vai aprender
- Como instalar o Pydoll
- Como escrever e rodar seu primeiro script
- Como rodar sem uma janela visível do navegador
Instalar o Pydoll
O Pydoll requer Python 3.10 ou mais recente, e o Google Chrome ou o Microsoft Edge instalado na sua máquina. Você não precisa baixar um webdriver; o Pydoll fala diretamente com o navegador.
Crie e ative um ambiente virtual e, em seguida, instale:
Para experimentar a versão de desenvolvimento mais recente, instale a partir do GitHub:
Escrever seu primeiro script
Crie um arquivo chamado first_script.py:
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://quotes.toscrape.com')
first_quote = await tab.find(class_name='text')
print(await first_quote.text)
asyncio.run(main())
Rode:
Uma janela do Chrome abre, carrega a página e seu terminal imprime a primeira citação:
"The world as we have created it is a process of our thinking. It cannot be changed without changing our thinking."
Três coisas aconteceram aí:
async with Chrome() as browseriniciou o Chrome instalado na sua máquina e garante que ele feche quando o bloco terminar, mesmo se o script falhar.browser.start()retornou uma aba, o objeto que você vai usar para navegação, busca de elementos e todo o resto na página.tab.find(class_name='text')esperou o elemento aparecer e o retornou. Você não precisa adicionar sleeps nem escrever loops de espera;find()tenta de novo até o elemento aparecer ou o timeout expirar.
Novo em Python assíncrono?
Toda chamada do Pydoll é awaitada dentro de uma função async def, e asyncio.run(main()) a inicia. Esse é todo o asyncio que você precisa por enquanto; o resto da documentação segue esse mesmo formato.
Rodar em headless
Em um servidor ou em CI não há display, então rode o navegador em headless. Passe opções ao criar o navegador:
import asyncio
from pydoll.browser.chromium import Chrome
from pydoll.browser.options import ChromiumOptions
async def main():
options = ChromiumOptions()
options.add_argument('--headless=new')
async with Chrome(options=options) as browser:
tab = await browser.start()
await tab.go_to('https://quotes.toscrape.com')
first_quote = await tab.find(class_name='text')
print(await first_quote.text)
asyncio.run(main())
O script se comporta exatamente da mesma forma; a janela é invisível. ChromiumOptions aceita qualquer argumento de linha de comando do Chromium. Veja Opções do navegador para os que vale a pena conhecer.
Headless é detectável
O Chrome headless vaza mais do que uma string de User-Agent. Ele renderiza WebGL por um rasterizador de software em vez da sua GPU real, não expõe plugins de PDF, informa métricas de tela sem a folga da barra de tarefas e não tem dispositivos de mídia. Sistemas anti-bot verificam todos esses pontos, então definir um User-Agent sozinho não faz um navegador headless passar por headful, nem de longe. Se você automatiza sites que combatem bots, ou rode em headful, ou neutralize os sinais de headless com Injeção de fingerprint.
Próximos passos
- Sua primeira automação: faça login em um site, interaja como uma pessoa e extraia dados tipados.
- Passando despercebido: a configuração mínima para evitar os sinais óbvios de bot.
- Encontrando elementos: todas as formas de localizar elementos com
find()equery().