Описание проекта:
Anime-parsing-Shikimori — это проект, который позволяет получать информацию о аниме с сайта Shikimori, используя API Shikimori. Проект помогает автоматически парсить данные о рейтингах, типе аниме, названиях и многом другом.
Основные особенности:
- Получение списка всех аниме.
- Получение всех данных с api (кроме image).
- В файлах есть сортированные по порядку id аниме, и в порядке
/api/animes?order=popularity&page={page}&limit=50
.
Как запустить проект:
1. Клонируйте репозиторий с помощью команды:
git clone https://github.com/GRaf-NEET/Anime-parsing-Shikimori.git
2. Установите необходимые зависимости:
pip install -r requirements.txt
3. Запустите парсер с помощью команды:
python parsing.py
Технологии и инструменты:
- Python 3
- requests
- BeautifulSoup
- Shikimori API
Ссылки:
Помощь и вопросы:
Если у вас возникли вопросы или проблемы, не стесняйтесь обратиться в раздел Issues на GitHub или задайте вопрос прямо в этом топике.
в теории этот код для того что бы сделать тоже самое но с MAL, там нужно получить доступ к API
Если кто-то сделат с MAL дайте пожалуйста.
#код будет выполнятся бесконечно пока не выйдет 15 раз подряд ошибка 404. И не придется узнавать количество страниц самому.
import requests
import pandas as pd
import json
import time
import os
# URL API MyAnimeList для поиска аниме
url_template = "https://api.myanimelist.net/v2/anime?offset={}&limit=50&fields=id,title,mean,genres,status,num_episodes,start_date,end_date"
# Ваш ACCESS_TOKEN для авторизации
access_token = "ВАШ_ACCESS_TOKEN"
# Заголовки с токеном авторизации
headers = {
"Authorization": f"Bearer {access_token}"
}
# Проверка существования и наполненности CSV файла
if os.path.exists('anime_data_mal.csv') and os.path.getsize('anime_data_mal.csv') > 0:
existing_data = pd.read_csv('anime_data_mal.csv')
anime_data = existing_data.to_dict('records')
last_offset = len(existing_data)
print(f"Продолжаем с позиции {last_offset}")
else:
anime_data = []
last_offset = 0
# Счетчик ошибок для 404
error_count = 0
max_errors = 15
# Бесконечный цикл
while error_count < max_errors:
url = url_template.format(last_offset)
try:
response = requests.get(url, headers=headers)
if response.status_code == 200:
anime_list = response.json().get('data', [])
if not anime_list: # Если нет данных, завершить цикл
print("Данные закончились.")
break
for anime_info in anime_list:
node = anime_info.get('node', {})
anime_data.append({
'id': node.get('id'),
'title': node.get('title'),
'mean_score': node.get('mean'),
'genres': [genre['name'] for genre in node.get('genres', [])],
'status': node.get('status'),
'num_episodes': node.get('num_episodes'),
'start_date': node.get('start_date'),
'end_date': node.get('end_date')
})
print(f"Записи с позиции {last_offset} успешно получены")
error_count = 0 # Сброс счетчика ошибок после успешной загрузки
elif response.status_code == 404:
error_count += 1
print(f"Ошибка 404 на позиции {last_offset}. Количество ошибок: {error_count}")
else:
print(f"Ошибка на позиции {last_offset} - статус код {response.status_code}")
except Exception as e:
print(f"Ошибка при обработке записи на позиции {last_offset}: {e}")
# Сохранение данных в CSV
if len(anime_data) > 0:
df = pd.DataFrame(anime_data)
df.to_csv('anime_data_mal.csv', index=False)
# Сохранение данных в JSON
with open('anime_data_mal.json', 'w', encoding='utf-8') as json_file:
json.dump(anime_data, json_file, ensure_ascii=False, indent=4)
# Задержка для снижения нагрузки на сервер MyAnimeList
time.sleep(1)
# Переход к следующей странице
last_offset += 50
# Проверка на количество ошибок
if error_count >= max_errors:
print(f"Превышено максимальное количество ошибок (15). Завершаем выполнение.")
break
print("Сбор данных завершен. Данные сохранены в 'anime_data_mal.csv' и 'anime_data_mal.json'")
@Graf_NEET@Librake, json с тайтлами их оценкой и т.д@Librake@Graf_NEET, их есть у меня github.com/Librake/MAL-Parsed