103 lines
4.6 KiB
Python

import csv
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.chrome import ChromeDriverManager
def init_driver():
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
return webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
def scrape_all_pages(base_url, max_pages=5):
driver = init_driver()
all_laptops_specs = []
try:
driver.get(base_url)
current_page = 1
while current_page <= max_pages:
# Ожидание загрузки товаров
WebDriverWait(driver, 15).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')
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)
# Переход на следующую страницу
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
finally:
driver.quit()
return all_laptops_specs
def save_to_csv(data, filename, ignore_fields=None):
# Устанавливаем игнорируемые поля, если они не заданы
if ignore_fields is None:
ignore_fields = []
# Фиксированные заголовки
fieldnames = [
"processor", "ram", "os", "ssd",
"display", "gpu", "price"
]
# Сохранение данных в CSV
with open(filename, mode='w', newline='', encoding='utf-8') as file:
writer = csv.DictWriter(file, fieldnames=fieldnames)
writer.writeheader() # Записываем заголовок
for row in data:
# Убираем игнорируемые поля и добавляем пропущенные характеристики
complete_row = {
"processor": row.get("Процессор", ""),
"ram": row.get("Оперативная память", ""),
"os": row.get("Операционная система", ""),
"ssd": row.get("Диск", ""),
"display": row.get("Экран", ""),
"gpu": row.get("Графический процессор", ""),
"price": row.get("Цена", ""),
}
# Убираем поля, которые нужно игнорировать
filtered_row = {k: v for k, v in complete_row.items() if k not in ignore_fields}
writer.writerow(filtered_row)
if __name__ == "__main__":
url = 'https://www.citilink.ru/catalog/noutbuki/?ref=mainpage'
laptops = scrape_all_pages(url, max_pages=2)
ignore_fields = ["Технология Intel", "Комплектация", "Клавиатура"]
save_to_csv(laptops, 'laptops.csv', ignore_fields)
print(f"Данные сохранены в файл 'laptops_specs.csv'.")