From 960db31f1fa7ffeb2e09115b30662ab65535920c Mon Sep 17 00:00:00 2001 From: zein Date: Sun, 2 Nov 2025 23:33:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=92=D1=80=D0=BE=D0=B4=D0=B5=20=D0=B1=D1=8B?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=BA=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0?= =?UTF-8?q?=D0=B5=D1=82.=20=D0=94=D0=BE=D0=BB=D0=B6=D0=BD=D0=B0=20=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D1=82=D1=8C=20=D0=BF=D0=BE=D1=81=D0=BB=D0=B5=D0=B4?= =?UTF-8?q?=D0=BD=D0=B8=D0=B9=20id=20=D0=B8=D0=B7=20=D0=BC=D0=BE=D0=BD?= =?UTF-8?q?=D0=B3=D0=BE,=20=D0=B8=D0=B4=D1=82=D0=B8=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=81=D0=B0=D0=B9=D1=82=20=D0=B8=20=D0=BF=D0=B0=D1=80=D1=81?= =?UTF-8?q?=D0=B8=D0=B8=D1=82=D1=8C=20=D0=BC=D0=B0=D0=BD=D0=B3=D1=83=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=20=D0=BD=D0=B5=20=D0=BD=D0=B0=D1=82?= =?UTF-8?q?=D0=BA=D0=BD=D0=B5=D1=82=D1=8C=D1=81=D1=8F=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D1=8D=D1=82=D0=BE=D1=82=20id.=20=D0=BF=D0=BE=D1=82=D0=BE=D0=BC?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B1=D0=B8=D1=80=D0=B0=D1=82=D1=8C=20=D0=B2?= =?UTF-8?q?=D1=81=D0=B5=20=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB,=20=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=BE=D1=82=D0=BE=D0=BC=20=D0=BF=D1=83=D1=88=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D1=83.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HBD.py | 41 +++++++++++++++++ Manga_import.py | 53 ++++++++++++++++++++++ Serch_H.py | 112 ++++++++++++++++++++++++++++++++++++++++++++++ full_img_manga.py | 48 ++++++++++++++++++++ test.py | 44 ++++++++++++++++++ 5 files changed, 298 insertions(+) create mode 100644 HBD.py create mode 100644 Manga_import.py create mode 100644 Serch_H.py create mode 100644 full_img_manga.py create mode 100644 test.py diff --git a/HBD.py b/HBD.py new file mode 100644 index 0000000..b8f029e --- /dev/null +++ b/HBD.py @@ -0,0 +1,41 @@ +from pymongo import MongoClient + + +def connect_to_mongo(): + """Подключение к MongoDB""" + client = MongoClient("mongodb://localhost:27017/") + db = client["Manga"] + return db["Test"] + + +def find_doc_with_max_id(collection): + """ + Находит документ с максимальным значением в поле 'id' + и возвращает его 'id' и 'num' + """ + # Сортируем по убыванию и берем первый документ + doc = collection.find_one( + {"num": {"$exists": True}}, + sort=[("num", -1)], + projection={"id": 1, "num": 1, "_id": 0} + ) + + if not doc: + return None # Если нет подходящих документов + + return { + "id": doc["id"], + "num": doc.get("num") # Используем get() на случай отсутствия поля + } + + +if __name__ == "__main__": + collection = connect_to_mongo() + result = find_doc_with_max_id(collection) + + if result: + print(f"Максимальный ID: {result['id']}") + print(f"Соответствующий num: {result['num']}") + else: + print("Документы не найдены или поле 'id' отсутствует") + diff --git a/Manga_import.py b/Manga_import.py new file mode 100644 index 0000000..025a4fc --- /dev/null +++ b/Manga_import.py @@ -0,0 +1,53 @@ +from pymongo import MongoClient +from pymongo.errors import DuplicateKeyError +import full_img_manga as fim +import Serch_H + +def import_from_json(): + + # Получаем данные + hentai_data = fim.process_hentai_data(hent_data=Serch_H.get_data()) # Это должен быть словарь {название: данные} + num = 29915 + len(hentai_data) + + + # Проверяем структуру данных + if not isinstance(hentai_data, dict): + print("Ошибка: Данные должны быть в формате словаря {название: данные}") + return + + # Обрабатываем данные напрямую без process_hentai_data + for manga_title, manga_data in hentai_data.items(): + try: + # Добавляем оригинальное название + manga_data["original_title"] = manga_title + + # Проверяем наличие обязательных полей + if "id" not in manga_data: + + manga_data["id"] = num + num -= 1 + + # Добавляем в базу + collection.insert_one(manga_data) + print(f"Успешно добавлено: {manga_title} (ID: {manga_data['id']})") + + except DuplicateKeyError: + print(f"Дубликат, пропускаем: {manga_title}") + except Exception as e: + print(f"Ошибка с '{manga_title}': {str(e)}") + + +if __name__ == "__main__": + # Подключение к MongoDB + client = MongoClient("mongodb://localhost:27017/") + db = client["Manga"] + collection = db["Hentai_Manga"] + + # Создаем индексы + collection.create_index("id", unique=True) + collection.create_index("original_title") + + # Запускаем импорт + print("Начало импорта...") + import_from_json() + print("Импорт завершен!") \ No newline at end of file diff --git a/Serch_H.py b/Serch_H.py new file mode 100644 index 0000000..c940d1f --- /dev/null +++ b/Serch_H.py @@ -0,0 +1,112 @@ +from bs4 import BeautifulSoup as bs +import requests +import HBD + +link = 'https://x3.h-chan.me/manga/newest?offset=' +result = HBD.find_doc_with_max_id(HBD.connect_to_mongo()) + +max_id = '51196' +max_num = 29915 + +def form_date(date_str): + months = { + "января": "01", + "февраля": "02", + "марта": "03", + "апреля": "04", + "мая": "05", + "июня": "06", + "июля": "07", + "августа": "08", + "сентября": "09", + "октября": "10", + "ноября": "11", + "декабря": "12", + } + + day, month_str, year = date_str.split() + + # Получаем числовое значение месяца + month = months[month_str] + + # Формируем дату в нужном формате + formatted_date = f"{day}.{month}.{year}" + + return formatted_date + +def try_request(link, max_retries=50): + retries = 0 + while retries < max_retries: + try: + response = requests.get(link) + + if response.status_code == 200: + return response + else: + retries += 1 + except: + retries += 1 + +def pars(link, flag): + data_hantai = {} + + response = try_request(link) + + soup = bs(response.text, 'html.parser') + main_container = soup.find_all(class_='content_row') + + for item in main_container: + img = item.find(class_='manga_images') + img = img.find('img') + img = img['src'] if img else None + + id = img.split('/')[-2][:10] + + row_container = item.find(class_='title_link') + link_manga = 'https://hentaichan.live' + row_container.get('href') + + title = row_container.text + + tags = item.find(class_='genre') + tags = [tag.strip() for tag in tags.text.split(',')] + + + + date = item.find(class_='row4_right').find('b').text + date = form_date(date) + + manga_link = link_manga + '?cacheId=' + id + manga_link = manga_link.replace('/manga/', '/online/') + + ID = link_manga.split('/')[-1].split('-')[0] + + if int(ID) == int(max_id): + flag = True + return data_hantai, flag + + data_hantai[title] = { + 'img': img, + 'link': link_manga, + 'tags': tags, + 'date': date, + 'manga_link': manga_link, + 'original_id' : ID, + } + + + print(data_hantai) + return data_hantai, flag + +def get_data(): + data = {} + + for i in range(0, 5000, 20): + flag = False + data_hantai, flag = pars(link + str(i), flag) + + data.update(data_hantai) + + if flag is True: + return data + + diff --git a/full_img_manga.py b/full_img_manga.py new file mode 100644 index 0000000..03b9ed9 --- /dev/null +++ b/full_img_manga.py @@ -0,0 +1,48 @@ +from bs4 import BeautifulSoup as bs +import requests +import re + +#Поиск фулл страниц манги +def process_hentai_data(hent_data, max_retries=50): + + data_hantai = {} + + for name, data in hent_data.items(): + retries = 0 + images = [] + + print(f"Обрабатываем: {name}") + print(f"URL: {data['manga_link']}") + + # Запрос страницы с мангой + while retries < max_retries: + try: + response = requests.get(data['manga_link']) + if response.status_code == 200: + break + retries += 1 + except: + retries += 1 + + # Парсинг изображений + soup = bs(response.text, 'html.parser') + images = re.findall(r'https:\/\/\S+\/manganew\/\S+\.jpg', str(soup)) + + print(f"Найдено изображений: {len(images)}") + print(images) + print(data['original_id']) + + # Формируем результат + data_hantai[name] = { + 'img': data['img'], + 'link': data['link'], + 'tags': data['tags'], + 'date': data['date'], + 'manga_link': data['manga_link'], + 'imgs_manga': images, + 'len_manga': len(images), + 'original_id': data['original_id'] + } + return data_hantai + + diff --git a/test.py b/test.py new file mode 100644 index 0000000..4921706 --- /dev/null +++ b/test.py @@ -0,0 +1,44 @@ +from pymongo import MongoClient +from pymongo.errors import DuplicateKeyError +import json + + +def import_from_json(file_path: str): + # Подключение к MongoDB + client = MongoClient("mongodb://localhost:27017/") + db = client["Manga"] + collection = db["Hentai_Manga"] + + # Создаем индекс для нового поля original_id + collection.create_index("original_id", unique=True) + + with open(file_path, "r", encoding="utf-8") as file: + data = json.load(file) + + for manga_title, manga_data in data.items(): + try: + # 1. Заменяем ключи + manga_data["original_title"] = manga_title + + # Правильный способ заменить ключи: + if 'id' in manga_data: + manga_data['original_id'] = manga_data.pop('id') # Исправлено: pop() - это метод, а не индекс + if 'num' in manga_data: + manga_data['id'] = manga_data.pop('num') # Меняем num на id + + # 2. Вставка документа + collection.insert_one(manga_data) + print(f"Успешно добавлено: {manga_title} (ID: {manga_data.get('id')})") + + except DuplicateKeyError: + print(f"Дубликат, пропускаем: {manga_title} (original_id: {manga_data.get('original_id')})") + except Exception as e: + print(f"Ошибка с '{manga_title}': {type(e).__name__} - {str(e)}") + + client.close() + + +if __name__ == "__main__": + print("=== Начало импорта ===") + import_from_json("BD_hentai_1.json") + print("=== Импорт завершен ===") \ No newline at end of file