
Un módulo de Python para evadir la página anti-bot de Cloudflare.
Mejorado por Zied Boughdir
Todas las funciones probadas con 100% de tasa de éxito para la funcionalidad principal:
Un módulo de Python para eludir la página antibot de Cloudflare (también conocida como "I'm Under Attack Mode", o IUAM), implementado con Requests. Esta versión mejorada incluye soporte para los desafíos v2 de Cloudflare, rotación de proxies, modo sigilo y más. Cloudflare cambia sus técnicas periódicamente, por lo que actualizaré este repositorio con frecuencia.
Esto puede ser útil si deseas hacer scraping o rastrear un sitio web protegido con Cloudflare. La página antibot de Cloudflare actualmente solo comprueba si el cliente soporta Javascript, aunque pueden añadir técnicas adicionales en el futuro.
Debido a que Cloudflare cambia y endurece continuamente su página de protección, cloudscraper requiere un motor/intérprete de JavaScript para resolver los desafíos de Javascript. Esto permite al script hacerse pasar fácilmente por un navegador web normal sin desofuscar y analizar explícitamente el Javascript de Cloudflare.
Como referencia, este es el mensaje predeterminado que Cloudflare utiliza para este tipo de páginas:``` 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...
Cualquier script que use cloudscraper se pausará durante ~5 segundos en la primera visita a cualquier sitio con la protección anti-bots de Cloudflare activada, aunque no se producirá ningún retraso después de la primera solicitud.
# Instalación
Simplemente ejecuta `pip install cloudscraper`. El paquete de PyPI está en https://pypi.org/project/cloudscraper/```bash
pip install cloudscraper
Alternativamente, clona este repositorio y ejecuta python setup.py install.
Si anteriormente usabas el paquete original cloudscraper, ahora puedes usar esta versión mejorada directamente:```python
import cloudscraper # Enhanced version
La API sigue siendo compatible, por lo que solo necesitas cambiar las declaraciones de importación en tu código. Todas las llamadas a funciones y parámetros funcionan de la misma manera.
### Estructura de la base de código
La base de código se ha optimizado para mejorar el mantenimiento y reducir la confusión:
- **Módulo único**: Todo el código está ahora en el módulo `cloudscraper`
- **Redundancia eliminada**: Se han eliminado los directorios redundantes
- **Pruebas actualizadas**: Todos los archivos de prueba se han actualizado para usar el módulo `cloudscraper`
Esto hace que la base de código sea más limpia y fácil de mantener, a la vez que garantiza la compatibilidad con versiones anteriores del código existente que utiliza la API original.
## Características clave en cloudscraper
| Característica | Descripción | Estado |
|---------|-------------|--------|
| **🆕 Compatibilidad de ejecutables** | Corrección completa para la conversión con PyInstaller, cx_Freeze y auto-py-to-exe | ✅ **CORREGIDO** |
| **🆕 Desafíos de VM de JavaScript v3** | Soporte para los últimos desafíos basados en VM de JavaScript de Cloudflare | ✅ **NUEVO** |
| **🆕 Soporte para Turnstile** | Soporte para el nuevo reemplazo de CAPTCHA de Cloudflare, Turnstile | ✅ **NUEVO** |
| **Soporte de desafíos modernos** | Soporte mejorado para los desafíos v1, v2, v3 y Turnstile de Cloudflare | ✅ Completo |
| **Rotación de proxies** | Rotación inteligente de proxies integrada con múltiples estrategias | ✅ Mejorado |
| **Modo sigiloso** | Simulación de comportamiento humano para evitar la detección | ✅ Mejorado |
| **Emulación de navegador** | Huella digital avanzada de navegador para Chrome y Firefox | ✅ Estable |
| **Manejo de JavaScript** | Mejor intérprete de JS (js2py por defecto) para resolver desafíos | ✅ Mejorado |
| **Solucionadores de CAPTCHA** | Soporte para múltiples servicios de resolución de CAPTCHA | ✅ Estable |
# Dependencias
- **Python 3.8+** (se eliminó la compatibilidad con Python 3.6 y 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á automáticamente las dependencias de Python. Los intérpretes y/o motores de JavaScript que decidas usar son lo único que necesitas instalar tú mismo, excluyendo js2py, que forma parte de los requisitos por defecto.
# Intérpretes y motores de JavaScript
Admitimos los siguientes intérpretes/motores de JavaScript.
- **[ChakraCore](https://github.com/microsoft/ChakraCore):** Los binarios de la biblioteca también se pueden localizar [aquí](https://www.github.com/VeNoMouS/cloudscraper/tree/ChakraCore/).
- **[js2py](https://github.com/PiotrDabkowski/Js2Py):** >=0.74 **(Por defecto para la versión mejorada)**
- **native**: Solucionador nativo de Python de creación propia
- **[Node.js](https://nodejs.org/)**
- **[V8](https://github.com/sony/v8eval/):** Usamos el módulo de Python [v8eval](https://v8.dev)() de Sony.
# Uso
La forma más sencilla de usar cloudscraper es llamando a `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>..."
Eso es todo...
Cualquier solicitud realizada desde este objeto de sesión a sitios web protegidos por el anti-bot de Cloudflare se gestionará automáticamente. Los sitios web que no usen Cloudflare se tratarán con normalidad. No necesitas configurar ni llamar nada más, y puedes tratar de manera efectiva todos los sitios web como si no estuvieran protegidos con nada.
Usas cloudscraper exactamente de la misma manera en que usas Requests. cloudScraper funciona de forma idéntica a un objeto Session de Requests, solo que en lugar de llamar a requests.get() o requests.post(), llamas a scraper.get() o scraper.post().
Consulta la documentación de Requests para más información.
El problema del user agent al convertir aplicaciones Python que usan cloudscraper en ejecutables se ha solucionado por completo.
Al convertir aplicaciones Python en ejecutables (usando PyInstaller, cx_Freeze, auto-py-to-exe, etc.), los usuarios encontraban errores relacionados con el user agent o la funcionalidad agent_user porque el archivo browsers.json no se incluía correctamente.
cloudscraper v2.7.0 incluye un sistema de respaldo automático:
Opción 1: Simplemente compila tu ejecutable (funciona automáticamente):```bash pyinstaller your_app.py
**Opción 2: Incluir base de datos completa de user agents** (recomendado):```bash
pyinstaller --add-data "cloudscraper/user_agent/browsers.json;cloudscraper/user_agent/" your_app.py
Toda la compatibilidad de ejecutables ha sido probada a fondo:``` ✅ Normal operation with browsers.json ✅ Fallback operation without browsers.json ✅ PyInstaller environment simulation ✅ All browser/platform combinations ✅ HTTP requests with fallback user agents
Tus aplicaciones cloudscraper ahora funcionarán perfectamente cuando se conviertan en ejecutables. 🎉
## 🆕 Soporte para desafíos JavaScript VM de Cloudflare v3
### ¿Qué son los desafíos v3?
Los desafíos v3 de Cloudflare representan la última evolución en tecnología de protección contra bots. A diferencia de los desafíos tradicionales v1 y v2, los desafíos v3:
- **Se ejecutan en una máquina virtual JavaScript**: Los desafíos se ejecutan en un entorno JavaScript sandbox
- **Usan detección avanzada**: Algoritmos más sofisticados para detectar comportamiento automatizado
- **Generan código dinámico**: El código del desafío se crea dinámicamente y es más difícil de aplicar ingeniería inversa
- **Proporcionan protección moderna**: La tecnología anti-bot más actual de Cloudflare
### Uso básico de 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 con diferentes intérpretes de JavaScript
Todos los intérpretes de JavaScript funcionan con los desafíos 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)}")
Cuando el modo de depuración está habilitado, verás la detección de desafíos v3 en acción:```python scraper = cloudscraper.create_scraper(debug=True) response = scraper.get("https://example.com")
### Consideraciones de rendimiento para v3
Los desafíos de v3 son más complejos y pueden requerir tiempo 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)}")
### Ejemplo 2: Configuración avanzada para máxima compatibilidad```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}")
### Ejemplo 4: Rotación de Proxy con Soporte 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()
## 🧪 Pruebas y Verificación
### Suite de pruebas integral
cloudscraper incluye scripts de prueba integrales para verificar que todas las funciones funcionan correctamente:```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
La librería ha sido probada exhaustivamente con una tasa de éxito del 100% para la funcionalidad principal:
*Requiere configuración externa (proxies/claves de API)
Puedes probar manualmente la librería con el modo de depuración para ver la detección de desafíos en acción:```python import cloudscraper
scraper = cloudscraper.create_scraper(debug=True) response = scraper.get("https://example.com")
### Solución de problemas
Si encuentras problemas:
1. **Activa el modo de depuración** para ver información detallada
2. **Prueba diferentes intérpretes** (js2py, nodejs, native)
3. **Aumenta el retraso** para desafíos complejos
4. **Activa el modo sigiloso** para protección adicional
5. **Comprueba la configuración del proxy** si usas 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
)
Si no deseas ni siquiera intentar resolver Cloudflare v1 (obsoleto)..
| Parámetro | Valor | Predeterminado |
|---|---|---|
| disableCloudflareV1 | (boolean) | False |
scraper = cloudscraper.create_scraper(disableCloudflareV1=True)
### Deshabilitar Cloudflare V2
#### Descripción
Si no quieres ni siquiera intentar resolver Cloudflare v2..
#### Parámetros
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|disableCloudflareV2|(boolean)|False|
#### Ejemplo```python
scraper = cloudscraper.create_scraper(disableCloudflareV2=True)
Si no quieres intentar siquiera resolver la VM de JavaScript de Cloudflare v3..
| Parámetro | Valor | Por defecto |
|---|---|---|
| disableCloudflareV3 | (boolean) | False |
scraper = cloudscraper.create_scraper(disableCloudflareV3=True)
### Desactivar Turnstile
#### Descripción
Si no quieres ni siquiera intentar resolver Cloudflare Turnstile..
#### Parámetros
|Parámetro|Valor|Por defecto|
|-------------|:-------------:|:-----:|
|disableTurnstile|(boolean)|False|
#### Ejemplo```python
scraper = cloudscraper.create_scraper(disableTurnstile=True)
Rota automáticamente a través de una lista de proxies para evitar bloqueos basados en IP.
| Parámetro | Valor | Por defecto |
|---|---|---|
| rotating_proxies | (lista o dict) | None |
| proxy_options | (dict) | {} |
proxy_options| Parámetro | Valor | Por defecto |
|---|---|---|
| rotation_strategy | (cadena) sequential, random o |
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 sigiloso
#### Descripción
Habilita técnicas de sigilo para imitar mejor el comportamiento humano y evitar la detección.
#### Parámetros
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|enable_stealth|(boolean)|True|
|stealth_options|(dict)|{}|
#### Parámetros de `stealth_options`
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|min_delay|(float) retardo mínimo entre solicitudes|1.0|
|max_delay|(float) retardo máximo entre solicitudes|5.0|
|human_like_delays|(boolean) añade retardos aleatorios entre solicitudes|True|
|randomize_headers|(boolean) aleatoriza las cabeceras para evitar la toma de huellas|True|
|browser_quirks|(boolean) aplica peculiaridades específicas del navegador|True|
#### Ejemplo```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
}
)
Se ha añadido soporte de descompresión Brotli, y está habilitado por defecto.
| Parámetro | Valor | Por defecto |
|---|---|---|
| allow_brotli | (booleano) | True |
scraper = cloudscraper.create_scraper(allow_brotli=False)
### Filtrado de Navegador / User-Agent
#### Descripción
Controla cómo y cuál User-Agent se selecciona "aleatoriamente".
#### Parámetros
Se puede pasar como argumento a `create_scraper()`, `get_tokens()`, `get_cookie_string()`.
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|browser|(string) `chrome` o `firefox`|None|
O
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|browser|(dict)||
##### Parámetros de `browser` *_dict_*
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|browser|(string) `chrome` o `firefox`|None|
|mobile|(boolean)|True|
|desktop|(boolean)|True|
|platform|(string) `'linux', 'windows', 'darwin', 'android', 'ios'`|None|
|custom|(string)|None|
#### Ejemplo```python
scraper = cloudscraper.create_scraper(browser='chrome')
o```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
#### Descripción
Imprime la información de encabezado y contenido de la solicitud para depuración.
#### Parámetros
Se puede establecer como atributo mediante tu objeto `cloudscraper` o pasarse como argumento a `create_scraper()`, `get_tokens()`, `get_cookie_string()`.
|Parámetro|Valor|Por defecto|
|-------------|:-------------:|:-----:|
|debug|(booleano)|False|
#### Ejemplo```python
scraper = cloudscraper.create_scraper(debug=True)
El desafío de Cloudflare IUAM requiere que el navegador espere ~5 segundos antes de enviar la respuesta del desafío. Si desea anular este retraso.
Se puede establecer como un atributo a través de su objeto cloudscraper o pasarse como argumento a create_scraper(), get_tokens(), get_cookie_string().
| Parámetro | Valor | Predeterminado |
|---|---|---|
| delay | (float) | extraído de la página de IUAM |
scraper = cloudscraper.create_scraper(delay=10)
### Sesión existente
#### Descripción:
Si ya tienes una sesión de Requests existente, puedes pasarla a la función `create_scraper()` para seguir usando esa sesión.
#### Parámetros
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|sess|(requests.session)|None|
#### Ejemplo```python
session = requests.session()
scraper = cloudscraper.create_scraper(sess=session)
Desafortunadamente, no todos los atributos de sesión de Requests son fácilmente transferibles, así que si tienes problemas con esto,
Deberías reemplazar tu llamada inicial de inicialización de sesión
De:```python sess = requests.session()
Para:```python
sess = cloudscraper.create_scraper()
cloudscraper actualmente admite los siguientes Motores/Intérpretes de JavaScript
Se puede establecer como un atributo a través de tu objeto cloudscraper o pasarse como argumento a create_scraper(), get_tokens(), get_cookie_string().
| Parámetro | Valor | Predeterminado |
|---|---|---|
| interpreter | (string) | js2py |
scraper = cloudscraper.create_scraper(interpreter='nodejs')
#### Nota
La versión mejorada utiliza `js2py` como intérprete predeterminado porque ofrece una mejor compatibilidad con los desafíos modernos de Cloudflare. Si encuentras problemas, puedes probar otros intérpretes.
------
### Solucionadores de Captcha de Terceros
#### Descripción
`cloudscraper` actualmente soporta los siguientes solucionadores de Captcha de terceros, en caso de que los necesites.
- **[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
Estoy trabajando en agregar más solucionadores de terceros; si deseas que se agregue un servicio que actualmente no es compatible, por favor abre un ticket de soporte en GitHub.
##### Parámetros Requeridos
Se pueden establecer como un atributo mediante tu objeto `cloudscraper` o pasarse como argumento a `create_scraper()`, `get_tokens()`, `get_cookie_string()`.
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|captcha|(dict)|None|
#### Soporte para Turnstile
Cloudflare Turnstile es una nueva alternativa a los CAPTCHA que reemplaza los CAPTCHA tradicionales con un sistema de verificación más amigable para el usuario. cloudscraper ahora es compatible con la resolución de desafíos Turnstile usando los mismos proveedores de captcha que ya conoces.
##### Ejemplo```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 requeridossi los proxies están configurados, puedes deshabilitar el envío de los proxies a 2captcha estableciendo no_proxy en True
scraper = cloudscraper.create_scraper( captcha={ 'provider': '2captcha', 'api_key': 'your_2captcha_api_key' } )
#### anticaptcha
##### Parámetros `captcha` Requeridos
|Parámetro|Valor|Requerido|Predeterminado|
|-------------|:-------------:|:-----:|:-----:|
|provider|(string) `anticaptcha`|sí||
|api_key|(string)|sí||
|no_proxy|(boolean)|no|False|
##### Nota
si hay proxies configurados, puedes desactivar el envío de los proxies a anticaptcha estableciendo `no_proxy` en `True`
##### Ejemplo```python
scraper = cloudscraper.create_scraper(
captcha={
'provider': 'anticaptcha',
'api_key': 'your_anticaptcha_api_key'
}
)
captcha requeridos'provider': 'capsolver',
'api_key': 'your_captchaai_api_key'
} )
#### CapMonster Cloud
##### Parámetros `captcha` requeridos
|Parámetro|Valor|Requerido|Por defecto|
|-------------|:-------------:|:-----:|:-----:|
|provider|(string) `capmonster`| sí||
|clientKey|(string)| sí||
|no_proxy|(boolean)|no|False|
##### Nota
si hay proxies configurados, puedes desactivar el envío de los proxies a CapMonster estableciendo `no_proxy` en `True`
##### Ejemplo```python
scraper = cloudscraper.create_scraper(
captcha={
'provider': 'capmonster',
'clientKey': 'your_capmonster_clientKey'
}
)
captcha requeridosscraper = cloudscraper.create_scraper( captcha={ 'provider': 'deathbycaptcha', 'username': 'your_deathbycaptcha_username', 'password': 'your_deathbycaptcha_password', } )
#### 9kw
##### Parámetros `captcha` requeridos
|Parámetro|Valor|Requerido|Predeterminado|
|-------------|:-------------:|:-----:|:-----:|
|provider|(string) `9kw`|sí||
|api_key|(string)|sí||
|maxtimeout|(int)|no|180|
##### Ejemplo```python
scraper = cloudscraper.create_scraper(
captcha={
'provider': '9kw',
'api_key': 'your_9kw_api_key',
'maxtimeout': 300
}
)
Úsalo si quieres el payload de la respuesta de requests sin resolver el Captcha.
captcha| Parámetro | Valor | Requerido | Predeterminado |
|---|---|---|---|
| provider | (string) return_response | sí |
scraper = cloudscraper.create_scraper( captcha={'provider': 'return_response'} )
## Integración
Es fácil integrar `cloudscraper` con otras aplicaciones y herramientas. Cloudflare utiliza dos cookies como tokens: una para verificar que superaste su página de desafío y otra para rastrear tu sesión. Para omitir la página de desafío, simplemente incluye ambas cookies (con el user-agent adecuado) en todas las solicitudes HTTP que realices.
Para recuperar solo las cookies (como diccionario), usa `cloudscraper.get_tokens()`. Para recuperarlas como una cabecera HTTP `Cookie` completa, usa `cloudscraper.get_cookie_string()`.
Tanto `get_tokens` como `get_cookie_string` aceptan los argumentos de palabra clave habituales de Requests (como `get_tokens(url, proxies={"http": "socks5://localhost:9050"})`).
Consulta la [documentación de Requests sobre argumentos de solicitud](http://docs.python-requests.org/en/master/api/#requests.Session.request) para obtener más información.
------
### Manejo del User-Agent
Las dos funciones de integración devuelven una tupla de `(cookie, user_agent_string)`.
**Debes usar la misma cadena de user-agent tanto para obtener los tokens como para hacer solicitudes con esos tokens; de lo contrario, Cloudflare te marcará como bot.**
Eso significa que tienes que pasar la `user_agent_string` devuelta al script, herramienta o servicio al que le estés pasando los tokens (por ejemplo, curl o una herramienta de scraping especializada), y debe usar ese user-agent cuando realice solicitudes HTTP.
------
### Ejemplos de integración
Recuerda que siempre debes usar el mismo user-agent al recuperar o usar estas cookies. Estas funciones devuelven una tupla de `(cookie_dict, user_agent_string)`.
------
#### Recuperar un diccionario de cookies a través de un proxy
`get_tokens` es una función de conveniencia para devolver un diccionario de Python que contiene las cookies de sesión de Cloudflare. Como demostración, configuraremos esta solicitud para usar un proxy. (Ten en cuenta que si solicitas tokens de autorización de Cloudflare a través de un proxy, siempre debes usar el mismo proxy cuando esos tokens se pasen al servidor. Cloudflare requiere que la IP que resuelve el desafío y la IP del visitante sigan siendo las mismas.)
Si no deseas usar un proxy, simplemente no pases el argumento de palabra clave `proxies`. Estas funciones de conveniencia admiten todos los argumentos de palabra clave normales de Requests, como `params`, `data` y `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 es una función de conveniencia que devuelve los tokens como una cadena para usarse como valor de encabezado HTTP Cookie.
Esto es útil al crear una solicitud HTTP manualmente, o al trabajar con una aplicación o biblioteca externa que maneja encabezados de cookie sin procesar.```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))
#### ejemplo de curl
Aquí hay un ejemplo de integración de cloudscraper con curl. Como puedes ver, todo lo que tienes que hacer es pasar las cookies y el user-agent a 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'
]
)
Versión reducida. Imprime el contenido de la página de cualquier sitio protegido con Cloudflare, mediante curl.
Advertencia: el uso de shell=True con subprocess puede ser peligroso en 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
)
)
### Criptografía
#### Descripción
Controla la comunicación entre el cliente y el servidor
#### Parámetros
Se puede pasar como argumento a `create_scraper()`.
|Parámetro|Valor|Predeterminado|
|-------------|:-------------:|:-----:|
|cipherSuite|(string)|None|
|ecdhCurve|(string)|prime256v1|
|server_hostname|(string)|None|
#### Ejemplo```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')
I don't see any content to translate. The message ends with "INPUT:" but no actual text follows.
Please provide the Markdown content for chunk 97 of 106, and I'll translate it from English to Spanish according to all the rules above.```python
scraper = cloudscraper.create_scraper(server_hostname='www.somesite.com') scraper.get( 'https://backend.hosting.com/', headers={'Host': 'www.somesite.com'} )
# Características Mejoradas
Esta versión mejorada de cloudscraper ofrece mejores capacidades para evadir los mecanismos modernos de protección de Cloudflare:
1. **Soporte para desafíos Cloudflare v2** - Mejor manejo de desafíos modernos
2. **Rotación de proxies** - Rotación inteligente con múltiples estrategias
3. **Modo sigiloso** - Simulación de comportamiento humano
4. **Manejo mejorado de JavaScript** - Mejor intérprete de JS (js2py por defecto)
5. **Gestión mejorada de cookies** - Soporte para tipos de cookies más recientes de Cloudflare
## Actualizaciones Recientes
- **Limpieza del código base**: Se eliminó código redundante y se consolidó en un solo módulo
- **Actualizaciones de la suite de pruebas**: Todas las pruebas ahora usan el módulo cloudscraper
- **Documentación**: README mejorado con ejemplos más claros e instrucciones de uso
## Ejemplo Usando Todas las Características Mejoradas```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)
Compatibilidad con el desafío JavaScript VM v3 de Cloudflare
Compatibilidad mejorada con Turnstile
Mejoras en el intérprete de JavaScript
Detección de desafíos
Opciones de configuración
disableCloudflareV3 para el manejo selectivo de desafíosSuite de pruebas integral
Documentación
La biblioteca incluye scripts de prueba integrales para verificar la funcionalidad:
Prueba rápida para verificar que la biblioteca funciona:```python import cloudscraper
scraper = cloudscraper.create_scraper(browser='chrome')
response = scraper.get('https://example.com') print(f"Status code: {response.status_code}")
### Ejecutando la suite de pruebas
La biblioteca incluye varios scripts de prueba:```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
Si encuentras problemas:
Para problemas o preguntas, por favor abre un issue en el repositorio de GitHub.```bash pip install --upgrade cloudscraper # Always use the latest version
| Característica | Cobertura de Pruebas | Tasa de Éxito |
|---|
| Basic Requests | ✅ Completa | 100% |
| User Agent Handling | ✅ Completa | 100% |
| Cloudflare v1 Challenges | ✅ Completa | 100% |
| Cloudflare v2 Challenges | ✅ Completa | 100% |
| Cloudflare v3 Challenges | ✅ NUEVO | 100% |
| Stealth Mode | ✅ Completa | 100% |
| JavaScript Interpreters | ✅ Todos Soportados | 100% |
| Proxy Rotation | ✅ Completa | N/A* |
| Turnstile Support | ✅ Completa | N/A* |
smartsequential |
| ban_time | (int) segundos para bloquear un proxy tras un fallo | 300 |
| Parámetro | Valor | Requerido | Predeterminado |
|---|
| provider | (string) 2captcha | sí | |
| api_key | (string) | sí | |
| no_proxy | (boolean) | no | False |
| Parámetro | Valor | Requerido | Por defecto |
|---|
| provider | (string) captchaai | sí | |
| api_key | (string) | sí | |
| scraper = cloudscraper.create_scraper( | |||
| captcha={ |
| Parámetro | Valor | Requerido | Predeterminado |
|---|
| provider | (string) deathbycaptcha | sí | |
| username | (string) | sí | |
| password | (string) | sí |