Opis
METRON 5D ACR EVO – zintegrowana kierownica stworzona dla prędkości i kontroli
METRON 5D ACR EVO to zaawansowana, zintegrowana kierownica szosowa klasy World Tour, opracowana we współpracy z czołowymi zawodnikami profesjonalnego peletonu, w tym kolarzami Team Jumbo-Visma. Celem projektu było stworzenie komponentu, który łączy maksymalną sztywność, doskonałą aerodynamikę i wysoki komfort, bez poświęcania czucia roweru.
Model 5D ACR EVO bazuje na cechach, które uczyniły serię 5D wyjątkową, jednocześnie wprowadzając istotne ulepszenia konstrukcyjne. Nowa generacja jest lżejsza (320 g), a jednocześnie sztywniejsza i lepiej tłumiąca drgania, co przekłada się na większą kontrolę nad rowerem i mniejsze zmęczenie podczas długich oraz intensywnych jazd. To rozwiązanie zaprojektowane nie tylko dla wyścigów, ale również dla ambitnych amatorów, którzy chcą korzystać z technologii znanych z zawodowego peletonu.
Aerodynamika i konstrukcja zoptymalizowana w tunelu aerodynamicznym
Kierownica METRON 5D ACR EVO została dopracowana z wykorzystaniem analiz CFD oraz testów w tunelu aerodynamicznym. Wszystkie profile zostały zoptymalizowane pod kątem minimalizacji oporu powietrza, a wysokość stosu (stack) została obniżona o 15 mm względem poprzedniej generacji. Dzięki temu przepływ powietrza w obszarze kokpitu jest bardziej efektywny, co realnie przekłada się na oszczędność watów przy wysokich prędkościach.
Zintegrowane wewnętrzne prowadzenie przewodów ACR (Aerodynamic Cable Routing) całkowicie ukrywa linki i przewody, poprawiając aerodynamikę oraz estetykę roweru. Konstrukcja jest w pełni kompatybilna z napędami elektronicznymi, w tym Shimano Di2, z dedykowanym miejscem na złączkę oraz kanałami prowadzenia okablowania.
Ergonomia dopracowana pod realnych użytkowników
Jednym z kluczowych elementów 5D ACR EVO jest ergonomia, która została udoskonalona nie tylko z myślą o zawodowcach. Zachowano charakterystyczny 10-stopniowy kąt pochylenia do przodu, który ułatwia oddychanie podczas stromych podjazdów i poprawia pozycję ciała w intensywnym wysiłku.
Wprowadzono również dodatkowy rozmiar oraz zmodyfikowaną głębokość chwytu w większych wariantach (L–XL), dzięki czemu szersze grono kolarzy może uzyskać idealne dopasowanie. Kompaktowy reach 80 mm i drop 125 mm zapewniają szybkie przejścia między chwytami, a 5-milimetrowe przesunięcie dolnych chwytów zwiększa stabilność podczas sprintów.
To kierownica, która pozwala jechać agresywnie, ale komfortowo, zarówno w wyścigu, jak i na długim treningu.
Materiały, wykończenie i wrażenia z jazdy
METRON 5D ACR EVO wykonana jest w całości z wysokiej jakości włókna węglowego, co zapewnia doskonały stosunek masy do sztywności. Konstrukcja skutecznie tłumi mikrodrgania asfaltu, poprawiając komfort jazdy bez utraty precyzji prowadzenia.
Wykończenie Carbon 3K w kolorze czarnym nadaje kierownicy elegancki, techniczny wygląd, idealnie pasujący do nowoczesnych ram aero i endurance. To komponent klasy premium, który wizualnie i funkcjonalnie podnosi poziom całego roweru.
Specyfikacja techniczna – METRON 5D ACR EVO
typ: zintegrowana kierownica szosowa
seria: METRON
zastosowanie: rower szosowy
materiał: włókno węglowe (carbon)
technologia: ACR – pełne wewnętrzne prowadzenie przewodów
kompatybilność: napędy elektroniczne (m.in. Shimano Di2)
kąt mostka: –6°
kąt pochylenia chwytów: 10° do przodu
reach: 80 mm
drop: 125 mm (kompaktowy)
przesunięcie dolnych chwytów: 5 mm
aerodynamika: obniżony stack o 15 mm
waga: 320 g (rozmiar 110 × 420 mm)
wykończenie: Carbon 3K
kolor: czarny
kształt: kompaktowy
| Code | Type |
|---|---|
| 670-0455032030 | VISION HB METRON 5D ACR EVO 100×360 B4 |
| 670-0455027030 | VISION HB METRON 5D ACR EVO 100×380 L |
| 670-0455001030 | VISION HB METRON 5D ACR EVO 100×400 L |
| 670-0455002030 | VISION HB METRON 5D ACR EVO 100×420 L |
| 670-0455028030 | VISION HB METRON 5D ACR EVO 110×380 B4 |
| 670-0455015030 | VISION HB METRON 5D ACR EVO 110×400 L |
| 670-0455003030 | VISION HB METRON 5D ACR EVO 110×420 L |
| 670-0455029030 | VISION HB METRON 5D ACR EVO 120×380 B4 |
| 670-0455007030 | VISION HB METRON 5D ACR EVO 120×400 L |
| 670-0455030030 | VISION HB METRON 5D ACR EVO 130×380 B4 |
| 670-0455014030 | VISION HB METRON 5D ACR EVO 130×400 L B4 |
| 670-0455031030 | VISION HB METRON 5D ACR EVO 140×380 B4 |
| 670-0455020030 | VISION HB METRON 5D ACR EVO 140×400 B4 |
| 670-0455017030 | VISION HB METRON 5D ACR EVO 80×360 L |
| 670-0455026030 | VISION HB METRON 5D ACR EVO 80×380 L |
| 670-0455016030 | VISION HB METRON 5D ACR EVO 90×380 L |
| 670-0455010030 | VISION HB METRON 5D ACR EVO 90×400 L B4 |



![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/1_1.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/2.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/3.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/9_3.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/8_3.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/vision_metron_5d_evo_-_side-scaled.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/5d_evo_-_lowered_stack.png)
![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/5d_evo_-_thickness_comparison.png)















![import time import csv import re from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import NoSuchElementException, TimeoutException # ================================================== # KONFIGURACJA # ================================================== LOGIN_URL = "https://www.sloger.sk/en/prihlasenie-b2b" ALPINA_BASE_URL = "https://www.sloger.sk/en/shop/vyrobca/alpina/" USERNAME = "biuro@2wheels.pl" PASSWORD = "KKccgg00551166!!" OUTPUT_CSV = "alpina_variants_FINAL.csv" WAIT_TIME = 20 # ================================================== # POMOCNICZE # ================================================== def accept_cookies(driver): try: driver.find_element( By.XPATH, "//button[contains(text(),'Agree') or contains(text(),'I agree')]" ).click() time.sleep(1) except NoSuchElementException: pass def find_login_fields(driver): login = password = None for inp in driver.find_elements(By.TAG_NAME, "input"): t = inp.get_attribute("type") if t == "text" and inp.is_displayed(): login = inp if t == "password" and inp.is_displayed(): password = inp return login, password # ================================================== # SELENIUM # ================================================== options = webdriver.ChromeOptions() options.add_argument("--start-maximized") driver = webdriver.Chrome(options=options) wait = WebDriverWait(driver, WAIT_TIME) data = [] try: # ---------- LOGIN ---------- driver.get(LOGIN_URL) time.sleep(2) accept_cookies(driver) wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "input[type='password']"))) login, password = find_login_fields(driver) login.send_keys(USERNAME) password.send_keys(PASSWORD) password.send_keys(Keys.ENTER) time.sleep(4) print("✅ Zalogowano do Sloger B2B") # ---------- ALPINA ---------- page = 1 while True: url = ALPINA_BASE_URL if page == 1 else f"{ALPINA_BASE_URL}strana-{page}" driver.get(url) time.sleep(3) products = driver.find_elements(By.CSS_SELECTOR, "div[id^='lipr_']") if not products: break print(f"📄 ALPINA | strona {page} | produkty: {len(products)}") links = [] for p in products: try: links.append( p.find_element(By.CSS_SELECTOR, "p.product-name a") .get_attribute("href") ) except NoSuchElementException: continue for link in links: driver.get(link) try: wait.until(EC.presence_of_element_located((By.TAG_NAME, "label"))) except TimeoutException: continue time.sleep(1) for label in driver.find_elements(By.TAG_NAME, "label"): text = label.text.strip() # ---- PRAWDZIWE SKU + EAN ---- variant_match = re.search( r"\(\s*([A-Za-z0-9\-]+)\s*/\s*(\d{8,14})\s*\)", text ) if not variant_match: continue sku = variant_match.group(1) ean = variant_match.group(2) # ---- STOCK ---- stock_match = re.search( r"(In stock|Na sklade)\s+(\d+)", text ) stock = int(stock_match.group(2)) if stock_match else 0 # ---- ROZMIAR (opcjonalnie) ---- size_match = re.search( r"\b(XXS|XS|S|M|L|XL|XXL)\b", text ) size = size_match.group(1) if size_match else "" data.append({ "sku": sku, "ean": ean, "stock": stock, "size": size, "url": link }) print(f"✔ {sku} | size: {size} | stock: {stock} | ean: {ean}") page += 1 finally: driver.quit() # ================================================== # CSV (WOO VARIATIONS) # ================================================== with open(OUTPUT_CSV, "w", newline="", encoding="utf-8-sig") as f: writer = csv.writer(f) writer.writerow([ "Type", "SKU", "EAN", "Stock", "Manage stock?", "Attribute 1 name", "Attribute 1 value(s)", "Source URL" ]) for item in data: writer.writerow([ "variation", item["sku"], item["ean"], item["stock"], "yes", "Size", item["size"], item["url"] ]) print("====================================") print(f"✅ Zapisano wariantów: {len(data)}") print(f"📁 Plik: {OUTPUT_CSV}") print("====================================")](https://2wheels.pl/wp-content/uploads/2025/12/1_1-200x200.png.jpg)
Opinie
Nie ma jeszcze żadnych recenzji