мне нужно с этой странички https://www.beatport.com/label/83/54171/tracks?page=1&per_page=150 с page=8 до page=1 название каждого трека в .txt, чтобы вышло 1100 строк с названием каждого трека, нужно чтобы они шли от старых к новым Исполнитель - Название трека
import requests from bs4 import BeautifulSoup import time import json base_url = 'https://www.beatport.com/label/83/54171/tracks' headers = { 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 YaBrowser/25.4.0.0 Safari/537.36', 'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "YaBrowser";v="25.4", "Yowser";v="2.5"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } tracks_per_page = 150 output_filename = "tracks_and_artists_reversed.txt" pause_between_pages = 1.5 def get_html_for_page(page_number): params = { 'page': str(page_number), 'per_page': str(tracks_per_page) } print(f"Загружаю страницу {page_number}...") try: response = requests.get(base_url, headers=headers, params=params, timeout=20) response.raise_for_status() print(f"Страница {page_number} загружена.") return response.text except requests.exceptions.RequestException as e: print(f"Не получилось загрузить страницу {page_number}. Ошибка: {e}") return None def find_total_pages_from_json(html_content): if not html_content: return 1 soup = BeautifulSoup(html_content, 'html.parser') script_tag = soup.find("script", {"id": "__NEXT_DATA__"}) if script_tag and script_tag.string: try: data = json.loads(script_tag.string) queries = data.get('props', {}).get('pageProps', {}).get('dehydratedState', {}).get('queries', []) for query in queries: if query.get('queryKey', [None])[0] == 'tracks' and 'page' in query.get('state', {}).get('data', {}): page_info_string = query['state']['data']['page'] total_pages = int(page_info_string.split('/')[1]) print(f"Найдено страниц (из JSON): {total_pages}") return total_pages print("Информация о страницах не найдена в JSON __NEXT_DATA__.") except (json.JSONDecodeError, KeyError, IndexError, ValueError, TypeError) as e: print(f"Ошибка при извлечении числа страниц из JSON: {e}") return 1 def extract_tracks_from_json(html_content): if not html_content: return [] soup = BeautifulSoup(html_content, 'html.parser') tracks_on_this_page = [] script_tag = soup.find("script", {"id": "__NEXT_DATA__"}) if script_tag and script_tag.string: try: data = json.loads(script_tag.string) queries = data.get('props', {}).get('pageProps', {}).get('dehydratedState', {}).get('queries', []) tracks_json_list = None for query in queries: if query.get('queryKey', [None])[0] == 'tracks' and 'results' in query.get('state', {}).get('data', {}): tracks_json_list = query['state']['data']['results'] break if tracks_json_list: for track_data in tracks_json_list: track_name = track_data.get('name', "Название?") mix_name = track_data.get('mix_name', "") full_track_name = f"{track_name} {mix_name}".strip() artists_data = track_data.get('artists', []) artist_names = [artist.get('name', "Артист?") for artist in artists_data] artists_string = ", ".join(artist_names) if artist_names else "Авторы?" tracks_on_this_page.append(f"{full_track_name} - {artists_string}") if tracks_on_this_page: print(f" Извлечено треков из JSON: {len(tracks_on_this_page)}") return tracks_on_this_page else: print(" Список треков 'results' не найден в JSON __NEXT_DATA__.") except (json.JSONDecodeError, KeyError, IndexError, TypeError) as e: print(f" Ошибка при извлечении треков из JSON: {e}") print(" Не удалось извлечь треки из JSON.") return [] all_scraped_tracks = [] html_first_page = get_html_for_page(1) if html_first_page: total_pages = find_total_pages_from_json(html_first_page) print("Собираю треки с первой страницы...") tracks_page_1 = extract_tracks_from_json(html_first_page) all_scraped_tracks.extend(tracks_page_1) if total_pages > 1: for page_number in range(2, total_pages + 1): print(f"--- Перехожу на страницу {page_number} из {total_pages} ---") time.sleep(pause_between_pages) html_current_page = get_html_for_page(page_number) if html_current_page: tracks_from_this_page = extract_tracks_from_json(html_current_page) if not tracks_from_this_page: print(f" На странице {page_number} треки не найдены. Возможно, это последняя реальная страница с данными.") all_scraped_tracks.extend(tracks_from_this_page) else: print(f"Пропускаю страницу {page_number}, не удалось загрузить.") else: print("Не удалось загрузить первую страницу. Завершение работы.") if all_scraped_tracks: print(f"\nВсего собрано уникальных строк: {len(all_scraped_tracks)}") print("Переворачиваю список...") all_scraped_tracks.reverse() else: print("\nТреки не были собраны.") print(f"Записываю результат в файл '{output_filename}'...") with open(output_filename, "w", encoding="utf-8") as f: if not all_scraped_tracks: f.write("Увы, треков найти не удалось.\n") else: for track_info_line in all_scraped_tracks: f.write(track_info_line + "\n") print(f"Готово! Результат в файле '{output_filename}'") Python import requests from bs4 import BeautifulSoup import time import json base_url = 'https://www.beatport.com/label/83/54171/tracks' headers = { 'Upgrade-Insecure-Requests': '1', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 YaBrowser/25.4.0.0 Safari/537.36', 'sec-ch-ua': '"Chromium";v="134", "Not:A-Brand";v="24", "YaBrowser";v="25.4", "Yowser";v="2.5"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', } tracks_per_page = 150 output_filename = "tracks_and_artists_reversed.txt" pause_between_pages = 1.5 def get_html_for_page(page_number): params = { 'page': str(page_number), 'per_page': str(tracks_per_page) } print(f"Загружаю страницу {page_number}...") try: response = requests.get(base_url, headers=headers, params=params, timeout=20) response.raise_for_status() print(f"Страница {page_number} загружена.") return response.text except requests.exceptions.RequestException as e: print(f"Не получилось загрузить страницу {page_number}. Ошибка: {e}") return None def find_total_pages_from_json(html_content): if not html_content: return 1 soup = BeautifulSoup(html_content, 'html.parser') script_tag = soup.find("script", {"id": "__NEXT_DATA__"}) if script_tag and script_tag.string: try: data = json.loads(script_tag.string) queries = data.get('props', {}).get('pageProps', {}).get('dehydratedState', {}).get('queries', []) for query in queries: if query.get('queryKey', [None])[0] == 'tracks' and 'page' in query.get('state', {}).get('data', {}): page_info_string = query['state']['data']['page'] total_pages = int(page_info_string.split('/')[1]) print(f"Найдено страниц (из JSON): {total_pages}") return total_pages print("Информация о страницах не найдена в JSON __NEXT_DATA__.") except (json.JSONDecodeError, KeyError, IndexError, ValueError, TypeError) as e: print(f"Ошибка при извлечении числа страниц из JSON: {e}") return 1 def extract_tracks_from_json(html_content): if not html_content: return [] soup = BeautifulSoup(html_content, 'html.parser') tracks_on_this_page = [] script_tag = soup.find("script", {"id": "__NEXT_DATA__"}) if script_tag and script_tag.string: try: data = json.loads(script_tag.string) queries = data.get('props', {}).get('pageProps', {}).get('dehydratedState', {}).get('queries', []) tracks_json_list = None for query in queries: if query.get('queryKey', [None])[0] == 'tracks' and 'results' in query.get('state', {}).get('data', {}): tracks_json_list = query['state']['data']['results'] break if tracks_json_list: for track_data in tracks_json_list: track_name = track_data.get('name', "Название?") mix_name = track_data.get('mix_name', "") full_track_name = f"{track_name} {mix_name}".strip() artists_data = track_data.get('artists', []) artist_names = [artist.get('name', "Артист?") for artist in artists_data] artists_string = ", ".join(artist_names) if artist_names else "Авторы?" tracks_on_this_page.append(f"{full_track_name} - {artists_string}") if tracks_on_this_page: print(f" Извлечено треков из JSON: {len(tracks_on_this_page)}") return tracks_on_this_page else: print(" Список треков 'results' не найден в JSON __NEXT_DATA__.") except (json.JSONDecodeError, KeyError, IndexError, TypeError) as e: print(f" Ошибка при извлечении треков из JSON: {e}") print(" Не удалось извлечь треки из JSON.") return [] all_scraped_tracks = [] html_first_page = get_html_for_page(1) if html_first_page: total_pages = find_total_pages_from_json(html_first_page) print("Собираю треки с первой страницы...") tracks_page_1 = extract_tracks_from_json(html_first_page) all_scraped_tracks.extend(tracks_page_1) if total_pages > 1: for page_number in range(2, total_pages + 1): print(f"--- Перехожу на страницу {page_number} из {total_pages} ---") time.sleep(pause_between_pages) html_current_page = get_html_for_page(page_number) if html_current_page: tracks_from_this_page = extract_tracks_from_json(html_current_page) if not tracks_from_this_page: print(f" На странице {page_number} треки не найдены. Возможно, это последняя реальная страница с данными.") all_scraped_tracks.extend(tracks_from_this_page) else: print(f"Пропускаю страницу {page_number}, не удалось загрузить.") else: print("Не удалось загрузить первую страницу. Завершение работы.") if all_scraped_tracks: print(f"\nВсего собрано уникальных строк: {len(all_scraped_tracks)}") print("Переворачиваю список...") all_scraped_tracks.reverse() else: print("\nТреки не были собраны.") print(f"Записываю результат в файл '{output_filename}'...") with open(output_filename, "w", encoding="utf-8") as f: if not all_scraped_tracks: f.write("Увы, треков найти не удалось.\n") else: for track_info_line in all_scraped_tracks: f.write(track_info_line + "\n") print(f"Готово! Результат в файле '{output_filename}'")