How to Scrape Klium Product Pages Without Getting Blocked
Klium is a major online supplier of professional tools, construction gear, and industrial equipment across Europe.
From Bosch hammers to protective wear, it serves thousands of businesses and professionals in Belgium, France, the Netherlands, and beyond.
If you’re scraping ecommerce sites for price intelligence, supply tracking, or competitor monitoring; Klium MUST be on your radar.
But scraping it isn’t as simple as sending a GET request.
Why Is Klium Blocking You?
Klium looks like a simple ecommerce site at first, but as soon as you try to scrape it, you hit a wall.
Even a basic requests.get()
returns a 403 Forbidden. No product page, no HTML; just a rejection.
Sometimes it comes with a blunt message:
Other times, Klium routes you through Cloudflare’s bot protection, which tries to challenge or verify you before loading the actual page:
This protection layer is designed to detect non-human traffic. Cloudflare checks:
- Your IP reputation (e.g. datacenter vs. residential)
- Whether you’re using a real browser with full JavaScript support
- Your TLS fingerprint, headers, and other subtle signals
And unless you pass all of those checks, which a simple Python bot won’t do, your request is blocked.
If you’re scraping at scale or trying to run automated price monitoring, this is a deal-breaker.
You can’t get to the product page without solving Cloudflare first.
That’s why we’ll use Scrape.do, which handles this entire layer for you so you can get a clean HTML response, every time.
Extract Product and Supplies Data from Klium
For this guide, we’ll be scraping a real product page on Klium, a Bosch rotary hammer.
We’re going to extract three things from this page:
- The product name
- The price
- Whether or not it’s in stock
This is a very typical ecommerce scraping use case whether you’re tracking competitors, syncing stock across platforms, or building a price database.
And we’ll do all of it in Python.
Prerequisites
We’ll keep it simple. You’ll only need two libraries:
requests
– to send HTTP requestsBeautifulSoup
– to parse the HTML and extract elements
If you haven’t already, you can install them with:
pip install requests beautifulsoup4
We’ll also need a tool to help us bypass Cloudflare, but first, let’s try scraping Klium the “normal” way and see what happens.
First Request and Getting Access
Let’s start by sending a basic request to the product page using requests
:
import requests
url = "https://www.klium.com/en/bosch-gbh-2-28-f-rotary-hammer-with-sds-plus-880-w-in-case-0611267600-121096"
response = requests.get(url)
print(response)
This will return:
<Response [403]>
Klium instantly blocks us. 🚫
Because Cloudflare is instantly able to identify your scraper as a bot.
So how do we get past it?
Scrape.do: Easiest Way to Bypass Cloudflare
Scrape.do handles Cloudflare for you; no browser automation, no CAPTCHA solving, no rotating proxies.
It routes your request through residential IPs, rotates TLS fingerprints, manages sessions, and renders JavaScript when needed. All you do is send the URL.
Let’s try the same request again but this time, using Scrape.do.
First, you need to sign up to Scrape.do for free and get your API token.
Once you have your token, here’s the updated code to follow and get a real response from Klium:
import requests
import urllib.parse
# Your Scrape.do token
token = "<your_token>"
# Target product URL
target_url = "https://www.klium.com/en/bosch-gbh-2-28-f-rotary-hammer-with-sds-plus-880-w-in-case-0611267600-121096"
encoded_url = urllib.parse.quote_plus(target_url)
# Scrape.do API request with Cloudflare bypass
api_url = f"https://api.scrape.do?token={token}&url={encoded_url}"
# Send the request
response = requests.get(api_url)
# Print response status
print(response)
You should now see:
<Response [200]>
That means we’ve successfully bypassed Cloudflare!
Extract Product Name and Price
Now that we’re through Cloudflare and have the full page HTML, we can start pulling data.
Let’s start with the product name and price.
If you inspect the product page in your browser:
- The product name is inside an
<h1>
tag at the top of the page - The price is stored in a
<span>
tag with the classcurrent-price-value
, and the actual value is inside itscontent
attribute
Here’s how to extract both:
from bs4 import BeautifulSoup
import requests
import urllib.parse
# Scrape.do config
token = "<your_token>"
target_url = "https://www.klium.com/en/bosch-gbh-2-28-f-rotary-hammer-with-sds-plus-880-w-in-case-0611267600-121096"
encoded_url = urllib.parse.quote_plus(target_url)
# Scrape.do API request with Cloudflare bypass
api_url = f"https://api.scrape.do?token={token}&url={encoded_url}"
# Send request and parse HTML
response = requests.get(api_url)
soup = BeautifulSoup(response.text, "html.parser")
# Extract product name
name = soup.find("h1").text.strip()
# Extract product price
price = soup.find("span", class_="current-price-value")["content"]
# Output
print("Product Name:", name)
print("Price:", price)
You should get this output:
Product Name: BOSCH GBH 2-28 F rotary hammer with SDS-Plus 880 W in case - 0611267600
Price: 284.48
We need one more thing:
Extract Stock Availability
Now let’s see if the product is actually in stock.
There are two clues on the page:
- A
<div>
with classavailability-label
that usually says “In stock” or something else - A line of text like “We have 4 products in stock.” somewhere near the cart button
We’ll check both. If it says anything other than “In stock,” or if the element is missing, we’ll assume the item is out of stock.
If it’s available, we’ll try to pull the exact number of items.
Here’s how:
import requests
import urllib.parse
from bs4 import BeautifulSoup
import re
# Scrape.do token and target URL
token = "<your_token>"
product_url = "https://www.klium.com/en/bosch-gbh-2-28-f-rotary-hammer-with-sds-plus-880-w-in-case-0611267600-121096"
encoded_url = urllib.parse.quote_plus(product_url)
api_url = f"https://api.scrape.do?token={token}&url={encoded_url}"
# Send request and parse response
response = requests.get(api_url)
soup = BeautifulSoup(response.text, "html.parser")
text = soup.get_text(separator=" ").lower()
# Extract stock info
match = re.search(r"we have (\d+) products? in stock", text)
if match:
stock = f"{match.group(1)} in stock"
elif "in stock" in text:
stock = "In stock"
else:
stock = "Out of stock"
print("Stock Availability:", stock)
At the time of writing this article, the output is:
Stock Availability: 4 in stock
You might also get a response like:
Stock Availability: Out of stock
And with this, we’ve successfully extracted key information for a product on Klium! 🎉
Conclusion
Scraping Klium is tricky not because the HTML is hard to parse, but because Cloudflare is standing in your way.
And Klium is just one of the millions of websites that use Cloudflare.
That’s why you need Scrape.do:
- It bypasses Cloudflare (and any other WAF) and returns real content
- It works with any URL, no setup required
- It’s fast, clean, and battle-tested for ecommerce scraping
Want to start scraping e-commerce websites at scale?