
Um módulo Python para contornar a página anti-bot da Cloudflare.
Aprimorado por Zied Boughdir
Todos os recursos testados com 100% de taxa de sucesso para a funcionalidade principal:
Um módulo Python para contornar a página anti-bot do Cloudflare (também conhecida como "I'm Under Attack Mode", ou IUAM), implementado com Requests. Esta versão aprimorada inclui suporte para desafios Cloudflare v2, rotação de proxy, modo stealth e muito mais. O Cloudflare altera suas técnicas periodicamente, então atualizarei este repositório com frequência.
Isto pode ser útil se você desejar fazer scraping ou rastrear um site protegido pelo Cloudflare. A página anti-bot do Cloudflare atualmente apenas verifica se o cliente suporta Javascript, embora eles possam adicionar técnicas adicionais no futuro.
Devido ao Cloudflare estar continuamente mudando e endurecendo sua página de proteção, o cloudscraper requer um Motor/interpretador JavaScript para resolver desafios Javascript. Isso permite que o script se passe facilmente por um navegador comum sem desofuscar e analisar explicitamente o Javascript do Cloudflare.
Para referência, esta é a mensagem padrão que o Cloudflare usa para esses tipos de página:``` Checking your browser before accessing website.com.
This process is automatic. Your browser will redirect to your requested content shortly.
Please allow up to 5 seconds...
Qualquer script que use cloudscraper aguardará ~5 segundos na primeira visita a qualquer site com anti-bots do Cloudflare habilitados, embora nenhum atraso ocorra após a primeira solicitação.
# Instalação
Basta executar `pip install cloudscraper`. O pacote PyPI está em https://pypi.org/project/cloudscraper/```bash
pip install cloudscraper
Alternativamente, clone este repositório e execute python setup.py install.
Se você estava usando anteriormente o pacote original cloudscraper, agora você pode usar esta versão aprimorada diretamente:```python
import cloudscraper # Enhanced version
A API permanece compatível, então você só precisa alterar as declarações de import no seu código. Todas as chamadas de função e parâmetros funcionam da mesma forma.
### Estrutura da Base de Código
A base de código foi simplificada para melhorar a manutenibilidade e reduzir a confusão:
- **Módulo Único**: Todo o código agora está no módulo `cloudscraper`
- **Redundância Removida**: Os diretórios redundantes foram removidos
- **Testes Atualizados**: Todos os arquivos de teste foram atualizados para usar o módulo `cloudscraper`
Isso torna a base de código mais limpa e fácil de manter, garantindo ao mesmo tempo compatibilidade reversa com o código existente que usa a API original.
## Principais Recursos do cloudscraper
| Recurso | Descrição | Status |
|---------|-------------|--------|
| **🆕 Compatibilidade com Executáveis** | Correção completa para conversão com PyInstaller, cx_Freeze, auto-py-to-exe | ✅ **CORRIGIDO** |
| **🆕 Desafios de VM JavaScript v3** | Suporte aos mais recentes desafios baseados em VM JavaScript da Cloudflare | ✅ **NOVO** |
| **🆕 Suporte a Turnstile** | Suporte ao novo substituto de CAPTCHA Turnstile da Cloudflare | ✅ **NOVO** |
| **Suporte a Desafios Modernos** | Suporte aprimorado para desafios Cloudflare v1, v2, v3 e Turnstile | ✅ Completo |
| **Rotação de Proxy** | Rotação inteligente de proxy integrada com múltiplas estratégias | ✅ Aprimorado |
| **Modo Furtivo** | Simulação de comportamento semelhante ao humano para evitar detecção | ✅ Aprimorado |
| **Emulação de Navegador** | Impressão digital avançada de navegador para Chrome e Firefox | ✅ Estável |
| **Manipulação de JavaScript** | Melhor interpretador JS (js2py como padrão) para resolução de desafios | ✅ Aprimorado |
| **Solucionadores de Captcha** | Suporte a múltiplos serviços de resolução de CAPTCHA | ✅ Estável |
# Dependências
- **Python 3.8+** (Suporte encerrado para Python 3.6 e 3.7)
- **[Requests](https://github.com/psf/requests)** >= 2.31.0
- **[requests_toolbelt](https://pypi.org/project/requests-toolbelt/)** >= 1.0.0
- **[pyparsing](https://pypi.org/project/pyparsing/)** >= 3.1.0
- **[pyOpenSSL](https://pypi.org/project/pyOpenSSL/)** >= 24.0.0
- **[pycryptodome](https://pypi.org/project/pycryptodome/)** >= 3.20.0
- **[websocket-client](https://pypi.org/project/websocket-client/)** >= 1.7.0
- **[js2py](https://pypi.org/project/Js2Py/)** >= 0.74
- **[brotli](https://pypi.org/project/Brotli/)** >= 1.1.0
- **[certifi](https://pypi.org/project/certifi/)** >= 2024.2.2
`python setup.py install` instalará as dependências do Python automaticamente. Os interpretadores e/ou motores Javascript que você decidir usar são as únicas coisas que você precisa instalar, exceto o js2py, que faz parte dos requisitos como padrão.
# Interpretadores e Motores Javascript
Nós suportamos os seguintes interpretadores/motores Javascript.
- **[ChakraCore](https://github.com/microsoft/ChakraCore):** Os binários da biblioteca também podem ser encontrados [aqui](https://www.github.com/VeNoMouS/cloudscraper/tree/ChakraCore/).
- **[js2py](https://github.com/PiotrDabkowski/Js2Py):** >=0.74 **(Padrão para a versão aprimorada)**
- **native**: Solucionador python nativo próprio
- **[Node.js](https://nodejs.org/)**
- **[V8](https://github.com/sony/v8eval/):** Usamos o módulo python [v8eval](https://v8.dev)() da Sony.
# Uso
A maneira mais simples de usar o cloudscraper é chamando `create_scraper()`.```python
import cloudscraper
scraper = cloudscraper.create_scraper() # returns a CloudScraper instance
# Or: scraper = cloudscraper.CloudScraper() # CloudScraper inherits from requests.Session
print(scraper.get("http://somesite.com").text) # => "<!DOCTYPE html><html><head>..."
É isso...
Quaisquer solicitações feitas a partir deste objeto de sessão para sites protegidos pelo anti-bot da Cloudflare serão tratadas automaticamente. Sites que não usam Cloudflare serão tratados normalmente. Você não precisa configurar ou chamar mais nada, e pode efetivamente tratar todos os sites como se não estivessem protegidos por nada.
Você usa o cloudscraper exatamente da mesma forma que usa o Requests. cloudScraper funciona de forma idêntica a um objeto Session do Requests, só que em vez de chamar requests.get() ou requests.post(), você chama scraper.get() ou scraper.post().
Consulte a documentação do Requests para obter mais informações.
O problema de user agent ao converter aplicações Python que usam cloudscraper em executáveis foi completamente corrigido!
Ao converter aplicativos Python em executáveis (usando PyInstaller, cx_Freeze, auto-py-to-exe, etc.), os usuários encontravam erros relacionados à funcionalidade de user agent ou agent_user porque o arquivo browsers.json não era incluído corretamente.
O cloudscraper v2.7.0 inclui um sistema automático de fallback:
Opção 1: Basta compilar seu executável (funciona automaticamente):```bash pyinstaller your_app.py
**Opção 2: Incluir o banco de dados completo de user agents** (recomendado):```bash
pyinstaller --add-data "cloudscraper/user_agent/browsers.json;cloudscraper/user_agent/" your_app.py
Toda a compatibilidade de executáveis foi minuciosamente testada:``` ✅ Normal operation with browsers.json ✅ Fallback operation without browsers.json ✅ PyInstaller environment simulation ✅ All browser/platform combinations ✅ HTTP requests with fallback user agents
Seus aplicativos cloudscraper agora funcionarão perfeitamente quando convertidos em executáveis! 🎉
## 🆕 Suporte a Desafios JavaScript VM v3 do Cloudflare
### O que são os Desafios v3?
Os desafios v3 do Cloudflare representam a evolução mais recente na tecnologia de proteção contra bots. Diferentemente dos desafios tradicionais v1 e v2, os desafios v3:
- **Rodam em uma Máquina Virtual JavaScript**: Os desafios executam em um ambiente JavaScript isolado (sandbox)
- **Usam Detecção Avançada**: Algoritmos mais sofisticados para detectar comportamento automatizado
- **Geram Código Dinâmico**: O código do desafio é criado dinamicamente e mais difícil de fazer engenharia reversa
- **Oferecem Proteção Moderna**: A tecnologia antibot mais atual da Cloudflare
### Uso Básico do v3```python
import cloudscraper
# v3 support is enabled by default
scraper = cloudscraper.create_scraper()
response = scraper.get("https://example.com")
print(response.text)
import cloudscraper
scraper = cloudscraper.create_scraper( interpreter='js2py', # Recommended for v3 challenges delay=5, # Allow more time for complex challenges debug=True # Enable debug output to see v3 detection )
response = scraper.get("https://example.com") print(response.text)
### v3 com Diferentes Interpretadores JavaScript
Todos os interpretadores JavaScript funcionam com desafios v3:```python
# Test different interpreters for v3 challenges
interpreters = ['js2py', 'nodejs', 'native']
for interpreter in interpreters:
try:
scraper = cloudscraper.create_scraper(interpreter=interpreter)
response = scraper.get("https://example.com")
print(f"✅ {interpreter}: Success ({response.status_code})")
except Exception as e:
print(f"❌ {interpreter}: Failed - {str(e)}")
Quando o modo de depuração está ativado, você verá a detecção de desafios v3 em ação:```python scraper = cloudscraper.create_scraper(debug=True) response = scraper.get("https://example.com")
### Considerações de Desempenho para v3
Os desafios da v3 são mais complexos e podem exigir tempo adicional:```python
# Recommended settings for v3 challenges
scraper = cloudscraper.create_scraper(
delay=5, # Longer delay for complex challenges
interpreter='js2py', # Most compatible interpreter
enable_stealth=True # Additional stealth for v3 detection
)
import cloudscraper
scraper = cloudscraper.create_scraper()
response = scraper.get("https://example.com") print(f"Status: {response.status_code}") print(f"Content length: {len(response.text)}")
### Exemplo 2: Configuração Avançada para Máxima Compatibilidade```python
import cloudscraper
# Advanced configuration for challenging websites
scraper = cloudscraper.create_scraper(
# Challenge handling
interpreter='js2py', # Best compatibility for v3 challenges
delay=5, # Extra time for complex challenges
# Stealth mode
enable_stealth=True,
stealth_options={
'min_delay': 2.0,
'max_delay': 6.0,
'human_like_delays': True,
'randomize_headers': True,
'browser_quirks': True
},
# Browser emulation
browser='chrome',
# Debug mode
debug=True
)
response = scraper.get("https://example.com")
import cloudscraper
scraper = cloudscraper.create_scraper( captcha={ 'provider': '2captcha', 'api_key': 'your_2captcha_api_key' }, debug=True # See when Turnstile is detected and solved )
response = scraper.get("https://turnstile-protected-site.com") print(f"Successfully bypassed Turnstile: {response.status_code}")
### Exemplo 4: Rotação de Proxy com Suporte v3```python
import cloudscraper
proxies = [
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
'http://user:[email protected]:8080'
]
scraper = cloudscraper.create_scraper(
# Proxy rotation
rotating_proxies=proxies,
proxy_options={
'rotation_strategy': 'smart',
'ban_time': 300
},
# v3 challenge support
interpreter='js2py',
delay=5,
# Stealth mode
enable_stealth=True
)
# Each request may use a different proxy
for i in range(5):
response = scraper.get("https://example.com")
print(f"Request {i+1}: {response.status_code}")
import cloudscraper
def test_challenge_handling(): """Test different challenge types with comprehensive configuration"""
scraper = cloudscraper.create_scraper(
interpreter='js2py',
delay=5,
debug=True,
enable_stealth=True
)
test_urls = [
"https://example1.com", # Might have v1 challenges
"https://example2.com", # Might have v2 challenges
"https://example3.com", # Might have v3 challenges
"https://example4.com", # Might have Turnstile
]
for url in test_urls:
try:
response = scraper.get(url)
print(f"✅ {url}: Success ({response.status_code})")
except Exception as e:
print(f"❌ {url}: Failed - {str(e)}")
test_challenge_handling()
## 🧪 Testes e Verificação
### Suíte de Testes Abrangente
cloudscraper inclui scripts de teste abrangentes para verificar se todos os recursos funcionam corretamente:```bash
# Test all features
python test_all_features.py --debug
# Test specifically v3 challenges
python test_v3_challenges.py --debug
# Test with specific interpreter
python test_v3_challenges.py --interpreter nodejs
A biblioteca foi testada minuciosamente com 100% de taxa de sucesso para a funcionalidade principal:
*Requer configuração externa (proxies/chaves de API)
Você pode testar manualmente a biblioteca com o modo de depuração para ver a detecção de desafios em ação:```python import cloudscraper
scraper = cloudscraper.create_scraper(debug=True) response = scraper.get("https://example.com")
### Solução de problemas
Se você encontrar problemas:
1. **Ative o modo de depuração** para ver informações detalhadas
2. **Experimente diferentes interpretadores** (js2py, nodejs, native)
3. **Aumente o atraso** para desafios complexos
4. **Ative o modo stealth** para proteção adicional
5. **Verifique a configuração do proxy** se estiver usando proxies```python
# Troubleshooting configuration
scraper = cloudscraper.create_scraper(
debug=True, # See what's happening
interpreter='js2py', # Most compatible
delay=10, # Extra time
enable_stealth=True # Additional protection
)
Se você não quiser nem tentar resolver o Cloudflare v1 (obsoleto)..
| Parâmetro | Valor | Padrão |
|---|---|---|
| disableCloudflareV1 | (boolean) | False |
scraper = cloudscraper.create_scraper(disableCloudflareV1=True)
### Desativar Cloudflare V2
#### Descrição
Se você não quiser nem tentar resolver o Cloudflare v2..
#### Parâmetros
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|disableCloudflareV2|(boolean)|False|
#### Exemplo```python
scraper = cloudscraper.create_scraper(disableCloudflareV2=True)
Se você não quiser nem sequer tentar resolver a VM JavaScript do Cloudflare v3..
| Parâmetro | Valor | Padrão |
|---|---|---|
| disableCloudflareV3 | (boolean) | False |
scraper = cloudscraper.create_scraper(disableCloudflareV3=True)
### Desativar Turnstile
#### Descrição
Se você não quiser nem tentar resolver o Cloudflare Turnstile..
#### Parâmetros
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|disableTurnstile|(boolean)|False|
#### Exemplo```python
scraper = cloudscraper.create_scraper(disableTurnstile=True)
Rotacione automaticamente por uma lista de proxies para evitar bloqueio baseado em IP.
| Parâmetro | Valor | Padrão |
|---|---|---|
| rotating_proxies | (list ou dict) | None |
| proxy_options | (dict) | {} |
proxy_options| Parâmetro | Valor | Padrão |
|---|---|---|
| rotation_strategy | (string) sequential, random, or |
proxies = [ 'http://user:[email protected]:8080', 'http://user:[email protected]:8080', 'http://user:[email protected]:8080' ]
scraper = cloudscraper.create_scraper( rotating_proxies=proxies, proxy_options={ 'rotation_strategy': 'smart', 'ban_time': 300 } )
### Modo Stealth
#### Descrição
Ative técnicas furtivas para melhor imitar o comportamento humano e evitar detecção.
#### Parâmetros
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|enable_stealth|(boolean)|True|
|stealth_options|(dict)|{}|
#### Parâmetros de `stealth_options`
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|min_delay|(float) atraso mínimo entre requisições|1.0|
|max_delay|(float) atraso máximo entre requisições|5.0|
|human_like_delays|(boolean) adicionar atrasos aleatórios entre requisições|True|
|randomize_headers|(boolean) randomizar cabeçalhos para evitar fingerprinting|True|
|browser_quirks|(boolean) aplicar peculiaridades específicas do navegador|True|
#### Exemplo```python
scraper = cloudscraper.create_scraper(
enable_stealth=True,
stealth_options={
'min_delay': 2.0,
'max_delay': 6.0,
'human_like_delays': True,
'randomize_headers': True,
'browser_quirks': True
}
)
O suporte à descompressão Brotli foi adicionado e está ativado por padrão.
| Parâmetro | Valor | Padrão |
|---|---|---|
| allow_brotli | (booleano) | True |
scraper = cloudscraper.create_scraper(allow_brotli=False)
### Navegador / Filtragem de User-Agent
#### Descrição
Controle como e qual User-Agent é selecionado "aleatoriamente".
#### Parâmetros
Podem ser passados como um argumento para `create_scraper()`, `get_tokens()`, `get_cookie_string()`.
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|browser|(string) `chrome` or `firefox`|None|
Ou
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|browser|(dict)||
##### Parâmetros de `browser` *_dict_*
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|browser|(string) `chrome` or `firefox`|None|
|mobile|(boolean)|True|
|desktop|(boolean)|True|
|platform|(string) `'linux', 'windows', 'darwin', 'android', 'ios'`|None|
|custom|(string)|None|
#### Exemplo```python
scraper = cloudscraper.create_scraper(browser='chrome')
ou```python
scraper = cloudscraper.create_scraper( browser={ 'browser': 'chrome', 'platform': 'android', 'desktop': False } )
scraper = cloudscraper.create_scraper( browser={ 'browser': 'firefox', 'platform': 'windows', 'mobile': False } )
scraper = cloudscraper.create_scraper( browser={ 'custom': 'ScraperBot/1.0', } )
### Debug
#### Descrição
Imprime informações do cabeçalho e do conteúdo da solicitação para depuração.
#### Parâmetros
Pode ser definido como um atributo via seu objeto `cloudscraper` ou passado como argumento para `create_scraper()`, `get_tokens()`, `get_cookie_string()`.
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|debug|(boolean)|False|
#### Exemplo```python
scraper = cloudscraper.create_scraper(debug=True)
O desafio Cloudflare IUAM exige que o navegador aguarde ~5 segundos antes de enviar a resposta do desafio, caso você queira substituir esse atraso.
Pode ser definido como um atributo via seu objeto cloudscraper ou passado como argumento para create_scraper(), get_tokens(), get_cookie_string().
| Parâmetro | Valor | Padrão |
|---|---|---|
| delay | (float) | extraído da página IUAM |
scraper = cloudscraper.create_scraper(delay=10)
### Sessão existente
#### Descrição:
Se você já tem uma sessão Requests existente, pode passá-la para a função `create_scraper()` para continuar usando essa sessão.
#### Parâmetros
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|sess|(requests.session)|None|
#### Exemplo```python
session = requests.session()
scraper = cloudscraper.create_scraper(sess=session)
Infelizmente, nem todos os atributos de sessão do Requests são facilmente transferíveis, portanto, se você encontrar problemas com isso,
Você deve substituir sua chamada inicial de inicialização de sessão
De:```python sess = requests.session()
To:```python
sess = cloudscraper.create_scraper()
cloudscraper atualmente suporta os seguintes Motores/Interpretadores JavaScript
Pode ser definido como um atributo por meio do seu objeto cloudscraper ou passado como um argumento para create_scraper(), get_tokens(), get_cookie_string().
| Parâmetro | Valor | Padrão |
|---|---|---|
| interpreter | (string) | js2py |
scraper = cloudscraper.create_scraper(interpreter='nodejs')
#### Nota
A versão aprimorada usa `js2py` como interpretador padrão porque oferece melhor compatibilidade com os desafios modernos do Cloudflare. Se você encontrar problemas, pode tentar outros interpretadores.
------
### Solvers de Captcha de Terceiros
#### Descrição
O `cloudscraper` atualmente suporta os seguintes solvers de Captcha de terceiros, caso você precise deles.
- **[2captcha](https://www.2captcha.com/)**
- **[anticaptcha](https://www.anti-captcha.com/)**
- **[CapSolver](https://capsolver.com/)**
- **[CapMonster Cloud](https://capmonster.cloud/)**
- **[deathbycaptcha](https://www.deathbycaptcha.com/)**
- **[9kw](https://www.9kw.eu/)**
- **__return_response__**
#### Nota
Estou trabalhando para adicionar mais solvers de terceiros. Se você deseja que um serviço seja adicionado e que ainda não é suportado, por favor, abra um ticket de suporte no github.
##### Parâmetros Obrigatórios
Podem ser definidos como um atributo por meio do seu objeto `cloudscraper` ou passados como argumento para `create_scraper()`, `get_tokens()`, `get_cookie_string()`.
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|captcha|(dict)|None|
#### Suporte a Turnstile
Cloudflare Turnstile é uma nova alternativa de CAPTCHA que substitui os CAPTCHAs tradicionais por um sistema de verificação mais amigável. O cloudscraper agora suporta a resolução de desafios Turnstile usando os mesmos provedores de captcha com os quais você já está familiarizado.
##### Exemplo```python
# Using 2captcha to solve Turnstile challenges
scraper = cloudscraper.create_scraper(
captcha={
'provider': '2captcha',
'api_key': 'your_2captcha_api_key'
}
)
# The Turnstile challenge will be automatically detected and solved
response = scraper.get('https://example.com')
captcha Obrigatóriosse proxies estiverem definidos, você pode desativar o envio dos proxies para o 2captcha definindo no_proxy como True
scraper = cloudscraper.create_scraper( captcha={ 'provider': '2captcha', 'api_key': 'your_2captcha_api_key' } )
#### anticaptcha
##### Parâmetros `captcha` obrigatórios
|Parâmetro|Valor|Obrigatório|Padrão|
|-------------|:-------------:|:-----:|:-----:|
|provider|(string) `anticaptcha`|sim||
|api_key|(string)|sim||
|no_proxy|(boolean)|não|False|
##### Nota
se os proxies estiverem definidos, você pode desativar o envio dos proxies para o anticaptcha definindo `no_proxy` como `True`
##### Exemplo```python
scraper = cloudscraper.create_scraper(
captcha={
'provider': 'anticaptcha',
'api_key': 'your_anticaptcha_api_key'
}
)
captcha Obrigatórios| Parâmetro | Valor | Obrigatório | Padrão |
|---|---|---|---|
| provider | (string) captchaai | sim | |
| api_key | (string) | sim |
scraper = cloudscraper.create_scraper( captcha={ 'provider': 'capsolver', 'api_key': 'your_captchaai_api_key' } )
#### CapMonster Cloud
##### Parâmetros `captcha` Obrigatórios
|Parâmetro|Valor|Obrigatório|Padrão|
|-------------|:-------------:|:-----:|:-----:|
|provider|(string) `capmonster`| sim||
|clientKey|(string)| sim||
|no_proxy|(boolean)|não|False|
##### Nota
se proxies estiverem definidos, você pode desativar o envio dos proxies para o CapMonster definindo `no_proxy` como `True`
##### Exemplo```python
scraper = cloudscraper.create_scraper(
captcha={
'provider': 'capmonster',
'clientKey': 'your_capmonster_clientKey'
}
)
captcha obrigatóriosscraper = cloudscraper.create_scraper( captcha={ 'provider': 'deathbycaptcha', 'username': 'your_deathbycaptcha_username', 'password': 'your_deathbycaptcha_password', } )
#### 9kw
##### Parâmetros `captcha` obrigatórios
|Parâmetro|Valor|Obrigatório|Padrão|
|-------------|:-------------:|:-----:|:-----:|
|provider|(string) `9kw`|sim||
|api_key|(string)|sim||
|maxtimeout|(int)|não|180|
##### Exemplo```python
scraper = cloudscraper.create_scraper(
captcha={
'provider': '9kw',
'api_key': 'your_9kw_api_key',
'maxtimeout': 300
}
)
Use isto se quiser o payload de resposta da requisição sem resolver o Captcha.
captcha Obrigatórios| Parâmetro | Valor | Obrigatório | Padrão |
|---|---|---|---|
| provider | (string) return_response | sim |
scraper = cloudscraper.create_scraper( captcha={'provider': 'return_response'} )
## Integração
É fácil integrar `cloudscraper` com outras aplicações e ferramentas. O Cloudflare usa dois cookies como tokens: um para verificar que você passou pela página de desafio e outro para rastrear sua sessão. Para contornar a página de desafio, basta incluir ambos os cookies (com o user-agent apropriado) em todas as solicitações HTTP que você fizer.
Para obter apenas os cookies (como um dicionário), use `cloudscraper.get_tokens()`. Para obtê-los como um cabeçalho HTTP `Cookie` completo, use `cloudscraper.get_cookie_string()`.
`get_tokens` e `get_cookie_string` aceitam os argumentos de palavra-chave usuais do Requests (como `get_tokens(url, proxies={"http": "socks5://localhost:9050"})`).
Leia a [documentação do Requests sobre argumentos de requisição](http://docs.python-requests.org/en/master/api/#requests.Session.request) para mais informações.
------
### Manipulação do User-Agent
As duas funções de integração retornam uma tupla de `(cookie, user_agent_string)`.
**Você deve usar a mesma string de user-agent para obter os tokens e para fazer requisições com esses tokens; caso contrário, o Cloudflare vai marcá-lo como bot.**
Isso significa que você precisa passar a `user_agent_string` retornada para qualquer script, ferramenta ou serviço ao qual esteja passando os tokens (por exemplo, curl ou uma ferramenta especializada de scraping), e ele deve usar esse user-agent fornecido ao fazer solicitações HTTP.
------
### Exemplos de integração
Lembre-se: você deve sempre usar o mesmo user-agent ao obter ou utilizar esses cookies. Todas essas funções retornam uma tupla de `(cookie_dict, user_agent_string)`.
------
#### Obtendo um dicionário de cookies através de um proxy
`get_tokens` é uma função de conveniência para retornar um dicionário Python contendo os cookies de sessão do Cloudflare. Para demonstração, vamos configurar esta requisição para usar um proxy. (Observe que, se você solicitar tokens de liberação do Cloudflare através de um proxy, você deve sempre usar o mesmo proxy ao passar esses tokens para o servidor. O Cloudflare exige que o IP que resolve o desafio e o IP do visitante permaneçam os mesmos.)
Se você não deseja usar um proxy, basta não passar o argumento de palavra-chave `proxies`. Essas funções de conveniência suportam todos os argumentos de palavra-chave normais do Requests, como `params`, `data` e `headers`.```python
import cloudscraper
# Using a single proxy
proxies = {"http": "http://localhost:8080", "https": "http://localhost:8080"}
tokens, user_agent = cloudscraper.get_tokens("http://somesite.com", proxies=proxies)
print(tokens)
# => {
'cf_clearance': 'c8f913c707b818b47aa328d81cab57c349b1eee5-1426733163-3600',
'__cfduid': 'dd8ec03dfdbcb8c2ea63e920f1335c1001426733158',
'cf_chl_2': 'some_value',
'cf_chl_prog': 'some_value'
}
# Using proxy rotation
rotating_proxies = [
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
'http://user:[email protected]:8080'
]
tokens, user_agent = cloudscraper.get_tokens(
"http://somesite.com",
rotating_proxies=rotating_proxies,
proxy_options={
'rotation_strategy': 'smart',
'ban_time': 300
},
enable_stealth=True,
stealth_options={
'min_delay': 2.0,
'max_delay': 6.0
}
)
get_cookie_string é uma função de conveniência para retornar os tokens como uma string para uso como valor do cabeçalho HTTP Cookie.
Isso é útil ao criar uma solicitação HTTP manualmente, ou ao trabalhar com um aplicativo ou biblioteca externa que repassa cabeçalhos de cookie brutos.```python import cloudscraper
cookie_value, user_agent = cloudscraper.get_cookie_string('http://somesite.com')
print('GET / HTTP/1.1\nCookie: {}\nUser-Agent: {}\n'.format(cookie_value, user_agent))
#### exemplo de curl
Aqui está um exemplo de integração do cloudscraper com o curl. Como você pode ver, tudo o que você precisa fazer é passar os cookies e o user-agent para o curl.```python
import subprocess
import cloudscraper
# With get_tokens() cookie dict:
# tokens, user_agent = cloudscraper.get_tokens("http://somesite.com")
# cookie_arg = 'cf_clearance={}; __cfduid={}'.format(tokens['cf_clearance'], tokens['__cfduid'])
# With get_cookie_string() cookie header; recommended for curl and similar external applications:
cookie_arg, user_agent = cloudscraper.get_cookie_string('http://somesite.com')
# With a custom user-agent string you can optionally provide:
# ua = "Scraping Bot"
# cookie_arg, user_agent = cloudscraper.get_cookie_string("http://somesite.com", user_agent=ua)
result = subprocess.check_output(
[
'curl',
'--cookie',
cookie_arg,
'-A',
user_agent,
'http://somesite.com'
]
)
Versão reduzida. Imprime o conteúdo da página de qualquer site protegido com Cloudflare, via curl.
Aviso: shell=True pode ser perigoso de usar com subprocess em código real.```python
url = "http://somesite.com"
cookie_arg, user_agent = cloudscraper.get_cookie_string(url)
cmd = "curl --cookie {cookie_arg} -A {user_agent} {url}"
print(
subprocess.check_output(
cmd.format(
cookie_arg=cookie_arg,
user_agent=user_agent,
url=url
),
shell=True
)
)
### Criptografia
#### Descrição
Controla a comunicação entre cliente e servidor
#### Parâmetros
Podem ser passados como argumento para `create_scraper()`.
|Parâmetro|Valor|Padrão|
|-------------|:-------------:|:-----:|
|cipherSuite|(string)|None|
|ecdhCurve|(string)|prime256v1|
|server_hostname|(string)|None|
#### Exemplo```python
# Some servers require the use of a more complex ecdh curve than the default "prime256v1"
# It may can solve handshake failure
scraper = cloudscraper.create_scraper(ecdhCurve='secp384r1')
(no input provided)```python
scraper = cloudscraper.create_scraper(server_hostname='www.somesite.com') scraper.get( 'https://backend.hosting.com/', headers={'Host': 'www.somesite.com'} )
# Funcionalidades Aprimoradas
Esta versão aprimorada do cloudscraper oferece melhores capacidades para contornar mecanismos modernos de proteção do Cloudflare:
1. **Suporte a Desafios Cloudflare v2** - Melhor tratamento de desafios modernos
2. **Rotação de Proxy** - Rotação inteligente com múltiplas estratégias
3. **Modo Furtivo** - Simulação de comportamento humano
4. **Tratamento Aprimorado de JavaScript** - Melhor interpretador JS (js2py como padrão)
5. **Gerenciamento Aprimorado de Cookies** - Suporte para tipos mais recentes de cookies do Cloudflare
## Atualizações Recentes
- **Limpeza da Base de Código**: Código redundante removido e consolidado em um único módulo
- **Atualizações da Suíte de Testes**: Todos os testes agora usam o módulo cloudscraper
- **Documentação**: README melhorado com exemplos mais claros e instruções de uso
## Exemplo Usando Todas as Funcionalidades Aprimoradas```python
import cloudscraper
# Create a scraper with all enhanced features
scraper = cloudscraper.create_scraper(
# Use js2py interpreter for better compatibility
interpreter='js2py',
# Enable proxy rotation
rotating_proxies=[
'http://user:[email protected]:8080',
'http://user:[email protected]:8080',
'http://user:[email protected]:8080'
],
proxy_options={
'rotation_strategy': 'smart',
'ban_time': 300
},
# Enable stealth mode
enable_stealth=True,
stealth_options={
'min_delay': 2.0,
'max_delay': 6.0,
'human_like_delays': True,
'randomize_headers': True,
'browser_quirks': True
},
# Set browser fingerprint
browser={
'browser': 'chrome',
'platform': 'windows',
'mobile': False
},
# Enable debugging if needed
debug=False
)
# Make a request to a Cloudflare-protected site
response = scraper.get('https://example.com')
print(response.text)
Suporte a desafios JavaScript VM v3 do Cloudflare
Suporte aprimorado ao Turnstile
Aprimoramentos do interpretador JavaScript
Detecção de desafios
Opções de configuração
disableCloudflareV3 para tratamento seletivo de desafiosSuíte de testes abrangente
Documentação
A biblioteca inclui scripts de teste abrangentes para verificar a funcionalidade:
Teste rápido para verificar se a biblioteca está funcionando:```python import cloudscraper
scraper = cloudscraper.create_scraper(browser='chrome')
response = scraper.get('https://example.com') print(f"Status code: {response.status_code}")
### Executando a Suíte de Testes
A biblioteca inclui vários scripts de teste:```bash
# Run the comprehensive test suite
python test_cloudscraper_comprehensive.py https://example-cloudflare-site.com
# Test with a specific Cloudflare-protected site
python test_cloudflare_site.py https://example-cloudflare-site.com --browser firefox --stealth
Se você encontrar problemas:
Para problemas ou perguntas, abra uma issue no repositório do GitHub.```bash pip install --upgrade cloudscraper # Always use the latest version
| Funcionalidade | Cobertura de Testes | Taxa de Sucesso |
|---|
| Basic Requests | ✅ Completo | 100% |
| User Agent Handling | ✅ Completo | 100% |
| Cloudflare v1 Challenges | ✅ Completo | 100% |
| Cloudflare v2 Challenges | ✅ Completo | 100% |
| Cloudflare v3 Challenges | ✅ NOVO | 100% |
| Stealth Mode | ✅ Completo | 100% |
| JavaScript Interpreters | ✅ Todos Suportados | 100% |
| Proxy Rotation | ✅ Completo | N/A* |
| Turnstile Support | ✅ Completo | N/A* |
smartsequential |
| ban_time | (int) segundos para banir um proxy após a falha | 300 |
| Parâmetro | Valor | Obrigatório | Padrão |
|---|
| provider | (string) 2captcha | sim | |
| api_key | (string) | sim | |
| no_proxy | (boolean) | não | False |
| Parâmetro | Valor | Obrigatório | Padrão |
|---|
| provider | (string) deathbycaptcha | sim | |
| username | (string) | sim | |
| password | (string) | sim |