Official Python client for the ScrapeUnblocker web scraping API - JS-rendered pages that bypass Cloudflare, DataDome, PerimeterX and Akamai, plus Google SERP and Skyscanner flights/hotels/car-hire scraping as JSON.
Project description
ScrapeUnblocker Python client
Official Python client for the ScrapeUnblocker web scraping API.
Every request is fully JavaScript-rendered in a real browser and routed through premium proxies, so it bypasses Cloudflare, DataDome, PerimeterX, Akamai, Kasada and similar anti-bot systems - from one simple call. You are only billed for successful requests.
- Highest success rate on the market (95%+ on live production traffic)
- Rendered HTML or parsed JSON - no per-site parsers to maintain
- Sync and async clients, fully type-hinted
Install
pip install scrapeunblocker
Requires Python 3.8+.
Quickstart
from scrapeunblocker import Client
su = Client(api_key="YOUR_API_KEY") # or set the SCRAPEUNBLOCKER_KEY env var
# Rendered HTML for any URL
html = su.get_page_source("https://example.com")
# Structured JSON instead of HTML (products, listings, search results, ...)
product = su.get_parsed("https://www.amazon.com/dp/B08N5WRWNW")
print(product.page_type) # "product"
print(product.data) # {...}
Get your API key at app.scrapeunblocker.com. The free trial does not require a credit card.
Authentication
Pass the key directly, or set an environment variable and omit it:
export SCRAPEUNBLOCKER_KEY="YOUR_API_KEY"
from scrapeunblocker import Client
su = Client() # reads SCRAPEUNBLOCKER_KEY
Fetch rendered HTML
html = su.get_page_source(
"https://www.nordstrom.com/browse/women/clothing/dresses",
proxy_country="US", # route through a specific country
time_sleep=3, # wait extra seconds after load
)
Get parsed JSON
Pass a URL and get back structured data extracted via Schema.org, __NEXT_DATA__ or AI-generated rules:
result = su.get_parsed("https://www.walmart.com/ip/12345")
print(result.page_type) # e.g. "product"
print(result.source) # how it was extracted
print(result.data) # the fields
# If a parse ever comes back wrong, force a fresh set of rules:
result = su.get_parsed(url, refresh_rules=True, rules_hint="price is missing")
Google search (SERP)
serp = su.serp("web scraping api", pages_to_check=2, proxy_country="US")
Google Local (Maps)
# Local business listings for a search and market
local = su.google_local("coffee shops in chicago", proxy_country="US", gl="us")
for biz in local["results"]:
print(biz["name"], biz["rating"], biz["reviews"], biz["address"])
Cookies and the serving proxy
page = su.get_page_with_cookies("https://example.com")
print(page.html, page.cookies, page.proxy)
Images
data = su.get_image("https://example.com/photo.jpg")
open("photo.jpg", "wb").write(data)
Skyscanner plugins
# Resolve a place name to entity IDs, then search
locs = su.skyscanner.flight_locations("London")
flights = su.skyscanner.flights(
origin="London", dest="New York",
depart_date="2026-09-01", adults=1, currency="USD",
)
hotels = su.skyscanner.hotels(destination="Madrid", checkin="2026-09-01", checkout="2026-09-03")
cars = su.skyscanner.carhire(pickup="Madrid", pickup_datetime="2026-09-01T10:00", dropoff_datetime="2026-09-03T10:00")
Async
Every method has an async twin on AsyncClient:
import asyncio
from scrapeunblocker import AsyncClient
async def main():
async with AsyncClient(api_key="YOUR_API_KEY") as su:
html = await su.get_page_source("https://example.com")
asyncio.run(main())
Error handling
Non-2xx responses raise typed exceptions, all subclasses of ScrapeUnblockerError:
from scrapeunblocker import Client, BlockedError, RateLimitError, UpstreamOutageError
su = Client()
try:
html = su.get_page_source("https://example.com")
except BlockedError:
... # 403: the target blocked every bypass path (not billed)
except RateLimitError:
... # 429: slow down
except UpstreamOutageError:
... # 503: the target site itself is down - retry later
| Exception | Status | Meaning |
|---|---|---|
InvalidRequestError |
400 | Bad URL or unsupported scheme |
AuthenticationError |
401 | Missing or invalid API key |
BlockedError |
403 | Blocked by bot protection on every path |
RateLimitError |
429 | Too many requests |
UpstreamOutageError |
503 | The target origin is down |
ServerError |
5xx | Unexpected server error |
ScrapeTimeoutError |
- | Request exceeded the timeout |
ConnectionError |
- | Could not reach the API |
Transient failures (429, 502, 503, 504 and network errors) are retried automatically with exponential backoff; tune with Client(max_retries=...).
Configuration
Client(
api_key=None, # or SCRAPEUNBLOCKER_KEY env var
base_url="https://api.scrapeunblocker.com",
timeout=180.0, # seconds; protected pages can be slow
max_retries=2,
)
Links
- Documentation: https://developers.scrapeunblocker.com
- Website: https://scrapeunblocker.com
- Dashboard: https://app.scrapeunblocker.com
License
MIT
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file scrapeunblocker-0.1.4.tar.gz.
File metadata
- Download URL: scrapeunblocker-0.1.4.tar.gz
- Upload date:
- Size: 11.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08ca77610e8cc078134fd5af3b158f7e65b261c397797472776a0347d51ac60e
|
|
| MD5 |
ac9c6a5ba73a29444e6f4b2bf9f2533c
|
|
| BLAKE2b-256 |
9b7aa8a103c14d6c048f3e0a49394e9b41a460c66dab9031b525874a503f1bc2
|
Provenance
The following attestation bundles were made for scrapeunblocker-0.1.4.tar.gz:
Publisher:
publish.yml on ScrapeUnblocker/scrapeunblocker-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scrapeunblocker-0.1.4.tar.gz -
Subject digest:
08ca77610e8cc078134fd5af3b158f7e65b261c397797472776a0347d51ac60e - Sigstore transparency entry: 2211613989
- Sigstore integration time:
-
Permalink:
ScrapeUnblocker/scrapeunblocker-python@632ebbea2c21fb9b725b55b71969e115eae44b7b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/ScrapeUnblocker
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@632ebbea2c21fb9b725b55b71969e115eae44b7b -
Trigger Event:
release
-
Statement type:
File details
Details for the file scrapeunblocker-0.1.4-py3-none-any.whl.
File metadata
- Download URL: scrapeunblocker-0.1.4-py3-none-any.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
704567388bd3397f2e30a717cab7c5641266ea0eb34ab5b7dee787a14cf8705c
|
|
| MD5 |
1d70a1b71c677e3394f3b3d5a8dfe3b4
|
|
| BLAKE2b-256 |
f8b61013b196d0aa4bde16db761f9cec054c44ef784daa7e3dd51dc2793f2f0c
|
Provenance
The following attestation bundles were made for scrapeunblocker-0.1.4-py3-none-any.whl:
Publisher:
publish.yml on ScrapeUnblocker/scrapeunblocker-python
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
scrapeunblocker-0.1.4-py3-none-any.whl -
Subject digest:
704567388bd3397f2e30a717cab7c5641266ea0eb34ab5b7dee787a14cf8705c - Sigstore transparency entry: 2211614025
- Sigstore integration time:
-
Permalink:
ScrapeUnblocker/scrapeunblocker-python@632ebbea2c21fb9b725b55b71969e115eae44b7b -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/ScrapeUnblocker
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@632ebbea2c21fb9b725b55b71969e115eae44b7b -
Trigger Event:
release
-
Statement type: