Em primeiro lugar, deixem-me esclarecer os termos. Por Selenium «stealthy» refiro-me a uma versão do Selenium que consegue passar despercebida e contornar o Cloudflare. Não me refiro a nenhuma técnica específica de ocultação. Existem algumas formas de implementar técnicas de evasão no Selenium. Existem pacotes que tratam disso, ou pode usar o `execute_cdp_cmd` para interagir diretamente com a API do Chrome. Esta última opção permite-lhe mais controlo, mas requer mais trabalho. Aqui está um exemplo de como poderia usá-la para alterar o valor do agente do utilizador:
driver.execute_cdp_cmd('Emulation.setUserAgentOverride', {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win32; x86) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36",
"platform": "Win32",
"acceptLanguage":"ro-RO"
})
Mas teria de passar pelo CDP e identificar as APIs que permitem efetuar todas as alterações necessárias. Por isso, por enquanto, vamos testar com alguns pacotes.
1.1. Selenium Stealthy
Existem pelo menos dois pacotes que pode utilizar para tornar o Selenium furtivo. Até ao momento, porém, nenhum deles garante contornar o Cloudflare. Mais uma vez, precisamos de testar e ver se algum deles funciona. Primeiro, vamos dar uma olhada no `selenium-stealth`. Este pacote é um wrapper em torno do `puppeteer-extra-plugin-stealth`, tornando possível usar as evasões do Puppeteer com o Selenium do Python. Para usá-lo, tem de o instalar primeiro. Abra uma janela de terminal e digite este comando:
# Install selenium-stealth
~ » python3 -m pip install selenium-stealth
Já está tudo pronto. Podemos usá-lo para tornar o nosso scraper anterior mais discreto:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium_stealth import stealth
import time
# Set Chrome to open in headless mode
options = Options()
options.headless = True
# Create a new Chrome instance
driver = webdriver.Chrome(options=options)
# Apply stealth to your webdriver
stealth(driver,
languages=["en-US", "en"],
vendor="Google Inc.",
platform="Win32",
webgl_vendor="Intel Inc.",
renderer="Intel Iris OpenGL Engine",
fix_hairline=True,
)
# Navigate to target
driver.get('https://www.snipesusa.com/')
# Give it some time to load
time.sleep(10)
# Take screenshot of page
driver.get_screenshot_as_file('stealth.png')
# Close browser
driver.quit()
Ao executar o script, obtive resultados diferentes desta vez, em comparação com as configurações padrão do Selenium:
A segunda opção que pode utilizar é o `undetected_chromedriver`. Este é descrito como um «chromedriver Selenium otimizado». Vamos testá-lo:
# Install undetected_chromedriver
~ » python3 -m pip install undetected_chromedriver
O código é muito semelhante ao nosso script padrão. A principal diferença está no nome do pacote. Aqui está um scraper básico com `undetected_chromedriver` e vamos ver se consegue contornar o Cloudflare:
import undetected_chromedriver as uc
import time
# Set Chrome to open in headless mode
options = uc.ChromeOptions()
options.headless = True
# Create a new Chrome instance and maximize the window
driver = uc.Chrome(options=options, executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')
driver.maximize_window()
# Navigate to target
driver.get('https://www.snipesusa.com/')
# Give it some time to load
time.sleep(10)
# Take screenshot of page
driver.get_screenshot_as_file('stealth-uc.png')
# Close browser
driver.quit()
Mais uma vez, a execução do script correu bem para mim. Parece que, pelo menos, estes dois pacotes conseguem contornar com sucesso a proteção do Cloudflare. Pelo menos a curto prazo. Para dizer a verdade, é provável que, se utilizar estes scripts extensivamente, o Cloudflare detete o seu endereço IP e o bloqueie.
Por isso, deixe-me apresentar-lhe uma terceira opção: a API de Web Scraping.
1.2. Selenium com a API de Web Scraping
A Web Scraping API tem uma funcionalidade incrível chamada Modo Proxy. Pode ler mais sobre isso aqui. Mas o que quero salientar aqui é que o nosso Modo Proxy pode ser integrado com sucesso com o Selenium. Desta forma, obtém acesso a todas as funcionalidades de evasão que implementámos. E deixe-me dizer-lhe que temos uma equipa dedicada a trabalhar em técnicas de evasão personalizadas. Em termos técnicos, estamos a gerir rotações de IP, a utilizar vários proxies, a resolver captchas e a utilizar a API do Chrome para alterar continuamente a nossa impressão digital. Em termos não técnicos, isto traduz-se em menos complicações da sua parte e numa maior taxa de sucesso. Basicamente, obtém a versão mais discreta do Selenium que existe. E eis como se faz:
# Install selenium-wire
~ » python3 -m pip install selenium-wire
Estamos a utilizar o `selenium-wire` para utilizar o Selenium com um proxy. Aqui está o script:
from seleniumwire import webdriver
import time
# Method to encode parameters
def get_params(object):
params = ''
for key,value in object.items():
if list(object).index(key) < len(object) - 1:
params += f"{key}={value}."
else:
params += f"{key}={value}"
return params
# Your WSA API key
API_KEY = '<YOUR_API_KEY>'
# Default proxy mode parameters
PARAMETERS = {
"proxy_type":"datacenter",
"device":"desktop",
"render_js":1
}
# Set Selenium to use a proxy
options = {
'proxy': {
"http": f"http://webscrapingapi.{ get_params(PARAMETERS) }:{ API_KEY }@proxy.webscrapingapi.com:80",
}
}
# Create a new Chrome instance
driver = webdriver.Chrome(seleniumwire_options=options)
# Navigate to target
driver.get('https://www.httpbin.org/get')
# Retrieve the HTML documeent from the page
html = driver.page_source
print(html)
# Close browser
driver.quit()
Se executar este script algumas vezes, verá como o endereço IP muda sempre. Esse é o nosso sistema de rotação de IP. Em segundo plano, ele também adiciona técnicas de evasão. Nem precisa de se preocupar com elas. Nós tratamos da parte de contornar o Cloudflare para que se possa concentrar mais na análise dos dados.