Загрузка...

Как спарсить инфу со странички?

Тема в разделе Программирование создана пользователем Копировать 10 июн 2025 в 15:38. 72 просмотра

  1. Копировать
    Копировать Автор темы 10 июн 2025 в 15:38 :love2: TRX&ENERGY(FROM 100₽/66.000) - lzt.lol/TRX1 :love2: 16 153 3 фев 2018
    мне нужно с этой странички
    https://www.beatport.com/label/83/54171/tracks?page=1&per_page=150
    с page=8 до page=1 название каждого трека в .txt, чтобы вышло 1100 строк с названием каждого трека, нужно чтобы они шли от старых к новым
    Исполнитель - Название трека
     
  2. HISANA
    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}'")
     
Загрузка...
Top