cloudscraper25 - Enhanced Edition

Enhanced by Zied Boughdir
Latest Release: v2.7.0 π
π Major New Features
- β
Executable Compatibility Fix - Complete solution for PyInstaller, cx_Freeze, and auto-py-to-exe conversion
- Cloudflare v3 JavaScript VM Challenge Support - Handle the latest and most sophisticated Cloudflare protection
- Cloudflare Turnstile Challenge Support - Support for Cloudflare's CAPTCHA alternative
- Enhanced JavaScript Interpreter Support - Improved VM-based challenge execution
- Complete Protection Coverage - Now supports all Cloudflare challenge types (v1, v2, v3, Turnstile)
π§ Improvements
- π― Fixed User Agent Issues in Executables - Automatic fallback system for missing browsers.json
- π‘οΈ PyInstaller Detection - Automatically detects and handles executable environments
- π¦ Comprehensive Fallback System - 70+ built-in user agents covering all platforms
- Enhanced proxy rotation and stealth mode capabilities
- Better detection and handling of modern Cloudflare protection mechanisms
- Improved compatibility with all JavaScript interpreters (js2py, nodejs, native)
- Updated documentation with comprehensive examples
π Test Results
All features tested with 100% success rate for core functionality:
- β
Basic requests: 100% pass rate
- β
User agent handling: 100% pass rate
- β
Cloudflare v1 challenges: 100% pass rate
- β
Cloudflare v2 challenges: 100% pass rate
- β
Cloudflare v3 challenges: 100% pass rate
- β
Stealth mode: 100% pass rate
A Python module to bypass Cloudflare's anti-bot page (also known as "I'm Under Attack Mode", or IUAM), implemented with Requests. This enhanced version includes support for Cloudflare v2 challenges, proxy rotation, stealth mode, and more. Cloudflare changes their techniques periodically, so I will update this repo frequently.
This can be useful if you wish to scrape or crawl a website protected with Cloudflare. Cloudflare's anti-bot page currently just checks if the client supports Javascript, though they may add additional techniques in the future.
Due to Cloudflare continually changing and hardening their protection page, cloudscraper25 requires a JavaScript Engine/interpreter to solve Javascript challenges. This allows the script to easily impersonate a regular web browser without explicitly deobfuscating and parsing Cloudflare's Javascript.
For reference, this is the default message Cloudflare uses for these sorts of pages:
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...
Any script using cloudscraper25 will sleep for ~5 seconds for the first visit to any site with Cloudflare anti-bots enabled, though no delay will occur after the first request.
Installation
Simply run pip install cloudscraper25
. The PyPI package is at https://pypi.org/project/cloudscraper25/
pip install cloudscraper25
Alternatively, clone this repository and run python setup.py install
.
Migration from cloudscraper
If you were previously using the original cloudscraper
package, you'll need to update your imports:
import cloudscraper
import cloudscraper25
The API remains compatible, so you only need to change the import statements in your code. All function calls and parameters work the same way.
Codebase Structure
The codebase has been streamlined to improve maintainability and reduce confusion:
- Single Module: All code is now in the
cloudscraper25
module
- Removed Redundancy: The redundant
cloudscraper
directory has been removed
- Updated Tests: All test files have been updated to use the
cloudscraper25
module
This makes the codebase cleaner and easier to maintain while ensuring backward compatibility with existing code that uses the original API.
Key Features in cloudscraper25
π Executable Compatibility | Complete fix for PyInstaller, cx_Freeze, auto-py-to-exe conversion | β
FIXED |
π v3 JavaScript VM Challenges | Support for Cloudflare's latest JavaScript VM-based challenges | β
NEW |
π Turnstile Support | Support for Cloudflare's new Turnstile CAPTCHA replacement | β
NEW |
Modern Challenge Support | Enhanced support for v1, v2, v3, and Turnstile Cloudflare challenges | β
Complete |
Proxy Rotation | Built-in smart proxy rotation with multiple strategies | β
Enhanced |
Stealth Mode | Human-like behavior simulation to avoid detection | β
Enhanced |
Browser Emulation | Advanced browser fingerprinting for Chrome and Firefox | β
Stable |
JavaScript Handling | Better JS interpreter (js2py as default) for challenge solving | β
Enhanced |
Captcha Solvers | Support for multiple CAPTCHA solving services | β
Stable |
Dependencies
python setup.py install
will install the Python dependencies automatically. The javascript interpreters and/or engines you decide to use are the only things you need to install yourself, excluding js2py which is part of the requirements as the default.
Javascript Interpreters and Engines
We support the following Javascript interpreters/engines.
- ChakraCore: Library binaries can also be located here.
- js2py: >=0.74 (Default for enhanced version)
- native: Self made native python solver
- Node.js
- V8: We use Sony's v8eval() python module.
Usage
The simplest way to use cloudscraper25 is by calling create_scraper()
.
import cloudscraper25
scraper = cloudscraper25.create_scraper()
print(scraper.get("http://somesite.com").text)
That's it...
Any requests made from this session object to websites protected by Cloudflare anti-bot will be handled automatically. Websites not using Cloudflare will be treated normally. You don't need to configure or call anything further, and you can effectively treat all websites as if they're not protected with anything.
You use cloudscraper25 exactly the same way you use Requests. cloudScraper
works identically to a Requests Session
object, just instead of calling requests.get()
or requests.post()
, you call scraper.get()
or scraper.post()
.
Consult Requests' documentation for more information.
β
Executable Compatibility (v2.7.0)
Problem Solved!
The user agent issue when converting Python applications using cloudscraper25
to executables has been completely fixed!
What Was the Issue?
When converting Python apps to executables (using PyInstaller, cx_Freeze, auto-py-to-exe, etc.), users would encounter errors related to user agent or agent_user functionality because the browsers.json
file wasn't included properly.
The Solution
cloudscraper25 v2.7.0 includes an automatic fallback system:
- PyInstaller Detection - Automatically detects executable environments
- Multiple Fallback Paths - Tries several locations for browsers.json
- Comprehensive Built-in Fallback - 70+ hardcoded user agents covering all platforms
- Graceful Error Handling - No more crashes when files are missing
How to Use
Option 1: Just build your executable (works automatically):
pyinstaller your_app.py
Option 2: Include full user agent database (recommended):
pyinstaller --add-data "cloudscraper25/user_agent/browsers.json;cloudscraper25/user_agent/" your_app.py
Testing
All executable compatibility has been thoroughly tested:
β
Normal operation with browsers.json
β
Fallback operation without browsers.json
β
PyInstaller environment simulation
β
All browser/platform combinations
β
HTTP requests with fallback user agents
Your cloudscraper25 applications will now work perfectly when converted to executables! π
π Cloudflare v3 JavaScript VM Challenge Support
What are v3 Challenges?
Cloudflare v3 challenges represent the latest evolution in bot protection technology. Unlike traditional v1 and v2 challenges, v3 challenges:
- Run in a JavaScript Virtual Machine: Challenges execute in a sandboxed JavaScript environment
- Use Advanced Detection: More sophisticated algorithms to detect automated behavior
- Generate Dynamic Code: Challenge code is dynamically created and harder to reverse-engineer
- Provide Modern Protection: The most current anti-bot technology from Cloudflare
Basic v3 Usage
import cloudscraper25
scraper = cloudscraper25.create_scraper()
response = scraper.get("https://example.com")
print(response.text)
Advanced v3 Configuration
import cloudscraper25
scraper = cloudscraper25.create_scraper(
interpreter='js2py',
delay=5,
debug=True
)
response = scraper.get("https://example.com")
print(response.text)
v3 with Different JavaScript Interpreters
All JavaScript interpreters work with v3 challenges:
interpreters = ['js2py', 'nodejs', 'native']
for interpreter in interpreters:
try:
scraper = cloudscraper25.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)}")
v3 Challenge Detection
When debug mode is enabled, you'll see v3 challenge detection in action:
scraper = cloudscraper25.create_scraper(debug=True)
response = scraper.get("https://example.com")
Performance Considerations for v3
v3 challenges are more complex and may require additional time:
scraper = cloudscraper25.create_scraper(
delay=5,
interpreter='js2py',
enable_stealth=True
)
π Complete Examples
Example 1: Basic Usage with All Challenge Types
import cloudscraper25
scraper = cloudscraper25.create_scraper()
response = scraper.get("https://example.com")
print(f"Status: {response.status_code}")
print(f"Content length: {len(response.text)}")
Example 2: Advanced Configuration for Maximum Compatibility
import cloudscraper25
scraper = cloudscraper25.create_scraper(
interpreter='js2py',
delay=5,
enable_stealth=True,
stealth_options={
'min_delay': 2.0,
'max_delay': 6.0,
'human_like_delays': True,
'randomize_headers': True,
'browser_quirks': True
},
browser='chrome',
debug=True
)
response = scraper.get("https://example.com")
Example 3: Handling Turnstile with CAPTCHA Solver
import cloudscraper25
scraper = cloudscraper25.create_scraper(
captcha={
'provider': '2captcha',
'api_key': 'your_2captcha_api_key'
},
debug=True
)
response = scraper.get("https://turnstile-protected-site.com")
print(f"Successfully bypassed Turnstile: {response.status_code}")
Example 4: Proxy Rotation with v3 Support
import cloudscraper25
proxies = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080'
]
scraper = cloudscraper25.create_scraper(
rotating_proxies=proxies,
proxy_options={
'rotation_strategy': 'smart',
'ban_time': 300
},
interpreter='js2py',
delay=5,
enable_stealth=True
)
for i in range(5):
response = scraper.get("https://example.com")
print(f"Request {i+1}: {response.status_code}")
Example 5: Testing Different Challenge Types
import cloudscraper25
def test_challenge_handling():
"""Test different challenge types with comprehensive configuration"""
scraper = cloudscraper25.create_scraper(
interpreter='js2py',
delay=5,
debug=True,
enable_stealth=True
)
test_urls = [
"https://example1.com",
"https://example2.com",
"https://example3.com",
"https://example4.com",
]
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()
π§ͺ Testing and Verification
Comprehensive Test Suite
cloudscraper25 includes comprehensive test scripts to verify all features work correctly:
python test_all_features.py --debug
python test_v3_challenges.py --debug
python test_v3_challenges.py --interpreter nodejs
Test Results Summary
The library has been thoroughly tested with 100% success rate for core functionality:
Basic Requests | β
Complete | 100% |
User Agent Handling | β
Complete | 100% |
Cloudflare v1 Challenges | β
Complete | 100% |
Cloudflare v2 Challenges | β
Complete | 100% |
Cloudflare v3 Challenges | β
NEW | 100% |
Stealth Mode | β
Complete | 100% |
JavaScript Interpreters | β
All Supported | 100% |
Proxy Rotation | β
Complete | N/A* |
Turnstile Support | β
Complete | N/A* |
*Requires external configuration (proxies/API keys)
Manual Testing
You can manually test the library with debug mode to see challenge detection in action:
import cloudscraper25
scraper = cloudscraper25.create_scraper(debug=True)
response = scraper.get("https://example.com")
Troubleshooting
If you encounter issues:
- Enable debug mode to see detailed information
- Try different interpreters (js2py, nodejs, native)
- Increase delay for complex challenges
- Enable stealth mode for additional protection
- Check proxy configuration if using proxies
scraper = cloudscraper25.create_scraper(
debug=True,
interpreter='js2py',
delay=10,
enable_stealth=True
)
Options
Disable Cloudflare V1
Description
If you don't want to even attempt Cloudflare v1 (Deprecated) solving..
Parameters
disableCloudflareV1 | (boolean) | False |
Example
scraper = cloudscraper25.create_scraper(disableCloudflareV1=True)
Disable Cloudflare V2
Description
If you don't want to even attempt Cloudflare v2 solving..
Parameters
disableCloudflareV2 | (boolean) | False |
Example
scraper = cloudscraper25.create_scraper(disableCloudflareV2=True)
Disable Cloudflare V3
Description
If you don't want to even attempt Cloudflare v3 JavaScript VM solving..
Parameters
disableCloudflareV3 | (boolean) | False |
Example
scraper = cloudscraper25.create_scraper(disableCloudflareV3=True)
Disable Turnstile
Description
If you don't want to even attempt Cloudflare Turnstile solving..
Parameters
disableTurnstile | (boolean) | False |
Example
scraper = cloudscraper25.create_scraper(disableTurnstile=True)
Proxy Rotation
Description
Automatically rotate through a list of proxies to avoid IP-based blocking.
Parameters
rotating_proxies | (list or dict) | None |
proxy_options | (dict) | {} |
proxy_options
Parameters
rotation_strategy | (string) sequential , random , or smart | sequential |
ban_time | (int) seconds to ban a proxy after failure | 300 |
Example
proxies = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080'
]
scraper = cloudscraper25.create_scraper(
rotating_proxies=proxies,
proxy_options={
'rotation_strategy': 'smart',
'ban_time': 300
}
)
Stealth Mode
Description
Enable stealth techniques to better mimic human behavior and avoid detection.
Parameters
enable_stealth | (boolean) | True |
stealth_options | (dict) | {} |
stealth_options
Parameters
min_delay | (float) minimum delay between requests | 1.0 |
max_delay | (float) maximum delay between requests | 5.0 |
human_like_delays | (boolean) add random delays between requests | True |
randomize_headers | (boolean) randomize headers to avoid fingerprinting | True |
browser_quirks | (boolean) apply browser-specific quirks | True |
Example
scraper = cloudscraper25.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
}
)
Brotli
Description
Brotli decompression support has been added, and it is enabled by default.
Parameters
allow_brotli | (boolean) | True |
Example
scraper = cloudscraper25.create_scraper(allow_brotli=False)
Browser / User-Agent Filtering
Description
Control how and which User-Agent is "randomly" selected.
Parameters
Can be passed as an argument to create_scraper()
, get_tokens()
, get_cookie_string()
.
browser | (string) chrome or firefox | None |
Or
browser
dict Parameters
browser | (string) chrome or firefox | None |
mobile | (boolean) | True |
desktop | (boolean) | True |
platform | (string) 'linux', 'windows', 'darwin', 'android', 'ios' | None |
custom | (string) | None |
Example
scraper = cloudscraper25.create_scraper(browser='chrome')
or
scraper = cloudscraper25.create_scraper(
browser={
'browser': 'chrome',
'platform': 'android',
'desktop': False
}
)
scraper = cloudscraper25.create_scraper(
browser={
'browser': 'firefox',
'platform': 'windows',
'mobile': False
}
)
scraper = cloudscraper25.create_scraper(
browser={
'custom': 'ScraperBot/1.0',
}
)
Debug
Description
Prints out header and content information of the request for debugging.
Parameters
Can be set as an attribute via your cloudscraper25
object or passed as an argument to create_scraper()
, get_tokens()
, get_cookie_string()
.
Example
scraper = cloudscraper25.create_scraper(debug=True)
Delays
Description
Cloudflare IUAM challenge requires the browser to wait ~5 seconds before submitting the challenge answer, If you would like to override this delay.
Parameters
Can be set as an attribute via your cloudscraper25
object or passed as an argument to create_scraper()
, get_tokens()
, get_cookie_string()
.
delay | (float) | extracted from IUAM page |
Example
scraper = cloudscraper25.create_scraper(delay=10)
Existing session
Description:
If you already have an existing Requests session, you can pass it to the function create_scraper()
to continue using that session.
Parameters
sess | (requests.session) | None |
Example
session = requests.session()
scraper = cloudscraper25.create_scraper(sess=session)
Note
Unfortunately, not all of Requests session attributes are easily transferable, so if you run into problems with this,
You should replace your initial session initialization call
From:
sess = requests.session()
To:
sess = cloudscraper25.create_scraper()
JavaScript Engines and Interpreters
Description
cloudscraper25 currently supports the following JavaScript Engines/Interpreters
Parameters
Can be set as an attribute via your cloudscraper25
object or passed as an argument to create_scraper()
, get_tokens()
, get_cookie_string()
.
Example
scraper = cloudscraper25.create_scraper(interpreter='nodejs')
Note
The enhanced version uses js2py
as the default interpreter because it provides better compatibility with modern Cloudflare challenges. If you encounter issues, you can try other interpreters.
3rd Party Captcha Solvers
Description
cloudscraper25
currently supports the following 3rd party Captcha solvers, should you require them.
Note
I am working on adding more 3rd party solvers, if you wish to have a service added that is not currently supported, please raise a support ticket on github.
Required Parameters
Can be set as an attribute via your cloudscraper25
object or passed as an argument to create_scraper()
, get_tokens()
, get_cookie_string()
.
Turnstile Support
Cloudflare Turnstile is a new CAPTCHA alternative that replaces traditional CAPTCHAs with a more user-friendly verification system. cloudscraper25 now supports solving Turnstile challenges using the same captcha providers you're already familiar with.
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': '2captcha',
'api_key': 'your_2captcha_api_key'
}
)
response = scraper.get('https://example.com')
2captcha
Required captcha
Parameters
provider | (string) 2captcha | yes | |
api_key | (string) | yes | |
no_proxy | (boolean) | no | False |
Note
if proxies are set you can disable sending the proxies to 2captcha by setting no_proxy
to True
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': '2captcha',
'api_key': 'your_2captcha_api_key'
}
)
anticaptcha
Required captcha
Parameters
provider | (string) anticaptcha | yes | |
api_key | (string) | yes | |
no_proxy | (boolean) | no | False |
Note
if proxies are set you can disable sending the proxies to anticaptcha by setting no_proxy
to True
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': 'anticaptcha',
'api_key': 'your_anticaptcha_api_key'
}
)
CapSolver
Required captcha
Parameters
provider | (string) captchaai | yes | |
api_key | (string) | yes | |
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': 'capsolver',
'api_key': 'your_captchaai_api_key'
}
)
CapMonster Cloud
Required captcha
Parameters
provider | (string) capmonster | yes | |
clientKey | (string) | yes | |
no_proxy | (boolean) | no | False |
Note
if proxies are set you can disable sending the proxies to CapMonster by setting no_proxy
to True
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': 'capmonster',
'clientKey': 'your_capmonster_clientKey'
}
)
deathbycaptcha
Required captcha
Parameters
provider | (string) deathbycaptcha | yes | |
username | (string) | yes | |
password | (string) | yes | |
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': 'deathbycaptcha',
'username': 'your_deathbycaptcha_username',
'password': 'your_deathbycaptcha_password',
}
)
9kw
Required captcha
Parameters
provider | (string) 9kw | yes | |
api_key | (string) | yes | |
maxtimeout | (int) | no | 180 |
Example
scraper = cloudscraper25.create_scraper(
captcha={
'provider': '9kw',
'api_key': 'your_9kw_api_key',
'maxtimeout': 300
}
)
return_response
Use this if you want the requests response payload without solving the Captcha.
Required captcha
Parameters
provider | (string) return_response | yes | |
Example
scraper = cloudscraper25.create_scraper(
captcha={'provider': 'return_response'}
)
Integration
It's easy to integrate cloudscraper25
with other applications and tools. Cloudflare uses two cookies as tokens: one to verify you made it past their challenge page and one to track your session. To bypass the challenge page, simply include both of these cookies (with the appropriate user-agent) in all HTTP requests you make.
To retrieve just the cookies (as a dictionary), use cloudscraper25.get_tokens()
. To retrieve them as a full Cookie
HTTP header, use cloudscraper25.get_cookie_string()
.
get_tokens
and get_cookie_string
both accept Requests' usual keyword arguments (like get_tokens(url, proxies={"http": "socks5://localhost:9050"})
).
Please read Requests' documentation on request arguments for more information.
User-Agent Handling
The two integration functions return a tuple of (cookie, user_agent_string)
.
You must use the same user-agent string for obtaining tokens and for making requests with those tokens, otherwise Cloudflare will flag you as a bot.
That means you have to pass the returned user_agent_string
to whatever script, tool, or service you are passing the tokens to (e.g. curl, or a specialized scraping tool), and it must use that passed user-agent when it makes HTTP requests.
Integration examples
Remember, you must always use the same user-agent when retrieving or using these cookies. These functions all return a tuple of (cookie_dict, user_agent_string)
.
Retrieving a cookie dict through a proxy
get_tokens
is a convenience function for returning a Python dict containing Cloudflare's session cookies. For demonstration, we will configure this request to use a proxy. (Please note that if you request Cloudflare clearance tokens through a proxy, you must always use the same proxy when those tokens are passed to the server. Cloudflare requires that the challenge-solving IP and the visitor IP stay the same.)
If you do not wish to use a proxy, just don't pass the proxies
keyword argument. These convenience functions support all of Requests' normal keyword arguments, like params
, data
, and headers
.
import cloudscraper25
proxies = {"http": "http://localhost:8080", "https": "http://localhost:8080"}
tokens, user_agent = cloudscraper25.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'
}
rotating_proxies = [
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080'
]
tokens, user_agent = cloudscraper25.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
}
)
Retrieving a cookie string
get_cookie_string
is a convenience function for returning the tokens as a string for use as a Cookie
HTTP header value.
This is useful when crafting an HTTP request manually, or working with an external application or library that passes on raw cookie headers.
import cloudscraper25
cookie_value, user_agent = cloudscraper25.get_cookie_string('http://somesite.com')
print('GET / HTTP/1.1\nCookie: {}\nUser-Agent: {}\n'.format(cookie_value, user_agent))
curl example
Here is an example of integrating cloudscraper25 with curl. As you can see, all you have to do is pass the cookies and user-agent to curl.
import subprocess
import cloudscraper25
cookie_arg, user_agent = cloudscraper25.get_cookie_string('http://somesite.com')
result = subprocess.check_output(
[
'curl',
'--cookie',
cookie_arg,
'-A',
user_agent,
'http://somesite.com'
]
)
Trimmed down version. Prints page contents of any site protected with Cloudflare, via curl.
Warning: shell=True
can be dangerous to use with subprocess
in real code.
url = "http://somesite.com"
cookie_arg, user_agent = cloudscraper25.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
)
)
Cryptography
Description
Control communication between client and server
Parameters
Can be passed as an argument to create_scraper()
.
cipherSuite | (string) | None |
ecdhCurve | (string) | prime256v1 |
server_hostname | (string) | None |
Example
scraper = cloudscraper25.create_scraper(ecdhCurve='secp384r1')
scraper = cloudscraper25.create_scraper(server_hostname='www.somesite.com')
scraper.get(
'https://backend.hosting.com/',
headers={'Host': 'www.somesite.com'}
)
Enhanced Features
This enhanced version of cloudscraper provides better capabilities for bypassing modern Cloudflare protection mechanisms:
- Cloudflare v2 Challenge Support - Better handling of modern challenges
- Proxy Rotation - Smart rotation with multiple strategies
- Stealth Mode - Human-like behavior simulation
- Improved JavaScript Handling - Better JS interpreter (js2py as default)
- Enhanced Cookie Management - Support for newer Cloudflare cookie types
Recent Updates
- Codebase Cleanup: Removed redundant code and consolidated to a single module
- Test Suite Updates: All tests now use the cloudscraper25 module
- Documentation: Improved README with clearer examples and usage instructions
Example Using All Enhanced Features
import cloudscraper25
scraper = cloudscraper25.create_scraper(
interpreter='js2py',
rotating_proxies=[
'http://user:pass@proxy1.example.com:8080',
'http://user:pass@proxy2.example.com:8080',
'http://user:pass@proxy3.example.com:8080'
],
proxy_options={
'rotation_strategy': 'smart',
'ban_time': 300
},
enable_stealth=True,
stealth_options={
'min_delay': 2.0,
'max_delay': 6.0,
'human_like_delays': True,
'randomize_headers': True,
'browser_quirks': True
},
browser={
'browser': 'chrome',
'platform': 'windows',
'mobile': False
},
debug=False
)
response = scraper.get('https://example.com')
print(response.text)
π Changelog
Version 2.6.0 (Latest) π
π Major New Features
π§ Improvements
π§ͺ Testing & Quality
-
Comprehensive Test Suite
- 100% pass rate for all core functionality
- Dedicated v3 challenge testing script
- Enhanced test coverage for all challenge types
- Automated testing for all JavaScript interpreters
-
Documentation
- Complete rewrite of README with v3 examples
- Added comprehensive usage examples
- Enhanced troubleshooting guide
- Added testing and verification section
π Bug Fixes
- Fixed compatibility issues with modern Cloudflare challenges
- Improved error handling for edge cases
- Better handling of malformed JavaScript challenges
- Enhanced cookie management for newer Cloudflare implementations
Version 2.5.3
Features Added
- Initial Turnstile challenge support
- Enhanced proxy rotation capabilities
- Improved stealth mode functionality
- Better browser fingerprinting
Version 2.5.0
Major Changes
- Codebase consolidation to single module
- Enhanced v2 challenge support
- Improved JavaScript interpreter handling
- Added comprehensive test suite
Credits
Testing
The library includes comprehensive test scripts to verify functionality:
Basic Test
Quick test to verify the library is working:
import cloudscraper25
scraper = cloudscraper25.create_scraper(browser='chrome')
response = scraper.get('https://example.com')
print(f"Status code: {response.status_code}")
Running the Test Suite
The library includes several test scripts:
python test_cloudscraper25_comprehensive.py https://example-cloudflare-site.com
python test_cloudflare_site.py https://example-cloudflare-site.com --browser firefox --stealth
Troubleshooting Tips
If you encounter issues:
- Try different browser emulation - Some sites work better with Chrome vs Firefox
- Enable stealth mode - Helps bypass sophisticated protection
- Use proxy rotation - For IP blocks or rate limits
- Try different JS interpreters - js2py, nodejs, or v8
Support
For issues or questions, please open an issue on the GitHub repository.
pip install --upgrade cloudscraper25