Untitled
user_9974085
python
2 years ago
6.7 kB
4
Indexable
import requests
import bs4
import re
import os
from typing import Callable
def get_amount_of_authors_works(page_text: str) -> int:
"""
Вычисляет количество произведений автора
Параметры:
page_text (str): html-код страницы
Возвращаемое значение:
amount (int): количество произведений автора
"""
amount = int(re.search(r'Произведений: <b>(\d+)', page_text)[1])
return amount
def get_authors_books(authors_books: list) -> list:
"""
Получает все сборники автора, а также количество произведений в сборнике и ссылки на них
Параметры:
authors_books (list): html-код списка сборников автора
Возвращаемое значение:
book_list (list): список списков, состоящих из названия, количества произведений и ссылки на сборник
"""
book_list = []
for books in authors_books:
soup = bs4.BeautifulSoup(str(books), 'html.parser')
books_href = soup.a['href']
temp_list = []
for data in soup:
text_split = data.text.split()
name = " ".join(text_split[:-1])
amount = text_split[-1]
temp_list.extend([name, amount])
temp_list.append(books_href)
book_list.append(temp_list)
return book_list
def get_works_from_books(amount: int, href: str, nickname: str) -> list:
"""
Получает все произведения автора из сборника, а также ссылки на них
Параметры:
amount (int): количество произведений в сборнике
href (str): ссылка на сборник
nickname (str): ник автора
Возвращаемое значение:
works_list (list): список списков, состоящих из названия и ссылки на произведение
"""
works_list = []
session = requests.Session()
for work_num in range(0, amount, 50):
href = f'https://stihi.ru/avtor/{nickname}&s={work_num}&{href}'
all_works_page = session.get(href).text
soup = bs4.BeautifulSoup(all_works_page, 'html.parser')
all_authors_works = soup.findAll('a', class_='poemlink')
for data in all_authors_works:
works_href = data['href']
works_name = data.text
works_list.append([works_href, works_name])
return works_list
def get_text_of_each_authors_work(href: str) -> str:
"""
Получает текст произведения
Параметры:
href (str): ссылка на произведение автора
Возвращаемое значение:
text (str): текст произведения автора
"""
works_url = f'https://stihi.ru{href}'
works_page = requests.get(works_url).text
soup = bs4.BeautifulSoup(works_page, 'html.parser')
works_page_text = soup.find('div', class_='text')
text = works_page_text.text
return text
def sanitize_name_of_work(name_of_work: str) -> str:
"""
Удаляет из названия произведения символы, которые нельзя использовать для наименования файлов
Параметры:
name_of_work (str): оригинальное название произведения
Возвращаемое значение:
clear_name (str): отредактированное название произведения
"""
forbidden_characters = r'''\/:*?"<>|'''
clear_name = name_of_work.translate({ord(i): None for i in forbidden_characters})
return clear_name
def check_name(func: Callable, old_name: str, end: str) -> str:
"""
Проверяет доступность имени файла/директории, если имя недоступно, то изменяет его, добавляя (1), (2) и т.д. к имени файла
Параметры:
func (Callable): функция, проверяющая доступность имени файла/директории
old_name (str): оригинальное название файла/директории
end (str): окончание названия, в случае с файлом нужно добавить .txt, в случае с директорией остается пустым
Возвращаемое значение:
new_name (str): отредактированное название файла/директории
"""
i = 1
new_name = old_name
while func(f'{new_name}{end}'):
new_name = old_name + f' ({i})'
i += 1
return new_name
def create_files(works_list: list) -> None:
"""
Создает файлы с текстом произведений
Параметры:
works_list (list): список произведений автора
"""
for work in works_list:
works_name = sanitize_name_of_work(work[1])
works_text = get_text_of_each_authors_work(work[0])
name = check_name(os.path.isfile, works_name, '.txt')
with open(f'{name}.txt', 'w+') as file:
file.write(works_text)
def main():
author_nickname = input('Введите никнейм автора: ')
# author_nickname = 'azhou' # MOCK NICKNAME
author_page_url = f'https://stihi.ru/avtor/{author_nickname}'
author_page_text = requests.get(author_page_url).text
if 'Автор не найден' in author_page_text:
print('Такой автор не найден на сайте stihi.ru, проверьте корректность ввода')
return
amount_of_authors_works = get_amount_of_authors_works(author_page_text)
soup = bs4.BeautifulSoup(author_page_text, 'html.parser')
all_authors_books = soup.findAll('div', id='bookheader')
author_book_list = get_authors_books(all_authors_books)
dir_name = check_name(os.path.isdir, author_nickname, '')
os.mkdir(dir_name)
os.chdir(dir_name)
for book in author_book_list:
if not os.path.isdir(book[0]):
os.mkdir(book[0])
os.chdir(book[0])
amount_of_books_works = int(book[1].strip('()'))
amount_of_authors_works -= amount_of_books_works
books_href_end = '&' + book[2].split('&')[1]
list_of_works_in_book = get_works_from_books(amount_of_books_works, books_href_end, author_nickname)
create_files(list_of_works_in_book)
os.chdir('..')
list_of_works = get_works_from_books(amount_of_authors_works, '', author_nickname)
create_files(list_of_works)
if __name__ == '__main__':
main()Editor is loading...
Leave a Comment