Contextos de navegador
Um contexto de navegador é uma sessão isolada dentro de um mesmo processo de navegador: seus próprios cookies, armazenamento e cache, como um perfil anônimo separado. Use contextos para rodar vários logins ou identidades ao mesmo tempo em um único navegador, sem que um vaze para o outro.
Criar um contexto e abrir uma aba nele
create_browser_context() retorna um id de contexto. Passe-o para new_tab() e essa aba vive no contexto isolado.
import asyncio
from pydoll.browser.chromium import Chrome
async def main():
async with Chrome() as browser:
await browser.start()
context_id = await browser.create_browser_context()
tab = await browser.new_tab('https://github.com', browser_context_id=context_id)
print(await tab.title)
await browser.delete_browser_context(context_id)
asyncio.run(main())
A aba que você obtém de browser.start() vive no contexto padrão permanente. Qualquer aba que você abrir sem um browser_context_id também entra nele.
Contextos são isolados
O armazenamento definido em um contexto é invisível para outro. Aqui duas abas escrevem a mesma chave e leem valores diferentes de volta:
await tab_a.go_to('https://the-internet.herokuapp.com')
await tab_b.go_to('https://the-internet.herokuapp.com')
await tab_a.execute_script("localStorage.setItem('user', 'Alice')")
await tab_b.execute_script("localStorage.setItem('user', 'Bob')")
a = await tab_a.execute_script("return localStorage.getItem('user')", return_by_value=True)
b = await tab_b.execute_script("return localStorage.getItem('user')", return_by_value=True)
print(a['result']['result']['value']) # Alice
print(b['result']['result']['value']) # Bob
Cookies, localStorage, sessionStorage, IndexedDB, cache e permissões são todos separados por contexto, então um login em um contexto não te autentica em nenhum outro lugar.
graph LR
Browser[Processo do navegador] --> Default[Contexto padrão]
Browser --> C1[Contexto 1]
Browser --> C2[Contexto 2]
Default --> T1[Aba A]
C1 --> T2[Aba B]
C2 --> T3[Aba C]
Faça login em cada contexto: o cookie cai apenas no pote daquele contexto. Nada atravessa, e é isso que torna os contextos bons para rodar sessões separadas em um só navegador.
Rodar várias sessões lado a lado
Dê a cada conta seu próprio contexto e elas permanecem logadas de forma independente. Como as esperas se sobrepõem, asyncio.gather as executa de uma vez.
import asyncio
from pydoll.browser.chromium import Chrome
async def open_session(browser, label):
context_id = await browser.create_browser_context()
tab = await browser.new_tab('https://the-internet.herokuapp.com', browser_context_id=context_id)
await tab.execute_script(f"localStorage.setItem('account', '{label}')")
return context_id, tab, label
async def main():
async with Chrome() as browser:
await browser.start()
sessions = await asyncio.gather(
open_session(browser, 'account-1'),
open_session(browser, 'account-2'),
open_session(browser, 'account-3'),
)
for context_id, tab, label in sessions:
result = await tab.execute_script(
"return localStorage.getItem('account')", return_by_value=True
)
active = result['result']['result']['value']
print(f'{label}: {active}')
await browser.delete_browser_context(context_id)
asyncio.run(main())
Dar a um contexto seus próprios cookies
Os métodos de cookies em nível de navegador recebem um browser_context_id, então você pode semear ou ler os cookies de um contexto sem navegar em uma aba. Cookies definidos em um contexto nunca aparecem em outro.
from pydoll.protocol.network.types import CookieParam
context_id = await browser.create_browser_context()
await browser.set_cookies(
[CookieParam(name='session', value='abc123', domain='httpbin.org')],
browser_context_id=context_id,
)
in_context = await browser.get_cookies(browser_context_id=context_id)
in_default = await browser.get_cookies() # não inclui o cookie acima
Veja Cookies e sessões para ler, escrever e limpar cookies em profundidade.
Rotear um contexto por seu próprio proxy
Passe proxy_server ao criar o contexto e toda requisição das abas dele passa por esse proxy. É assim que você roda diferentes geografias ao mesmo tempo.
us = await browser.create_browser_context(proxy_server='http://us-proxy.example:8080')
eu = await browser.create_browser_context(proxy_server='http://eu-proxy.example:8080')
us_tab = await browser.new_tab('https://api.ipify.org', browser_context_id=us)
eu_tab = await browser.new_tab('https://api.ipify.org', browser_context_id=eu)
Credenciais na URL do proxy (http://user:pass@host:port) são tratadas para você: elas são removidas dos comandos CDP e fornecidas apenas quando o proxy exige autenticação. Veja Proxies para o panorama completo, e Injeção de fingerprint para manter uma identidade por contexto.
Limpeza
delete_browser_context() remove um contexto e fecha todas as abas nele, o que é uma forma rápida de derrubar uma sessão inteira de uma vez.
Deletar um contexto fecha suas abas
Toda aba no contexto é fechada quando você o deleta, então leia antes qualquer coisa que ainda precise. O contexto padrão é permanente e não pode ser deletado; ele fecha quando o navegador para.
Próximos passos
- Abas: gerencie várias abas dentro de um contexto.
- Cookies e sessões: semeie e inspecione os cookies de um contexto.
- Proxies: roteie contextos por proxies diferentes, com autenticação.