import pandas as pd from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup import os import time from lxml import etree # Определяем директорию скрипта script_dir = os.path.dirname(os.path.abspath(__file__)) # Пути к файлам input_file = os.path.join(script_dir, 'leaf_categories.xlsx') output_file = os.path.join(script_dir, 'all_liks.xlsx') # Читаем категории из файла try: df_categories = pd.read_excel(input_file) category_urls = df_categories['url'].tolist() print(f"Найдено {len(category_urls)} категорий.") except Exception as e: print(f"Ошибка при чтении файла {input_file}: {e}") exit(1) all_product_links = [] # Настраиваем Selenium chrome_options = Options() chrome_options.add_argument("--headless") # Без графического интерфейса chrome_options.add_argument("--disable-gpu") chrome_options.add_argument("--no-sandbox") chrome_options.add_argument("--disable-dev-shm-usage") chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36") driver = webdriver.Chrome(options=chrome_options) # Обрабатываем каждую категорию for category_url in category_urls: # Пропускаем nan или пустые значения if not isinstance(category_url, str) or not category_url: print(f"Пропущена некорректная категория: {category_url}") continue print(f"Обрабатываем категорию: {category_url}") page = 1 while True: # Формируем URL с параметром page и якорем url = f"{category_url.rstrip('/')}?page={page}#products-page-{page}" # Загружаем страницу try: driver.get(url) print(f"HTTP статус: {driver.execute_script('return document.readyState')}") time.sleep(2) # Ждём загрузки JavaScript except Exception as e: print(f"Ошибка загрузки {url}: {e}") break soup = BeautifulSoup(driver.page_source, 'html.parser') # Собираем ссылки на товары product_links = [a['href'] for a in soup.select('div.plp-fragment-wrapper a[href^="https://www.ikea.com/pl/pl/p/"]')] all_product_links.extend(product_links) print(f"Обработка страницы {url}: найдено {len(product_links)} ссылок.") # Находим элемент по XPath parser = etree.HTMLParser() tree = etree.fromstring(driver.page_source, parser) progress_elements = tree.xpath('//*[@id="product-list"]/div[3]/progress') if not progress_elements: print("Элемент по XPath //*[@id=\"product-list\"]/div[3]/progress не найден.") print("HTML фрагмент контейнера:", soup.find('div', class_='plp-catalog-bottom-container')) print("Завершаем категорию.") break progress = progress_elements[0] progress_html = etree.tostring(progress, encoding='unicode', method='html') print(f"Элемент : {progress_html}") try: value = int(progress.get('value')) max_value = int(progress.get('max')) print(f"Прогресс: {value} из {max_value}") except (KeyError, ValueError) as e: print(f"Ошибка при извлечении value/max: {e}. HTML фрагмент:", progress_html) break # Проверяем условие остановки if value >= max_value: print("Все товары загружены. Завершаем категорию.") break # Пауза после обработки страницы time.sleep(1) page += 1 print("Завершена обработка категории.") # Закрываем браузер driver.quit() # Удаляем дубликаты и сохраняем результат unique_links = list(set(all_product_links)) df = pd.DataFrame({'url': unique_links}) df.to_excel(output_file, index=False) print(f"Собрано уникальных ссылок: {len(unique_links)}")