Вроде бы как работает. Должна брать последний id из монго, идти на сайт и парсиить мангу пока не наткнеться на этот id. потом собирать все в файл, а потом пушить в базу.
This commit is contained in:
41
HBD.py
Normal file
41
HBD.py
Normal 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
53
Manga_import.py
Normal 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
112
Serch_H.py
Normal 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
48
full_img_manga.py
Normal 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
44
test.py
Normal 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("=== Импорт завершен ===")
|
||||||
Reference in New Issue
Block a user