Готовое (всё)
This commit is contained in:
parent
28a9d3fa1f
commit
d2fe2f04f7
@ -1,4 +1,5 @@
|
||||
import csv
|
||||
import re
|
||||
from selenium import webdriver
|
||||
from selenium.webdriver.chrome.service import Service
|
||||
from selenium.webdriver.common.by import By
|
||||
@ -11,9 +12,14 @@ def init_driver():
|
||||
options.add_argument("--start-maximized")
|
||||
return webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
|
||||
|
||||
def extract_screen_diagonal(name):
|
||||
"""Извлекает диагональ экрана из названия товара."""
|
||||
match = re.search(r'(\d{2})["”]', name)
|
||||
return match.group(1) if match else "Не указана"
|
||||
|
||||
def scrape_all_pages(base_url, max_pages=5):
|
||||
driver = init_driver()
|
||||
all_laptops_specs = []
|
||||
all_tv_specs = []
|
||||
|
||||
try:
|
||||
driver.get(base_url)
|
||||
@ -26,12 +32,12 @@ def scrape_all_pages(base_url, max_pages=5):
|
||||
)
|
||||
|
||||
# Скрапинг характеристик
|
||||
laptop_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-1o4umte.ec53oil0')
|
||||
tv_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-1o4umte.ec53oil0')
|
||||
specs_list = []
|
||||
|
||||
for laptop in laptop_blocks:
|
||||
for tv in tv_blocks:
|
||||
specs = {}
|
||||
spec_items = laptop.find_elements(By.CSS_SELECTOR, 'li.app-catalog-12y5psc.e4qu3682')
|
||||
spec_items = tv.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')
|
||||
@ -43,7 +49,25 @@ def scrape_all_pages(base_url, max_pages=5):
|
||||
|
||||
specs_list.append(specs)
|
||||
|
||||
# Скрапинг цен
|
||||
|
||||
# Скрапинг названий и извлечение диагоналей
|
||||
name_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-1tp0ino.e1k5a7g60')
|
||||
|
||||
for idx, diagonal_elem in enumerate(name_blocks):
|
||||
try:
|
||||
diagonal_element = diagonal_elem.find_element(By.CSS_SELECTOR, 'a.app-catalog-9gnskf.e1259i3g0')
|
||||
diagonal = extract_screen_diagonal(diagonal_element.text.strip())
|
||||
|
||||
# Если соответствующий specs существует, добавляем цену
|
||||
if idx < len(specs_list):
|
||||
specs_list[idx]["Диагональ"] = diagonal
|
||||
except Exception as e:
|
||||
print(f"Ошибка при скрапинге цены: {e}")
|
||||
if idx < len(specs_list):
|
||||
specs_list[idx]["Диагональ"] = "Не указана"
|
||||
|
||||
|
||||
# # Скрапинг цен
|
||||
price_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-817h00.ean5xps0')
|
||||
|
||||
for idx, laptop in enumerate(price_blocks):
|
||||
@ -59,8 +83,9 @@ def scrape_all_pages(base_url, max_pages=5):
|
||||
if idx < len(specs_list):
|
||||
specs_list[idx]["Цена"] = "Не указана"
|
||||
|
||||
|
||||
# Итоговые данные
|
||||
all_laptops_specs.extend(specs_list)
|
||||
all_tv_specs.extend(specs_list)
|
||||
|
||||
# Переход на следующую страницу
|
||||
try:
|
||||
@ -71,7 +96,7 @@ def scrape_all_pages(base_url, max_pages=5):
|
||||
# Прокрутка к кнопке
|
||||
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]))
|
||||
WebDriverWait(driver, 10).until(EC.staleness_of(tv_blocks[0]))
|
||||
current_page += 1 # Переход на следующую страницу
|
||||
except Exception as e:
|
||||
print("Кнопка 'Следующая' не найдена или конец каталога:", e)
|
||||
@ -80,8 +105,7 @@ def scrape_all_pages(base_url, max_pages=5):
|
||||
finally:
|
||||
driver.quit()
|
||||
|
||||
return all_laptops_specs
|
||||
|
||||
return all_tv_specs
|
||||
|
||||
def save_to_csv(data, filename, ignore_fields=None):
|
||||
# Устанавливаем игнорируемые поля, если они не заданы
|
||||
@ -90,8 +114,8 @@ def save_to_csv(data, filename, ignore_fields=None):
|
||||
|
||||
# Фиксированные заголовки
|
||||
fieldnames = [
|
||||
"processor", "ram", "os", "ssd",
|
||||
"display", "gpu", "price"
|
||||
"screen_size", "display", "tuners", "features", "os",
|
||||
"power_of_volume", "color", "price"
|
||||
]
|
||||
|
||||
# Сохранение данных в CSV
|
||||
@ -100,14 +124,15 @@ def save_to_csv(data, filename, ignore_fields=None):
|
||||
writer.writeheader() # Записываем заголовок
|
||||
|
||||
for row in data:
|
||||
# Убираем игнорируемые поля и добавляем пропущенные характеристики
|
||||
# Формируем полный набор данных с необходимыми полями
|
||||
complete_row = {
|
||||
"processor": row.get("Процессор", ""),
|
||||
"ram": row.get("Оперативная память", ""),
|
||||
"os": row.get("Операционная система", ""),
|
||||
"ssd": row.get("Диск", ""),
|
||||
"screen_size": row.get("Диагональ", ""),
|
||||
"display": row.get("Экран", ""),
|
||||
"gpu": row.get("Графический процессор", ""),
|
||||
"tuners": row.get("Тюнеры", ""),
|
||||
"features": row.get("Особенности", ""),
|
||||
"os": row.get("Операционная система", ""),
|
||||
"power_of_volume": row.get("Мощность акустики", ""),
|
||||
"color": row.get("Цвет", ""),
|
||||
"price": row.get("Цена", ""),
|
||||
}
|
||||
|
||||
@ -116,8 +141,8 @@ def save_to_csv(data, filename, ignore_fields=None):
|
||||
writer.writerow(filtered_row)
|
||||
|
||||
if __name__ == "__main__":
|
||||
url = 'https://www.citilink.ru/catalog/noutbuki/?ref=mainpage'
|
||||
laptops = scrape_all_pages(url, max_pages=20)
|
||||
ignore_fields = ["Технология Intel", "Комплектация", "Клавиатура"]
|
||||
save_to_csv(laptops, 'laptops.csv', ignore_fields)
|
||||
print(f"Данные сохранены в файл 'laptops.csv'.")
|
||||
url = 'https://www.citilink.ru/catalog/televizory/?ref=mainpage'
|
||||
tvs = scrape_all_pages(url, max_pages=8)
|
||||
ignore_fields = ["Работает с"]
|
||||
save_to_csv(tvs, 'tv.csv', ignore_fields)
|
||||
print(f"Данные сохранены в файл 'tv.csv'.")
|
||||
|
123
scraping/scrappingLaptop.py
Normal file
123
scraping/scrappingLaptop.py
Normal file
@ -0,0 +1,123 @@
|
||||
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')
|
||||
specs_list = []
|
||||
|
||||
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}")
|
||||
|
||||
specs_list.append(specs)
|
||||
|
||||
# Скрапинг цен
|
||||
price_blocks = driver.find_elements(By.CSS_SELECTOR, 'div.app-catalog-817h00.ean5xps0')
|
||||
|
||||
for idx, laptop in enumerate(price_blocks):
|
||||
try:
|
||||
price_element = laptop.find_element(By.CSS_SELECTOR, 'span.e1j9birj0')
|
||||
price = price_element.text.strip()
|
||||
|
||||
# Если соответствующий specs существует, добавляем цену
|
||||
if idx < len(specs_list):
|
||||
specs_list[idx]["Цена"] = price
|
||||
except Exception as e:
|
||||
print(f"Ошибка при скрапинге цены: {e}")
|
||||
if idx < len(specs_list):
|
||||
specs_list[idx]["Цена"] = "Не указана"
|
||||
|
||||
# Итоговые данные
|
||||
all_laptops_specs.extend(specs_list)
|
||||
|
||||
# Переход на следующую страницу
|
||||
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=20)
|
||||
ignore_fields = ["Технология Intel", "Комплектация", "Клавиатура"]
|
||||
save_to_csv(laptops, 'laptops.csv', ignore_fields)
|
||||
print(f"Данные сохранены в файл 'laptops.csv'.")
|
Loading…
x
Reference in New Issue
Block a user