Вроде бы как работает. Должна брать последний id из монго, идти на сайт и парсиить мангу пока не наткнеться на этот id. потом собирать все в файл, а потом пушить в базу.

This commit is contained in:
zein
2025-11-02 23:33:31 +03:00
commit 960db31f1f
5 changed files with 298 additions and 0 deletions

41
HBD.py Normal file
View File

@@ -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' отсутствует")

53
Manga_import.py Normal file
View File

@@ -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("Импорт завершен!")

112
Serch_H.py Normal file
View File

@@ -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

48
full_img_manga.py Normal file
View File

@@ -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

44
test.py Normal file
View File

@@ -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("=== Импорт завершен ===")