Загрузка данных
import requests
from flask import Flask, render_template, redirect, request
from bs4 import BeautifulSoup
from termcolor import cprint
main_block_HTML = 'w-full flex flex-col gap-3 pt-3'
music_name_HTML = "ptxt-track"
music_autor_HTML = "ptxt-artist truncate text-ellipsis overflow-hidden"
genres_HTML = "ptxt-genre truncate text-ellipsis !hidden md:!flex pr-12 overflow-hidden col-span-3"
album_HTML = "!hidden md:!flex ptxt-album col-span-2 truncate text-ellipsis overflow-hidden pr-8"
app = Flask(__name__)
URL = "https://freemusicarchive.org/search"
r = requests.get(URL)
@app.route("/", methods=['POST', 'GET'])
def main():
list_music=[]
if request.method == 'POST':
music_name = request.form['music_name']
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"}
num_pages = 1
search_url = f"{URL}?adv=1&quicksearch={music_name}&page={num_pages}"
#! скачиваем и получаем ВСЮ HTML страницу сайта
for num_page in range(200):
response = requests.get(search_url, headers=headers)
cprint(f"Номер страницы {num_page}", "light_green", "on_black")
#! если сайт нас не заблокировал меня, то идем дальше
if response.status_code == 200:
#! подключаем парсер (который html страницу скачивает и сканирует)
soup = BeautifulSoup(response.text, 'html.parser')
#! когда скачали html - то мы ищем в нем главный блок с музыкой
track_blocks = soup.find_all('div', class_="flex flex-col gap-3 pt-3")
names = soup.find_all(class_=music_name_HTML) #! names = ["skillet", "fwefwe","efwfwefw"]
print("names из BS4", names)
artists = soup.find_all(class_=music_autor_HTML)
genres = soup.find_all(class_=genres_HTML)
albums = soup.find_all(class_=album_HTML)
no_results = soup.find('h2', class_="font-[500] text-4xl text-orange")
if no_results:
print("Таких песен нет")
break
#* когда мы достали нашу страницу(скачали), достали нужный главный блок и вытащили нужные данные (название песни, имя автора, жанр, альбом) то мы должны КАЖДЫЙ песню сохранить ОТДЕЛЬНО
#! если у нас на странице 10 песен - то мы скачиваем все 10 песен
else:
# Если блока нет — скачиваем все списки элементов
names = soup.find_all(class_=music_name_HTML)
artists = soup.find_all(class_=music_autor_HTML)
genres = soup.find_all(class_=genres_HTML)
albums = soup.find_all(class_=album_HTML)
# Просто перебираем элементы по порядку через обычный индекс i
for i in range(len(names)):
track_data = {
"name": names[i].text.strip(),
"artist": artists[i].text.strip(),
"genre": genres[i].text.strip(),
"album": albums[i].text.strip()
}
# Добавляем по одной песне в наш общий список
list_music.append(track_data)
cprint(f"Страница скачена", "cyan", "on_black")
else:
cprint("Тебя сайт выплюнул, слишком много качаешь песенок", "red", "on_black")
else:
cprint("Та-да!", "yellow", "on_red")
return render_template("index.html",music_list=list_music)
if __name__ == "__main__":
app.run(debug=True)