Вроде бы как работает. Должна брать последний 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