Chrome e Firefox selenium webdrivers com alguns mecanismos antibloqueios.
- Rotação de IPs via Tor
- Rotação de user-agents (Apenas para Firefox)
- Delays aleatórios ou fixos entre requisições
- Persistência e carregamento de cookies
- Permite salvar informações de login, por exemplo
A maneira mais simples:
pip install antiblock-selenium
É necessário configurar o Tor. Primeiramente, instale-o:
sudo apt-get install tor
Pare sua execução para realizar configurações:
sudo service tor stop
Abra seu arquivo de configuração como root, disponível em /etc/tor/torrc, por exemplo, usando o nano:
sudo nano /etc/tor/torrc
Coloque as linhas abaixo e salve:
ControlPort 9051
CookieAuthentication 0
Reinicie o Tor:
sudo service tor start
As classes Firefox e Chrome de antiblock_selenium herdam de selenium.webdriver.Firefox e selenium.webdriver.Chrome, respectivamente. Então as use como habitualmente.
Uso básico
from antiblock_selenium import Firefox, Chrome
chrome = Chrome()
firefox = Firefox()
#use os drivers como habitualmente faz com webdrivers
As funcionalidades extras a estes webdrivers são listadas abaixo.
Parâmetros de configuração:
- allow_reuse_ip_after: Tipo Int - default 10. Quando um IP é usado, ele poderá ser reusado novamente após allow_reuse_ip_after outros IPs serem usados. Se o número for 0, um IP pode ser reusado em qualquer momento.
- change_ip_after: Tipo Int - default 42. Número de requisições feitas por um mesmo IP.
Exemplo:
from antiblock_selenium import Firefox, Chrome
chrome = Chrome(allow_reuse_ip_after = 5, change_ip_after = 100)
firefox = Firefox(allow_reuse_ip_after = 5, change_ip_after = 100)
# use chrome/firefox como habitualmente usa os webdrivers
Por enquanto, funcionalidade disponível apenas para Firefox.
Parâmetros de configuração:
- user_agents: Tipo List - default [] (lista vazia). Lista de user-agents para ser rotacionada.
- change_user_agent_after: Tipo Int - default 0. Número de requisições feitas com o mesmo user-agent. Se o valor for 0, o user-agent não será alterado.
Exemplo:
from antiblock_selenium import Firefox
user_agents = ['Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2226.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2225.0 Safari/537.36',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2224.3 Safari/537.36',
]
firefox = Firefox(user_agents = user_agents, change_user_agent_after = 100)
#use firefox como habitualmente usa webdrivers
...
Por padrão, o atraso entre uma requisição e outra é uma valor escolhido ao acaso entre 0.5 * 0.25 e 0.25 * 1.5, o mesmo comportamento do Scrapy.
Parâmetros de configuração:
- time_between_calls: Tipo Float - default 0.25. Tempo em segundos entre uma requisição e outra.
- random_delay: Tipo Bool - default True. Se True, um valor entre 0.5 * time_between_calls e 1.5 * time_between_calls será o delay escolhido entre cada requisição. Se False, o delay entre uma requisição e outra será fixo de time_between_calls segundos.
Exemplo:
from antiblock_selenium import Firefox, Chrome
# Tempo fixo de 10 segundos entre requisições
chrome = Chrome(time_between_calls = 10, random_delay = False)
# Tempo aleatório entre 0.5 * 10 e 1.5 * 10 entre cada requisição
firefox = Firefox(time_between_calls = 10, random_delay = True)
# use chrome/firefox como habitualmente usa os webdrivers
O selenium já possui mecanismos de gerenciamentos de cookies, disponíveis aqui. As funcionalidades abaixo são apenas facilitadores de uso, sendo:
- Salvar cookies ao fechar o driver
- Recarregar os últimos cookies salvos (salvos de uma última sessão do driver)
- Carregar uma lista de cookies
Parâmetros de configuração:
- cookie_domain: Tipo String - default ''. Para carregar cookies, o selenium precisa acessar o site onde os cookies são válidos. Esse parâmetro representa esse site.
- persist_cookies_when_close: Tipo Bool - default False. Define se os cookies do driver serão salvos quando ele for fechado.
- reload_cookies_when_start: Tipo Bool - default False. Define se os cookies salvos de uma outra sessão do driver que foi fechada será recarregada. Se esse parâmetro for True, cookie_domain não pode ser vazio.
- location_of_cookies: Tipo String - default 'cookies.pkl'. Nome ou local onde os cookies serão salvos, se persist_cookies_when_close for definido como True.
Exemplo:
from antiblock_selenium import Firefox, Chrome
chrome = Chrome(persist_cookies_when_close = True)
firefox = Firefox(persist_cookies_when_close = True)
chrome.get('algum-site-que-requer-login')
firefox.get('algum-site-que-requer-login')
#Preencha os dados de login
chrome.close()
firefox.close()
chrome = Chrome(reload_cookies_when_start = True, cookie_domain = 'https://dominio-site-com-login.com')
firefox = Firefox(reload_cookies_when_start = True, cookie_domain = 'https://dominio-site-com-login.com')
Nem todos sites será possível salvar informação de login apenas salvando cookies.
Também é possível carregar uma lista de cookies para um domínio, use a função abaixo:
- load_cookies
- Parâmetros:
- cookies: Tipo List. Lista de cookies.
- cookie_domain: Tipo String. Domínio válido do cookie.
- Parâmetros:
Exemplo:
from antiblock_selenium import Firefox, Chrome
chrome = Chrome()
firefox = Firefox()
cookies = [{'domain': 'www.google.com.br', 'expiry': 1591216842, 'httpOnly': False, 'name': 'UULE', 'path': '/', 'secure': False, 'value': 'a+cm9sZToxIHByb2R1Y2VyOjEyIHByb3ZlbmFuY2U6NiB0aW1lc3RhbXA6MTU5MTE5NTIzNzI5OTAwMCBsYXRsbmd7bGF0aXR1ZGVfZTc6NDY4MTgxODgwIGxvbmdpdHVkZV9lNzo4MjI3NTEyMH0gcmFkaXVzOjY0MDg4Nzgw'}, {'domain': '.google.com.br', 'expiry': 2145916801, 'httpOnly': False, 'name': 'CONSENT', 'path': '/', 'secure': False, 'value': 'WP.287758'}, {'domain': '.google.com.br', 'expiry': 1593787242, 'httpOnly': False, 'name': '1P_JAR', 'path': '/', 'secure': True, 'value': '2020-6-3-14'}, {'domain': '.google.com.br', 'expiry': 1607006421, 'httpOnly': True, 'name': 'NID', 'path': '/', 'sameSite': 'None', 'secure': True, 'value': '204=aZfE182RJB7HoA9WXJImPNFy4xT0-VCU9t2NhB8byzsMGdSdjnDQo7YkIexDtBsMKQxU0AZDfgyQkKn8T9rD8YN_3hqpIvasJRbg75GZzt8zYTO3dMgS7G1ftELWBzDAuhRb2bCa1iKwut2YfNYJp-2bshYcX0JD5RDW_Gp28Bc'}]
chrome.load_cookies(cookies = cookies, cookie_domain = 'https://www.google.com.br/')
firefox.load_cookies(cookies = cookies, cookie_domain = 'https://www.google.com.br/')
- Rotação de user-agents para Chrome
- Rotação de IPs via lista de proxys
- Aumentar cobertura de testes