move translations to new file
This commit is contained in:
@@ -15,6 +15,19 @@ import urllib3
|
||||
from .core.config import Settings
|
||||
from .storage.db import PersistenceService
|
||||
from .storage.schemas import CarRecord, ImageRecord
|
||||
from .translations import (
|
||||
BODY_TYPE_MAP,
|
||||
BRAND_ENGLISH_ALIASES,
|
||||
BRAND_TRANSLATIONS,
|
||||
CITY_TO_COUNTRY,
|
||||
COLOR_TRANSLATIONS,
|
||||
FUEL_TYPE_MAP,
|
||||
GEARBOX_MAP_KO,
|
||||
MODEL_BODY_TYPE_MAP,
|
||||
MODEL_TRANSLATIONS,
|
||||
SELL_TYPE_MAP,
|
||||
expand_allowed_brands,
|
||||
)
|
||||
|
||||
logger = logging.getLogger("encar_scraper")
|
||||
|
||||
@@ -38,387 +51,6 @@ CAR_TYPE_DOMESTIC = "Y" # только отечественные
|
||||
CAR_TYPE_IMPORT = "N" # только импорт
|
||||
CAR_TYPE_ELECTRIC = "G" # электро/гибрид
|
||||
|
||||
# Корейские → латинские для fuel
|
||||
FUEL_TYPE_MAP = {
|
||||
"가솔린": "petrol",
|
||||
"gasoline": "petrol",
|
||||
"디젤": "diesel",
|
||||
"diesel": "diesel",
|
||||
"전기": "electric",
|
||||
"electric": "electric",
|
||||
"하이브리드": "hybrid",
|
||||
"hybrid": "hybrid",
|
||||
"lpg": "lpg",
|
||||
"LPG": "lpg",
|
||||
"LPG(일반인 구입)": "lpg",
|
||||
"LPG(장애인 구입)": "lpg",
|
||||
"가솔린+전기": "hybrid",
|
||||
"디젤+전기": "hybrid",
|
||||
"CNG": "cng",
|
||||
}
|
||||
|
||||
GEARBOX_MAP_KO = {
|
||||
"오토": "AT",
|
||||
"자동": "AT",
|
||||
"수동": "MT",
|
||||
"cvt": "CVT",
|
||||
"CVT": "CVT",
|
||||
}
|
||||
|
||||
SELL_TYPE_MAP = {
|
||||
"일반": "STOCK",
|
||||
"경매": "AUCTION",
|
||||
"입찰": "TENDER",
|
||||
}
|
||||
|
||||
CITY_TO_COUNTRY = {
|
||||
"서울": "KR", "경기": "KR", "인천": "KR", "부산": "KR", "대구": "KR",
|
||||
"광주": "KR", "대전": "KR", "울산": "KR", "세종": "KR", "강원": "KR",
|
||||
"충북": "KR", "충남": "KR", "전북": "KR", "전남": "KR", "경북": "KR",
|
||||
"경남": "KR", "제주": "KR",
|
||||
}
|
||||
|
||||
# Переводы брендов с корейского/английского на русский
|
||||
BRAND_TRANSLATIONS = {
|
||||
"현대": "Хёндэ",
|
||||
"기아": "Киа",
|
||||
"쉐보레(GM대우)": "Шевроле",
|
||||
"벤츠": "Мерседес-Бенц",
|
||||
"BMW": "BMW",
|
||||
"아우디": "Ауди",
|
||||
"폭스바겐": "Фольксваген",
|
||||
"토요타": "Тойота",
|
||||
"도요타": "Тойота",
|
||||
"닛산": "Ниссан",
|
||||
"혼다": "Хонда",
|
||||
"포르쉐": "Порше",
|
||||
"랜드로버": "Ленд Ровер",
|
||||
"재규어": "Ягуар",
|
||||
"볼보": "Вольво",
|
||||
"푸조": "Пежо",
|
||||
"시트로엥": "Ситроен",
|
||||
"르노": "Рено",
|
||||
"미니": "Мини",
|
||||
"링컨": "Линкольн",
|
||||
"캐딜락": "Кадиллак",
|
||||
"크라이슬러": "Крайслер",
|
||||
"지프": "Джип",
|
||||
"포드": "Форд",
|
||||
"테슬라": "Тесла",
|
||||
"폴크스바겐": "Фольксваген",
|
||||
"스코다": "Шкода",
|
||||
"세아트": "SEAT",
|
||||
"오펠": "Опель",
|
||||
"피아트": "Фиат",
|
||||
"알파로메오": "Альфа Ромео",
|
||||
"마세라티": "Мазерати",
|
||||
"람보르기니": "Ламборгини",
|
||||
"페라리": "Феррари",
|
||||
"벤틀리": "Бентли",
|
||||
"롤스로이스": "Роллс-Ройс",
|
||||
"애스턴마틴": "Астон Мартин",
|
||||
"맥라렌": "Макларен",
|
||||
"부가티": "Бугатти",
|
||||
"코닉세그": "Кёнигсегг",
|
||||
"파가니": "Пагани",
|
||||
"헤네시": "Hennessey",
|
||||
"쉘비": "Shelby",
|
||||
"다임러": "Daimler",
|
||||
"마이바흐": "Майбах",
|
||||
"스마트": "Смарт",
|
||||
"DS": "DS",
|
||||
"렉서스": "Лексус",
|
||||
"인피니티": "Инфинити",
|
||||
"아큐라": "Акура",
|
||||
"스바루": "Субару",
|
||||
"미쓰비시": "Мицубиси",
|
||||
"마쓰다": "Мазда",
|
||||
"이스즈": "Исузу",
|
||||
"다이하츠": "Daihatsu",
|
||||
"스즈키": "Сузуки",
|
||||
"KG모빌리티(쌍용)": "KG Mobility",
|
||||
"르노코리아(삼성)": "Рено Корея",
|
||||
"한국GM": "GM Korea",
|
||||
"쌍용": "СсангЙонг",
|
||||
"대우": "Дэу",
|
||||
"제네시스": "Генезис",
|
||||
"르노삼성": "Рено Самсунг",
|
||||
"닷지": "Dodge",
|
||||
"험머": "Hummer",
|
||||
"폴스타": "Polestar",
|
||||
"사브": "Saab",
|
||||
"로터스": "Lotus",
|
||||
"리비안": "Rivian",
|
||||
"루시드": "Lucid",
|
||||
"리막": "Rimac",
|
||||
"알파 로메오": "Альфа Ромео",
|
||||
"마쯔다": "Мазда",
|
||||
"어큐라": "Акура",
|
||||
"다이하쯔": "Daihatsu",
|
||||
}
|
||||
|
||||
# Маппинг английских названий брендов → все варианты (корейский + русский перевод).
|
||||
# Используется для расширения фильтра allowed_brands из runtime_config.
|
||||
BRAND_ENGLISH_ALIASES: dict[str, list[str]] = {
|
||||
"hyundai": ["현대", "Хёндэ"],
|
||||
"kia": ["기아", "Киа"],
|
||||
"genesis": ["제네시스", "Генезис"],
|
||||
"chevrolet": ["쉐보레(GM대우)", "쉐보레", "Шевроле"],
|
||||
"mercedes": ["벤츠", "Мерседес-Бенц"],
|
||||
"mercedes-benz": ["벤츠", "Мерседес-Бенц"],
|
||||
"bmw": ["BMW"],
|
||||
"audi": ["아우디", "Ауди"],
|
||||
"volkswagen": ["폭스바겐", "폴크스바겐", "Фольксваген"],
|
||||
"toyota": ["토요타", "도요타", "Тойота"],
|
||||
"nissan": ["닛산", "Ниссан"],
|
||||
"honda": ["혼다", "Хонда"],
|
||||
"porsche": ["포르쉐", "Порше"],
|
||||
"land rover": ["랜드로버", "Ленд Ровер"],
|
||||
"jaguar": ["재규어", "Ягуар"],
|
||||
"volvo": ["볼보", "Вольво"],
|
||||
"peugeot": ["푸조", "Пежо"],
|
||||
"citroen": ["시트로엥", "Ситроен", "시트로엥/DS"],
|
||||
"renault": ["르노", "Рено"],
|
||||
"mini": ["미니", "Мини"],
|
||||
"lincoln": ["링컨", "Линкольн"],
|
||||
"cadillac": ["캐딜락", "Кадиллак"],
|
||||
"chrysler": ["크라이슬러", "Крайслер"],
|
||||
"jeep": ["지프", "Джип"],
|
||||
"ford": ["포드", "Форд"],
|
||||
"tesla": ["테슬라", "Тесла"],
|
||||
"lexus": ["렉서스", "Лексус"],
|
||||
"infiniti": ["인피니티", "Инфинити"],
|
||||
"acura": ["아큐라", "Акура"],
|
||||
"subaru": ["스바루", "Субару"],
|
||||
"mitsubishi": ["미쓰비시", "Мицубиси"],
|
||||
"mazda": ["마쓰다", "Мазда"],
|
||||
"suzuki": ["스즈키", "Сузуки"],
|
||||
"ferrari": ["페라리", "Феррари"],
|
||||
"lamborghini": ["람보르기니", "Ламборгини"],
|
||||
"maserati": ["마세라티", "Мазерати"],
|
||||
"bentley": ["벤틀리", "Бентли"],
|
||||
"rolls-royce": ["롤스로이스", "Роллс-Ройс"],
|
||||
"aston martin": ["애스턴마틴", "Астон Мартин"],
|
||||
"mclaren": ["맥라렌", "Макларен"],
|
||||
"ssangyong": ["쌍용", "СсангЙонг", "KG모빌리티(쌍용)", "KG Mobility"],
|
||||
"daewoo": ["대우", "Дэу"],
|
||||
"dodge": ["닷지"],
|
||||
"hummer": ["험머"],
|
||||
"gmc": ["GMC"],
|
||||
"polestar": ["폴스타"],
|
||||
"ds": ["DS", "시트로엥/DS"],
|
||||
"renault korea": ["르노코리아(삼성)", "Рено Корея", "르노삼성", "Рено Самсунг"],
|
||||
"saab": ["사브"],
|
||||
"lotus": ["로터스"],
|
||||
"alfa romeo": ["알파로메오", "Альфа Ромео", "알파 로메오"],
|
||||
"fiat": ["피아트", "Фиат"],
|
||||
"smart": ["스마트", "Смарт"],
|
||||
"skoda": ["스코다", "Шкода"],
|
||||
"daihatsu": ["다이하츠", "다이하쯔", "Daihatsu"],
|
||||
"koenigsegg": ["코닉세그", "Кёнигсегг"],
|
||||
"pagani": ["파가니", "Пагани"],
|
||||
"bugatti": ["부가티", "Бугатти"],
|
||||
"maybach": ["마이바흐", "Майбах"],
|
||||
"rivian": ["리비안"],
|
||||
"lucid": ["루시드"],
|
||||
"rimac": ["리막"],
|
||||
}
|
||||
|
||||
|
||||
def expand_allowed_brands(brands: set[str] | None) -> set[str] | None:
|
||||
"""Расширяет набор английских брендов всеми известными alias'ами (корейский + русский)."""
|
||||
if not brands:
|
||||
return brands
|
||||
expanded = set(brands)
|
||||
for brand in brands:
|
||||
aliases = BRAND_ENGLISH_ALIASES.get(brand.lower(), [])
|
||||
for alias in aliases:
|
||||
expanded.add(alias.lower())
|
||||
return expanded
|
||||
|
||||
MODEL_TRANSLATIONS = {
|
||||
"가솔린": "бензин",
|
||||
"디젤": "дизель",
|
||||
"하이브리드": "гибрид",
|
||||
"전기": "электро",
|
||||
"터보": "турбо",
|
||||
"쿠페": "купе",
|
||||
"세단": "седан",
|
||||
"왜건": "универсал",
|
||||
"해치백": "хэтчбек",
|
||||
"컨버터블": "кабриолет",
|
||||
"오토": "автомат",
|
||||
"수동": "механика",
|
||||
"프레스티지": "престиж",
|
||||
"시그니처": "сигнатур",
|
||||
"럭셔리": "люкс",
|
||||
"스포츠": "спорт",
|
||||
"롱레인지": "дальний запас хода",
|
||||
"스탠다드": "стандарт",
|
||||
"플러스": "плюс",
|
||||
"리미티드": "лимитед",
|
||||
"스페셜": "спешл",
|
||||
"모던": "модерн",
|
||||
"익스클루시브": "эксклюзив",
|
||||
"캘리그래피": "каллиграфи",
|
||||
"노블레스": "ноблесс",
|
||||
"트림": "трим",
|
||||
"후륜": "задний привод",
|
||||
"전륜": "передний привод",
|
||||
"사륜": "полный привод",
|
||||
}
|
||||
|
||||
# Переводы цветов с корейского на английский
|
||||
COLOR_TRANSLATIONS = {
|
||||
"흰색": "white",
|
||||
"검정색": "black",
|
||||
"회색": "gray",
|
||||
"은색": "silver",
|
||||
"진회색": "dark gray",
|
||||
"밝은 회색": "light gray",
|
||||
"청색": "blue",
|
||||
"파란색": "blue",
|
||||
"진청색": "dark blue",
|
||||
"밝은 청색": "light blue",
|
||||
"녹색": "green",
|
||||
"초록색": "green",
|
||||
"진녹색": "dark green",
|
||||
"밝은 녹색": "light green",
|
||||
"적색": "red",
|
||||
"빨간색": "red",
|
||||
"진적색": "dark red",
|
||||
"밝은 적색": "light red",
|
||||
"주황색": "orange",
|
||||
"노란색": "yellow",
|
||||
"갈색": "brown",
|
||||
"베이지색": "beige",
|
||||
"아이보리": "ivory",
|
||||
"크림색": "cream",
|
||||
"보라색": "purple",
|
||||
"분홍색": "pink",
|
||||
"금색": "gold",
|
||||
"은색": "silver",
|
||||
"청금색": "blue-gold",
|
||||
"청은색": "blue-silver",
|
||||
"흑청색": "black-blue",
|
||||
"흑적색": "black-red",
|
||||
"흑녹색": "black-green",
|
||||
"흑회색": "black-gray",
|
||||
"흰청색": "white-blue",
|
||||
"흰적색": "white-red",
|
||||
"흰녹색": "white-green",
|
||||
"흰회색": "white-gray",
|
||||
"청적색": "blue-red",
|
||||
"청녹색": "blue-green",
|
||||
"청회색": "blue-gray",
|
||||
"적녹색": "red-green",
|
||||
"적회색": "red-gray",
|
||||
"녹회색": "green-gray",
|
||||
"기타": "other",
|
||||
"기타색상": "other",
|
||||
"특별색상": "special",
|
||||
"무채색": "neutral",
|
||||
"메탈릭": "metallic",
|
||||
"펄": "pearl",
|
||||
"무광": "matte",
|
||||
"광택": "glossy",
|
||||
}
|
||||
|
||||
# Типы кузова
|
||||
BODY_TYPE_MAP = {
|
||||
"세단": "SEDAN",
|
||||
"SUV": "SUV",
|
||||
"SUV ": "SUV",
|
||||
"해치백": "HATCHBACK",
|
||||
"왜건": "WAGON",
|
||||
"컨버터블": "CONVERTIBLE",
|
||||
"쿠페": "COUPE",
|
||||
"픽업": "PICKUP",
|
||||
"밴": "VAN",
|
||||
"트럭": "TRUCK",
|
||||
"버스": "BUS",
|
||||
"기타": "OTHER",
|
||||
"승용차": "SEDAN",
|
||||
"승합차": "VAN",
|
||||
"화물차": "TRUCK",
|
||||
"특장차": "SPECIAL",
|
||||
"경차": "COMPACT",
|
||||
"중형차": "MID_SIZE",
|
||||
"대형차": "FULL_SIZE",
|
||||
"스포츠카": "SPORTS",
|
||||
"클래식카": "CLASSIC",
|
||||
"전기차": "ELECTRIC",
|
||||
"하이브리드": "HYBRID",
|
||||
}
|
||||
|
||||
# Определение body_type по модели
|
||||
MODEL_BODY_TYPE_MAP: dict[str, str] = {
|
||||
# SUV / кроссоверы
|
||||
"투싼": "SUV", "싼타페": "SUV", "팰리세이드": "SUV", "코나": "SUV", "베뉴": "SUV",
|
||||
"크레타": "SUV", "넥쏘": "SUV", "아이오닉5": "SUV", "아이오닉6": "SEDAN",
|
||||
"셀토스": "SUV", "스포티지": "SUV", "쏘렌토": "SUV", "모하비": "SUV",
|
||||
"니로": "SUV", "EV6": "SUV", "EV9": "SUV",
|
||||
"티볼리": "SUV", "코란도": "SUV", "렉스턴": "SUV", "토레스": "SUV", "액티언": "SUV",
|
||||
"GV70": "SUV", "GV80": "SUV", "GV60": "SUV",
|
||||
"X1": "SUV", "X2": "SUV", "X3": "SUV", "X4": "SUV", "X5": "SUV", "X6": "SUV", "X7": "SUV", "iX": "SUV", "iX3": "SUV",
|
||||
"Q2": "SUV", "Q3": "SUV", "Q4": "SUV", "Q5": "SUV", "Q7": "SUV", "Q8": "SUV",
|
||||
"GLA": "SUV", "GLB": "SUV", "GLC": "SUV", "GLE": "SUV", "GLS": "SUV",
|
||||
"카이엔": "SUV", "마칸": "SUV",
|
||||
"레인지로버": "SUV", "디스커버리": "SUV", "디펜더": "SUV",
|
||||
"래브4": "SUV", "하이랜더": "SUV", "FJ 크루져": "SUV",
|
||||
"CR-V": "SUV", "HR-V": "SUV",
|
||||
"티구안": "SUV", "투아렉": "SUV", "아틀라스": "SUV", "ID.4": "SUV",
|
||||
"트레일블레이저": "SUV", "이쿼녹스": "SUV", "트래버스": "SUV", "트랙스": "SUV", "캡티바": "SUV", "올란도": "SUV",
|
||||
"XC40": "SUV", "XC60": "SUV", "XC90": "SUV", "V40": "HATCHBACK", "V60": "STATION_WAGON", "V90": "STATION_WAGON",
|
||||
"F-PACE": "SUV", "E-PACE": "SUV", "I-PACE": "SUV",
|
||||
"모델 Y": "SUV", "Model Y": "SUV", "모델 X": "SUV", "Model X": "SUV",
|
||||
"RX": "SUV", "NX": "SUV", "UX": "SUV", "LX": "SUV",
|
||||
"QX50": "SUV", "QX60": "SUV", "QX80": "SUV",
|
||||
"QM3": "SUV", "QM6": "SUV",
|
||||
"레니게이드": "SUV", "컴패스": "SUV", "체로키": "SUV", "랭글러": "SUV", "글래디에이터": "PICKUP",
|
||||
"에비에이터": "SUV", "노틸러스": "SUV", "코세어": "SUV",
|
||||
"마칸": "SUV", "카이엔": "SUV",
|
||||
"르반떼": "SUV", "그레칼레": "SUV",
|
||||
"Z4": "CONVERTIBLE",
|
||||
# 세단
|
||||
"쏘나타": "SEDAN", "아반떼": "SEDAN", "그랜저": "SEDAN", "K5": "SEDAN",
|
||||
"K8": "SEDAN", "K9": "SEDAN", "K3": "SEDAN", "K7": "SEDAN",
|
||||
"G70": "SEDAN", "G80": "SEDAN", "G90": "SEDAN",
|
||||
"1시리즈": "HATCHBACK",
|
||||
"2시리즈 그란쿠페": "SEDAN", "2시리즈 액티브투어러": "MINIVAN",
|
||||
"3시리즈": "SEDAN", "3시리즈 GT": "SEDAN",
|
||||
"5시리즈": "SEDAN", "7시리즈": "SEDAN", "i4": "SEDAN", "i7": "SEDAN",
|
||||
"A1": "HATCHBACK", "A3": "SEDAN", "A4": "SEDAN", "A6": "SEDAN", "A7": "SEDAN", "A8": "SEDAN",
|
||||
"A-클래스": "SEDAN", "CLA": "SEDAN",
|
||||
"C-클래스": "SEDAN", "E-클래스": "SEDAN", "S-클래스": "SEDAN",
|
||||
"캠리": "SEDAN", "아발론": "SEDAN", "프리우스": "SEDAN",
|
||||
"어코드": "SEDAN", "시빅": "SEDAN",
|
||||
"파사트": "SEDAN", "제타": "SEDAN", "아테온": "SEDAN",
|
||||
"말리부": "SEDAN", "크루즈": "SEDAN", "임팔라": "SEDAN",
|
||||
"S60": "SEDAN", "S90": "SEDAN",
|
||||
"IS": "SEDAN", "ES": "SEDAN", "GS": "SEDAN", "LS": "SEDAN",
|
||||
"Q50": "SEDAN", "Q70": "SEDAN",
|
||||
"모델 3": "SEDAN", "Model 3": "SEDAN", "모델 S": "SEDAN", "Model S": "SEDAN",
|
||||
"SM6": "SEDAN", "SM5": "SEDAN",
|
||||
# 해치백
|
||||
"스파크": "HATCHBACK", "모닝": "HATCHBACK", "레이": "HATCHBACK",
|
||||
"i30": "HATCHBACK", "벨로스터": "HATCHBACK",
|
||||
"골프": "HATCHBACK", "폴로": "HATCHBACK", "ID.3": "HATCHBACK",
|
||||
"캐스퍼": "HATCHBACK",
|
||||
# 미니밴/밴
|
||||
"카니발": "MINIVAN", "스타리아": "MINIVAN", "스타렉스": "MINIVAN",
|
||||
"V-클래스": "MINIVAN", "비토": "VAN",
|
||||
"시에나": "MINIVAN", "알파드": "MINIVAN",
|
||||
# 트럭/픽업
|
||||
"포터": "PICKUP", "봉고": "PICKUP", "마이티": "TRUCK",
|
||||
"타코마": "PICKUP", "터프": "PICKUP",
|
||||
"콜로라도": "PICKUP", "실버라도": "PICKUP",
|
||||
# 쿠페
|
||||
"4시리즈": "COUPE", "8시리즈": "COUPE", "2시리즈": "COUPE",
|
||||
"A5": "COUPE", "TT": "COUPE",
|
||||
"RC": "COUPE", "LC": "COUPE",
|
||||
}
|
||||
|
||||
# Regex для парсинга объёма двигателя из Badge
|
||||
ENGINE_VOLUME_RE = re.compile(r"(\d+\.\d+)\s*(?:T|터보)?")
|
||||
# Regex для европейских кодов: "530i", "C200", "A220", "GLC300", "740d", "M340i", "S63", "120i", "E220d" и т.д.
|
||||
@@ -848,9 +480,9 @@ class EncarMapper:
|
||||
class EncarScraper:
|
||||
DEFAULT_PAGE_SIZE = 1000 # API поддерживает до 1000
|
||||
|
||||
def __init__(self, settings: Settings | None = None) -> None:
|
||||
def __init__(self, settings: Settings | None = None, persistence: PersistenceService | None = None) -> None:
|
||||
self.settings = settings or Settings()
|
||||
self.persistence = PersistenceService(self.settings)
|
||||
self.persistence = persistence or PersistenceService(self.settings)
|
||||
self.car_mapper = EncarMapper()
|
||||
self._batch_pool: urllib3.HTTPSConnectionPool | None = None
|
||||
|
||||
|
||||
Reference in New Issue
Block a user