From ed65e5b48318c24196ff2807e06fc40069780784 Mon Sep 17 00:00:00 2001 From: FazziCLAY Date: Fri, 12 Sep 2025 20:07:04 +0300 Subject: [PATCH] =?UTF-8?q?fixes=203=20pairs=20=D0=BF=D0=BE=D0=B4=D1=80?= =?UTF-8?q?=D1=8F=D0=B4,=20etc?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- aigenerated.py | 3 + coord.py | 5 + excels/mag1757588817[C2003].xlsx.zip | Bin 79720 -> 0 bytes links_parser.py | 11 ++- main.py | 138 ++++++++++++++++++++++----- parser.py | 100 ++++++++++--------- translations.py | 5 +- utils.py | 55 +++++++++-- 8 files changed, 239 insertions(+), 78 deletions(-) delete mode 100644 excels/mag1757588817[C2003].xlsx.zip diff --git a/aigenerated.py b/aigenerated.py index 97a7b55..468509c 100644 --- a/aigenerated.py +++ b/aigenerated.py @@ -1,3 +1,6 @@ +# Copyright GEMINI + + import re # --- Ресурсы для алгоритма --- diff --git a/coord.py b/coord.py index ab218a2..bb25e81 100644 --- a/coord.py +++ b/coord.py @@ -1,3 +1,4 @@ +# Copyright Stanislav Mironov class Coord: @@ -13,6 +14,10 @@ class Coord: return Coord(self.row if row is None else row, self.col if col is None else col) + def copy(self) -> "Coord": + return Coord(self.row, + self.col) + def cell(self, reader: "ExcelSheetReader") -> "TranschendentnostCell": return reader.cell(self.row, self.col) diff --git a/excels/mag1757588817[C2003].xlsx.zip b/excels/mag1757588817[C2003].xlsx.zip deleted file mode 100644 index 6f5c70c4a8d719c12acb1d1b4311d49753d4137c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79720 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�=lDI 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 DaWA~R diff --git a/links_parser.py b/links_parser.py index 57050d6..3553032 100644 --- a/links_parser.py +++ b/links_parser.py @@ -1,5 +1,7 @@ +# Copyright Stanislav Mironov + + import re -import time from urllib.parse import urljoin import requests from requests.structures import CaseInsensitiveDict @@ -8,7 +10,7 @@ from bs4 import BeautifulSoup BASE_URL = "https://www.vstu.ru/" RASP_PREFIX = "https://www.vstu.ru/student/raspisaniya/zanyatiy/index.php?dep=" - +# Парсит ссылки на эксель .xls & .xlsx файлы и выдаёт их def parse_links(facultets): session = requests.Session() session.headers = CaseInsensitiveDict( @@ -18,17 +20,17 @@ def parse_links(facultets): "Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3", "Accept-Encoding": "gzip, deflate", "Connection": "keep-alive", - "Referer": "http://dump.vstu.ru/", "Upgrade-Insecure-Requests": "1", "Priority": "u=0, i", "Pragma": "no-cache", - "Cache-Control": "no-cach", + "Cache-Control": "no-cach" } ) EXCEL_LINKS = {} for facultet in facultets: url = RASP_PREFIX + facultet + print("getting...") r = session.get(url) print(f"GET {url}") soup = BeautifulSoup(r.text, 'html.parser') @@ -51,3 +53,4 @@ def parse_links(facultets): print(f"+url {excel_url}") return EXCEL_LINKS + diff --git a/main.py b/main.py index c63590e..52fbb4d 100644 --- a/main.py +++ b/main.py @@ -1,62 +1,127 @@ +# Copyright Stanislav Mironov + +# Общее правило проекта, сначала в координатах идёт ROW а потом COL, нумерация с нуля + + import json -import re +import os import time import traceback -from urllib.parse import urljoin -import pandas as pd -import xlwt - -import xlrd -import requests - - -from bs4 import BeautifulSoup +import uuid import aigenerated import parser import translations import utils import json import links_parser -# Общее правило проекта, сначала в координатах идёт ROW а потом COL, нумерация с нуля +import shutil + +def currt(): + return round(time.time()) FACULTETS = [ "asp", "mag", "fastiv", "fat", "ftkm", "ftpp", "feu", "fevt", "htf", "vkf", "mmf", "fpik" ] +DIRNAME = "excels" -DEBUG_ONE_FAC = None #'fevt' +DEBUG_ONE_FAC = None #'htf' +result_groups = {} +result = { + "version": 1, + "notice": "ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Данные, доступ к API и т.д. предоставляется КАК-ЕСТЬ (AS-IS) без каких либо, явно или не явно подразумеваемых гарантий.\n\nПарсер написал: Миронов Станислав", + "actual_at": round(time.time()), + "documentation": "TODO", + "daypicture": "QwQ", + "university": "VSTU", + "university_site": "https://www.vstu.ru/", + "stat": { + "total_parsing_time": -1, + }, + "api_notices": { + "updated_at": 1757688552, + "text": "Пожалуйста сохраняйте 'updated_at', это время изменения ЭТОГО текста. Тут возможно будут появлятся важные BREAKING CHANGES и дедлайны к ним.\nПо хорошему если updated_at другой по сравнению с вашем кэшем это сообщение должно отправляться вам в телеграм как уведомление о поедстоящих изменениях\nwarning=True значит 'text' содержит важное а не как щас hint.\n\n ~fazziclay aka Stanislav;", + "warning": False, + "tut-plavayuschaya-struktura": "required only 'updated_at', 'text' and 'warning'" + }, + "doubled_groups": [], + "debug": { + "bleu~~": 1 + }, + "excels": [], + "facultets": FACULTETS, + "emptykey1": "", + "emptykey2": "", + + "groups": result_groups, + + "emptykey3": "", + "emptykey4": "", + "see_header_at_top_of_this_file": "SEE TOP OF THIS FILE | ОБРАТИТЕ ВНИМАНИЕ НА ВЕРХ ЭТОГО ФАЙЛА" +} def process_excel_file(facultet, excel_url, counter, timeid): is_xlsx = excel_url.endswith(".xlsx") + filename = f"{DIRNAME}/" + timeid + f"_[C{counter}]_" + facultet + ".xls" + ("x" if is_xlsx else "") + + excel_info = { + "filename": excel_url.split("/")[-1], + "url": excel_url, + "download_place": filename, + "stat": { + "download": -1, + "create_reader": -1, + "parse": -1, + "cycles": 0 + }, + "group_names_parsed": [], + "facultet": facultet, + "counter": counter + } + parser.LOGGING = False + try: - filename = "excels/" + timeid + "_" + facultet + f"_[C{counter}]" + ".xls" + ("x" if is_xlsx else "") + t = utils.StepTimeCounter() aigenerated.download_file_from_url(excel_url, filename) + excel_info["stat"]['download'] = t.step() reader = translations.create_reader(filename) print("Reader info") print(reader.info()) + excel_info["stat"]['create_reader'] = t.step() while True: - print(f"Parsing sheet №{reader.get_sheet_index()+1}") - parser.LOGGING = False + excel_info['stat']['cycles'] += 1 + print(f"Parsing sheet №{reader.get_sheet_index()+1} (from 1)") prs = parser.Parser(reader) prs.parse() + if prs.parser_error is not None: + excel_info["parser_error_cycle_" + excel_info['stat']['cycles']] = prs.parser_error + for group_name in prs.groups.keys(): - if group_name in result.keys(): + if group_name in result_groups.keys(): print(f" -- WTF -- Doubled groups -- name: {group_name}") + if 'warning_doubled_groups_skip' not in excel_info.keys(): + excel_info['warning_doubled_groups_skip'] = [] + + excel_info['warning_doubled_groups_skip'].append(group_name) + result['doubled_groups'].append(group_name) + + continue - gr = result[group_name] = prs.groups[group_name] + gr = result_groups[group_name] = prs.groups[group_name] gr['facultet'] = facultet gr['data_source'] = excel_url.split("/")[-1] - gr['parser_debug'] = { - "C_COUNTER": counter, + gr['debug'] = { + "counter": counter, "timeid": timeid, "excel_url": excel_url, "reader_info": reader.info(), "reader_sheet_index": reader.get_sheet_index(), "filename": filename } + excel_info["group_names_parsed"].append(group_name) print(f"Populates {len(prs.groups)} groups to result: " + " ".join(prs.groups.keys())) @@ -67,22 +132,40 @@ def process_excel_file(facultet, excel_url, counter, timeid): reader.next_sheet() print("Next sheet!") + excel_info["stat"]['parse'] = t.step() + + except Exception as e: print(f"Error while {excel_url}") print(e) traceback.print_exc() + u = uuid.uuid4() + excel_info['error'] = { + "smile": ":(", + "error_message": str(e), + "log_anchor": str(u), + "time": currt() + } + print(f"Log Anchor: {u}") faileds.append({ "ex": e, "fac": facultet, "url": excel_url }) + + result['excels'].append(excel_info) - -result = {} faileds = [] def main(): - EXCEL_LINKS = links_parser.parse_links(FACULTETS if DEBUG_ONE_FAC is None else [DEBUG_ONE_FAC]) + t = utils.StepTimeCounter() + try: + os.mkdir(DIRNAME) + print(f"Directory '{DIRNAME}' created successfully.") + except Exception: + print(f"Directory '{DIRNAME}' already exists.") + print("main(); parse links starting...") + EXCEL_LINKS = links_parser.parse_links(FACULTETS if DEBUG_ONE_FAC is None else [DEBUG_ONE_FAC]) counter = 0 timeid = str(round(time.time())) for facultet in EXCEL_LINKS.keys(): @@ -99,13 +182,24 @@ def main(): print("Excel file processing done!") print("Saving result.json") + + result['stat']['total_parsing_time'] = t.step() + json.dump(result, open('result.json', 'w'), indent=2, ensure_ascii=False) print("Saved to result.json") print("Faileds:") print(faileds) + # Delete a non-empty directory and its contents + try: + shutil.rmtree(DIRNAME) + print(f"Directory '{DIRNAME}' and its contents deleted successfully.") + except Exception as e: + print(f"Error deleting directory '{DIRNAME}': {e}") + if __name__ == "__main__": + print("Start") main() print("Bye!") diff --git a/parser.py b/parser.py index 3e4acec..1b4ec59 100644 --- a/parser.py +++ b/parser.py @@ -1,7 +1,11 @@ +# Copyright Stanislav Mironov + +PAIR_NUMS = [ + "1-2", "3-4", "5-6", "7-8", "9-10", "11-12", "13-14", "15-16" +] + import json - -import xlrd - +import uuid import aigenerated from coord import Coord, Merged from translations import ExcelSheetReader @@ -13,13 +17,13 @@ def pprint(*args, **kwargs): if LOGGING: print(*args, **kwargs) - class Parser: def __init__(self, reader: ExcelSheetReader): self.reader = reader self.groups = {} self.teachers = set() self.places = set() + self.parser_error = None pprint("Parser created for '{0}'".format(reader.info())) def parse(self): @@ -27,6 +31,7 @@ class Parser: if monday is None: print(" -- Failed parse! -- ") print("ПОНЕДЕЛЬНИК НЕ НАЙДЕН!") + self.parser_error = "'ПОНЕДЕЛЬНИК' не найден в таблице." return head_rx = monday.row - 1 # выше первого понидельника @@ -59,7 +64,7 @@ class Parser: # location location = merged.high.shift(down=1).cell(self.reader).value - return {"loc": str(location), "leader": str(speaker), "name": str(merged.cell(self.reader).value)} + return {"loc": str(location).strip(), "leader": str(speaker).strip(), "name": str(merged.cell(self.reader).value).strip()} def process_group(self, group, monday): """ @@ -71,13 +76,13 @@ class Parser: pprint(group_name) row = group['position'][0] + 1 # counter for while, +1 for shift down; также номер строки в таблице (вроде с нуля) weeknum = 1 # номер недели, щёлкнет +1 при каком-то условии. + previous_pair = None while row < self.reader.get_row_count(): # maybe условие чтобы не уйти ниже чем есть строк pos = Coord(row, group['position'][1]) # текущая позиция, верхний левый угол (=low) pos_right = pos.shift(right=3) pair_pos = pos.replace(col=5) weekday_pos = pos.replace(col=4) merged = self.reader.get_merged_coord(pos) - right_cell = pos_right.cell(self.reader) merged_cell = merged.cell(self.reader) cv = merged_cell.value # В конце (12 пара:>) название группы, можно использовать как якорь @@ -89,6 +94,16 @@ class Parser: weekday = utils.unspace(weekday_mr.cell(self.reader).value) pair_mr = self.reader.get_merged_coord(pair_pos) pair = utils.unspace(pair_mr.cell(self.reader).value) + fuck_empty_pair_in_excel = pair == "" + previous_dump = previous_pair + if fuck_empty_pair_in_excel: + if previous_pair is None or previous_pair == "": + pair = f"EMPTY_IN_EXCEL_{uuid.uuid4()}" + else: + pair = utils.next_element(PAIR_NUMS, previous_pair) + + if pair != "": + previous_pair = pair skip = 0 if weekday == "": @@ -99,26 +114,25 @@ class Parser: row += 1 else: break + if not skip: next = 3 # на сколько пыгнуть для следующего шага? - is_empty_lesson = right_cell.is_empty() and merged_cell.is_empty() - dispname = "" + is_empty_lesson = len(utils.parse_all_dirt(self.reader, pos, 4, 3)) == 0 # если в поле не найдено ничего.. parsed_discipline_name = None parsed_location = None parsed_leader = None - is_2pair = False + pairs = 1 is_solid = pos_right in merged parsed_uncotigorized = [] is_wide_maybe_potokoviy = merged.width() > 4 # потоковая ли лекция (занимает несколько групп.) - if is_empty_lesson: - dispname = "" if not is_empty_lesson: - may_prepod = merged.low.shift(down=2) - if utils.has_no_bottom_border(self.reader, may_prepod): - next = 6 - is_2pair = True + cur = merged.low.shift(down=2) + while utils.has_no_bottom_border(self.reader, cur): + next += 3 + pairs += 1 + cur = cur.shift(down=3) if is_wide_maybe_potokoviy: ret = self.parse_potokoviy(merged) @@ -127,45 +141,37 @@ class Parser: parsed_discipline_name = ret['name'] parsed_uncotigorized = list(utils.parse_all_dirt(self.reader, merged.low, merged.width(), next)) - else: if (is_solid): parsed_discipline_name = cv - dispname = cv - dispname += (" SOLD" if is_solid else " SPLIT") - dispname += (" [ДВУПАРНЫЙ]" if is_2pair else "") - parsed_uncotigorized = list(utils.parse_all_dirt(self.reader, merged.low, 4, next)) - - if parsed_leader: dispname += f" [{parsed_leader}]" - if parsed_location: dispname += f" [{parsed_location}]" - dispname = dispname.replace("\n", "\\n") - pprint(f"[{group_name}] row={row}; {pos} {pos_right} {pair} {weekday}: {'[ПОТОКОВЫЙ] ' if is_wide_maybe_potokoviy else ''}{dispname} {parsed_uncotigorized}") - # пытаемся из некотегорезированных данных выцепить место и лидера (препода) prepods = set() - if parsed_leader is not None: prepods.add(aigenerated.extract_last_name(parsed_leader)) + if parsed_leader is not None: prepods.add(parsed_leader.strip()) locations = set() - if parsed_location is not None: locations.add(parsed_location.replace(" ", "").replace("-", "")) + if parsed_location is not None: locations.add(parsed_location.strip().replace(" ", "")) for x in list(parsed_uncotigorized): if aigenerated.is_surname_string(x): - prepods.add(aigenerated.extract_last_name(x)) + prepods.add(x.strip()) if aigenerated.is_room_number(x): - locations.add(x.replace(" ", "").replace("-", "") if x is not None else None) + locations.add(x.strip().replace(" ", "") if x is not None else None) - # оставшееся в дисциплину (костыль) + # попытка починить пустую дисциплину if parsed_discipline_name is None: - parsed_discipline_name = " ".join(parsed_uncotigorized) + l = utils.remove_from_list(list(parsed_uncotigorized), [parsed_leader, parsed_location]) + parsed_discipline_name = " ".join(l) - prepods.discard(None) - prepods.discard("") - locations.discard(None) - locations.discard("") + # чистим сеты от мусора + utils.discards_list(prepods, nones=True, emptystrings=True) + utils.discards_list(locations, nones=True, emptystrings=True) + utils.discards_list(parsed_uncotigorized, nones=True, emptystrings=True) + + # если не пустой предмет то записываем его if not is_empty_lesson: slots = group['slots'] w = weekday + ("_1" if weeknum == 1 else "_2") @@ -174,22 +180,30 @@ class Parser: today = slots[w] today[pair] = { - "pos": str(pos), - "discipline": parsed_discipline_name, + "excel_pos": str(pos), + "discipline_name": parsed_discipline_name.strip(), "locations": list(locations), "leads": list(prepods), "is_solid": is_solid, - "is_2pair": is_2pair, + "time_coeff": pairs, "is_flow": is_wide_maybe_potokoviy, + "lefttopmerged": { + "width": merged.width(), + "height": merged.height(), + "excel_range": utils.merged_humanize(merged.as_numbers()) + }, "raw": parsed_uncotigorized, - "weeday": utils.weekday_to_num(weekday), + "weekday": utils.weekday_to_num(weekday), "weeknum": weeknum } + if fuck_empty_pair_in_excel: + today[pair]['pair_num_empty'] = { + "prev": previous_dump, + "restoted": pair != "", + "pair": pair + } - self.teachers.add(aigenerated.extract_last_name(parsed_leader)) - - # INCREMENT на next и конец цикла. row += next diff --git a/translations.py b/translations.py index f92e760..c61b79d 100644 --- a/translations.py +++ b/translations.py @@ -267,12 +267,11 @@ def create_reader(file_path, **kwargs) -> ExcelSheetReader: Создает и возвращает подходящий экземпляр ридера в зависимости от расширения файла. """ if file_path.lower().endswith('.xlsx'): - print("Используется движок openpyxl для .xlsx") return OpenpyxlSheetReader(file_path, **kwargs) elif file_path.lower().endswith('.xls'): - print("Используется движок xlrd для .xls") return XlrdSheetReader(file_path, **kwargs) else: - raise ValueError("Неподдерживаемый формат файла. Используйте .xls или .xlsx") \ No newline at end of file + raise ValueError("Неподдерживаемый формат файла. Используйте .xls или .xlsx") + diff --git a/utils.py b/utils.py index 5b683bb..7fc2cb2 100644 --- a/utils.py +++ b/utils.py @@ -1,14 +1,58 @@ -# gemini generated +# Copyright Stanislav Mironov + +import time import xlrd from coord import Coord, Merged from translations import ExcelSheetReader +import re + + +class StepTimeCounter: + def __init__(self): + self.time: float = -1.0 + self.createtime = time.time() + self.setnow() + + def setnow(self): + self.time = time.time() + + def step(self, no_set_now=False): + left = time.time() - self.time + if not no_set_now: + self.setnow() + return left + + def from_create(self): + left = time.time() - self.createtime + return left EMPTY_CTYPES = [xlrd.XL_CELL_EMPTY, xlrd.XL_CELL_BLANK] +def discards_list(trg, nones=True, emptystrings=True): + if nones: remove_from_list(trg, [None]) + if emptystrings: remove_from_list(trg, [""]) + def has_no_bottom_border(reader: "ExcelSheetReader", coord): return reader.get_border_style(coord, 'bottom') == 0 and reader.get_border_style(coord.shift(down=1), 'top') == 0 +def find_element_index(my_list, element): + if element in my_list: + return my_list.index(element) + else: + return -1 + +def next_element(arr, el): + index = find_element_index(arr, el) + return arr[index + 1] + +def remove_from_list(l: list, todel: list): + for x in todel: + if x in l: + l.remove(x) + + return l + def parse_all_dirt(reader: "ExcelSheetReader", min_pos, right, down): RET = set() @@ -17,17 +61,16 @@ def parse_all_dirt(reader: "ExcelSheetReader", min_pos, right, down): col = min_pos.col while col < min_pos.col + right: #print(excel_coordinate(row, col)) - value = str(reader.get_cell_value(row, col)) - if value is not None and len(value) > 0: + cv = reader.get_cell_value(row, col) + value = str(cv).strip() + if cv is not None and len(value) > 0: RET.add(value) col += 1 row += 1 return RET -import re - -# GEMINI +# GEMINI GENERATED def normalize_name(raw_name): """ Приводит разнородные записи ФИО к единому структурированному виду.