Category: Scraping use cases

How to Scrape Klium Product Pages Without Getting Blocked

5 mins read Created Date: May 12, 2025   Updated Date: May 12, 2025

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 requests
  • BeautifulSoup – 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 class current-price-value, and the actual value is inside its content 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 class availability-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?

Get started with Scrape.do, 1000 credits are on the house.


Raif Tekin

Raif Tekin

R&D Engineer


Hey, folks! As someone who has managed to develop himself in the field of back-end software for years, I offer data interpretation and collection services for eCommerce practices to brands. I am sure that my experience in this field will provide you with useful information.