diff --git a/scraping/scrapingMain.py b/scraping/scrapingMain.py index a6547b0..c4eae8d 100644 --- a/scraping/scrapingMain.py +++ b/scraping/scrapingMain.py @@ -5,55 +5,63 @@ from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from webdriver_manager.chrome import ChromeDriverManager -# Инициализация драйвера -driver = webdriver.Chrome(service=Service(ChromeDriverManager().install())) +def init_driver(): + options = webdriver.ChromeOptions() + options.add_argument("--start-maximized") + return webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options) -# URL страницы каталога ноутбуков -url = 'https://www.citilink.ru/catalog/noutbuki/?ref=mainpage' - -# Переход на страницу -driver.get(url) - -# Определение характеристик для поиска -target_specs = ["Экран", "Процессор", "Графический процессор", "Оперативная память", "Диск", "Операционная система"] - -try: - # Ожидание загрузки блоков с ноутбуками - WebDriverWait(driver, 10).until( - EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.app-catalog-1o4umte.ec53oil0')) - ) - - # Поиск блоков с ноутбуками - laptop_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-1o4umte.ec53oil0') - - # Список для сохранения всех характеристик ноутбуков +def scrape_all_pages(base_url, max_pages=5): + driver = init_driver() all_laptops_specs = [] - # Цикл по каждому блоку ноутбука - for laptop in laptop_blocks: - specs = {} + try: + driver.get(base_url) + current_page = 1 - # Получение всех характеристик ноутбука - spec_items = laptop.find_elements(By.CSS_SELECTOR, 'li.app-catalog-12y5psc.e4qu3682') + while current_page <= max_pages: + # Ожидание загрузки товаров + WebDriverWait(driver, 15).until( + EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div.app-catalog-1o4umte.ec53oil0')) + ) - # Поиск и сохранение целевых характеристик - for item in spec_items: - label_elem = item.find_element(By.CSS_SELECTOR, 'span') - label = label_elem.text.strip() - value = item.text.replace(label, '').strip() + # Скрапинг товаров + laptop_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-1o4umte.ec53oil0') + for laptop in laptop_blocks: + specs = {} + spec_items = laptop.find_elements(By.CSS_SELECTOR, 'li.app-catalog-12y5psc.e4qu3682') + for item in spec_items: + try: + label_elem = item.find_element(By.CSS_SELECTOR, 'span') + label = label_elem.text.strip() + value = item.text.replace(label, '').strip() + specs[label] = value + except Exception as e: + print(f"Ошибка в характеристике: {e}") + if specs: + all_laptops_specs.append(specs) - # Сохраняем только целевые характеристики - if label in target_specs: - specs[label] = value + # Переход на следующую страницу + try: + next_button = WebDriverWait(driver, 10).until( + EC.element_to_be_clickable((By.XPATH, + '//*[@id="__next"]/div/main/section/div[2]/div/div/section/div[2]/div[3]/div/div[2]/div[3]/a/div')) + ) + # Прокрутка к кнопке + driver.execute_script("arguments[0].scrollIntoView({block: 'center', inline: 'center'});", next_button) + next_button.click() + WebDriverWait(driver, 10).until(EC.staleness_of(laptop_blocks[0])) + current_page += 1 # Переход на следующую страницу + except Exception as e: + print("Кнопка 'Следующая' не найдена или конец каталога:", e) + break - # Добавляем характеристики ноутбука в общий список - if specs: - all_laptops_specs.append(specs) + finally: + driver.quit() - # Вывод информации обо всех ноутбуках - for i, specs in enumerate(all_laptops_specs, 1): + return all_laptops_specs + +if __name__ == "__main__": + url = 'https://www.citilink.ru/catalog/noutbuki/?ref=mainpage' + laptops = scrape_all_pages(url, max_pages=5) # Установите количество страниц + for i, specs in enumerate(laptops, 1): print(f'Ноутбук {i}: {specs}') - -finally: - # Закрытие драйвера - driver.quit()