Untitled

 avatar
unknown
python
6 months ago
5.0 kB
12
No Index
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
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 bs4 import BeautifulSoup
import openpyxl
import time
import os
import re


DELL_HOME = "https://www.dell.com/support/home/en-us?app=products"


def scrap_dell(serials):
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
    driver.maximize_window()
    results = []

    for serial in serials:
        print(f"\n➡ Przetwarzam Service Tag: {serial}")

        driver.get(DELL_HOME)
        time.sleep(1)

        # Pole wyszukiwania Service Tag
        try:
            search_box = WebDriverWait(driver, 10).until(
                EC.presence_of_element_located((By.ID, "mh-search-input"))
            )
            search_box.clear()
            search_box.send_keys(serial)
            search_box.send_keys(Keys.ENTER)
            print("✅ Service Tag wpisany")
        except:
            print("❌ Nie znaleziono pola wyszukiwania")
            continue

        # Czekamy aż strona załaduje nagłówek modelu
        try:
            WebDriverWait(driver, 15).until(
                EC.presence_of_element_located((By.CSS_SELECTOR, "h1"))
            )
            print("✅ Strona urządzenia załadowana")
        except:
            print("❌ Nie udało się załadować strony urządzenia")
            continue

        # Klikamy przycisk "Specyfikacje produktu"
        try:
            specs_btn = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.ID, "review-specs-drawer-trigger"))
            )
            specs_btn.click()
            print("✅ Kliknięto Specyfikacje produktu")
        except:
            print("❌ Nie znaleziono przycisku Specyfikacje produktu")

        # Czekamy aż sekcja z gwarancją się pojawi
        try:
            warr_div = WebDriverWait(driver, 300).until(
                EC.presence_of_element_located((By.ID, "tt_warstatus_text"))
            )
            print("✅ Sekcja gwarancji załadowana")
        except:
            print("❌ Nie udało się załadować sekcji gwarancji")

        # Dodatkowy wait dla akordeonów
        time.sleep(3)

        soup = BeautifulSoup(driver.page_source, "html.parser")

        data = {
            "Model": None,
            "Serial": serial,
            "CPU": None,
            "RAM": None,
            "Dysk": None,
            "Gwarancja": None
        }

        # MODEL
        header = soup.find("h1")
        if header:
            data["Model"] = header.get_text(strip=True)
            print("✔ Model:", data["Model"])

        # GWARANCJA
        warr = soup.find("div", id="tt_warstatus_text")
        if warr:
            warr_text = warr.get_text(strip=True).lower()
            if "ended" in warr_text or "wygas" in warr_text:
                data["Gwarancja"] = "NIE"
            else:
                data["Gwarancja"] = "TAK"
            print("✔ Gwarancja:", data["Gwarancja"])

        # SPECYFIKACJA — AKORDEONY
        accordion_items = soup.find_all("div", class_=re.compile("dds_accordion_item"))

        for item in accordion_items:
            btn = item.find("button", class_="dds_accordion_button")
            if not btn:
                continue

            text = btn.get_text(" ", strip=True)

            # CPU
            if ("intel" in text.lower() or "ryzen" in text.lower()) and not data["CPU"]:
                data["CPU"] = text
                print("✔ CPU:", data["CPU"])

            # RAM
            if ("gb" in text.lower() and "mhz" in text.lower()) and not data["RAM"]:
                data["RAM"] = text
                print("✔ RAM:", data["RAM"])

            # DYSK
            if any(x in text.lower() for x in ["ssd", "hdd", "nvme"]) and not data["Dysk"]:
                data["Dysk"] = text
                print("✔ Dysk:", data["Dysk"])

        results.append(data)

    driver.quit()
    return results



def save_excel(data, file="dell_laptops.xlsx"):
    if os.path.exists(file):
        os.remove(file)

    wb = openpyxl.Workbook()
    ws = wb.active
    ws.append(["Model", "Serial", "Specyfikacja", "Gwarancja"])

    for row in data:
        spec = f"{row['CPU']}; {row['RAM']}; {row['Dysk']}"
        ws.append([row["Model"], row["Serial"], spec, row["Gwarancja"]])

    wb.save(file)
    print(f"\n📁 Wynik zapisany w pliku: {file}")


def main():
    serials = ["52B9Y93"]  # <-- tu wpisujesz sobie kolejne service tagi
    results = scrap_dell(serials)
    save_excel(results)


if __name__ == "__main__":
    main()
Editor is loading...
Leave a Comment