Files
anitube-simple-notification/src/scraper.py
T
2023-07-16 14:26:55 +03:00

75 lines
3.4 KiB
Python

##########################################################################
# Copyright (C) 2022-2023 Kostiantyn Klochko <kklochko@protonmail.com> #
# #
# This file is part of Anitube Simple Notification. #
# #
# Anitube Simple Notification is free software: you can redistribute #
# it and/or modify it under the terms of the GNU General Public #
# License as published by the Free Software Foundation, either version #
# 3 of the License, or (at your option) any later version. #
# #
# Anitube Simple Notification is distributed in the hope that it will #
# be useful, but WITHOUT ANY WARRANTY; without even the implied #
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See #
# the GNU General Public License for more details. #
# #
# You should have received a copy of the GNU General Public License #
# along with Anitube Simple Notification. If not, see #
# <https://www.gnu.org/licenses/>. #
##########################################################################
"""
This module has all for simplify work with scraping.
"""
import requests
from bs4 import BeautifulSoup
from rich.console import Console
from rich.progress import track
import os
class Scraper:
"""The handler of web connection."""
def __init__(self, HEADERS, POSTER_PATH="posters"):
"""Initialising the connection information."""
self.HEADERS, self.POSTER_PATH = HEADERS, POSTER_PATH
self.mkdir(self.POSTER_PATH)
def mkdir(self, path):
if not os.path.isdir(path):
os.mkdir(path)
def file_exist(self, path):
if os.path.isfile(path):
return True
return False
def get_anime(self, url, GETPOSTER = False):
"""
Return None if response is not 200.
Otherwise, return [url, title, status].
"""
response = requests.get(url, headers=self.HEADERS)
if response.status_code != 200:
return None
soup = BeautifulSoup(response.content, 'html.parser')
data = soup.find('div', class_='rcol', style = 'width:701px; padding:0 0 0 6px;')
# Getting Title
title = data.find('h2').get_text(strip=True)
# Getting Status
str_find = "\nСерій: "
str_current = data.get_text()
str_current = str_current[str_current.find(str_find)+len(str_find):]
status = str_current[:str_current.find('\n')]
# Poster
poster_url = "https://anitube.in.ua" + soup.find('span', class_="story_post").find('img').get('src')
poster_path = f"{self.POSTER_PATH}/{poster_url.split('/')[-1]}"
if GETPOSTER and not self.file_exist(poster_path):
console = Console()
with console.status("[yellow]Downloading...[/]"):
img = requests.get(poster_url)
with open(poster_path,'wb') as file:
file.write(img.content)
console.print(f"[green][DONWLOADED][/] The poster for \"{title}\"")
return [url, title, status, poster_path]