Загрузка данных


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)