CoderCastrov logo
CoderCastrov
Парсер

Парсинг Топ-чартов на 'JioSaavn'

Парсинг Топ-чартов на 'JioSaavn'
просмотров
7 мин чтение
#Парсер

Data Science

Используя библиотеки Python Requests, BeautifulSoup и Pandas

JioSaavn - это индийская онлайн-сервис музыкального стриминга и цифровой дистрибьютор хинди, английской, малаяламской, бенгальской, каннадской, тамильской, телугу, бходжпури и другой региональной индийской музыки по всему миру. Здесь песни категоризированы по многим чартам на основе популярности, исполнителей, эпохи выпуска и многих других.

В этом проекте мы будем извлекать информацию из страниц/URL-адресов Топ-чартов с помощью парсинга веб-страниц: процесс извлечения и разбора данных с веб-сайтов автоматически с использованием компьютерной программы/кода.

Мы будем использовать библиотеки Python - Requests, Beautiful Soup и Pandas для парсинга данных с этой страницы.

Вот краткое описание шагов, которые мы будем следовать:

В конце проекта мы создадим файл csv, в котором будут указаны 25 лучших песен всех 7 топ-чартов в следующем формате:

Название,Имя исполнителя, Продолжительность

Туже Декха То, Лата Мангешкар Кумар Сану, 5:03

Мера Дил Бхи Китна Пагал Хай, Кумар Сану С. П. Баласубрахманиам Алка Ягник, 5:24

1. Установка необходимых библиотек, которые будут полезны для проекта, например requests, BeautifulSoup4, pandas.

Библиотека requests позволяет отправлять HTTP-запросы с использованием Python. HTTP-запрос возвращает объект Response с данными ответа (содержимое, кодировка, статус и т. д.). Поэтому нам нужно установить requests для загрузки веб-страницы. Beautiful Soup - это библиотека Python для извлечения данных из файлов HTML и XML. Поэтому нам нужно установить Beautiful Soup для разбора тегов HTML. Pandas - это библиотека Python, которая используется для анализа данных. После установки мы должны импортировать библиотеку для использования в нашей программе.

!pip install requests --upgrade --quiet
!pip install BeautifulSoup4 --upgrade --quiet
!pip install pandas --upgrade --quiet
import requests
import pandas as pd
from bs4 import BeautifulSoup

2. Скачайте веб-страницу с помощью библиотеки requests.

3. Парсинг HTML-исходного кода с помощью библиотеки Beautiful Soup.

Для извлечения информации из HTML-исходного кода с помощью программирования мы будем использовать библиотеку Beautiful Soup. Beautiful Soup вернет объект, содержащий несколько свойств и методов для извлечения информации из HTML-документов.

Поскольку нам нужно выполнить шаги 2 и 3 много раз для домашнего URL-адреса (https://www.jiosaavn.com) и затем для Top Charts, которые имеют 11 страниц, мы определим здесь следующие функции.

3.1 Source_code для получения исходного кода (HTML-файла) URL-адреса и создания объектов Beautiful Soup.

3.2 get_name для получения названия песен из чарта.

3.3 get_artist_name для получения имени(ей) исполнителя для песни.

3.4 get_duration для получения продолжительности песни.

3.5 get_songs_from_url_list для получения информации о необходимых песнях из списка URL-адресов.


3.1 Определение функции 'Source_code' для получения исходного кода (HTML-файла) URL-адреса и создания объекта Beautiful Soup.

def **Source_code**(url):
    response = requests.get(url)
    _# Чтобы убедиться, что ответ успешен_
    if response.status_code != 200:
        raise Exception('Не удалось загрузить запрошенную веб-страницу')
    url_contents = response.text
    with open('jiosavan.html','w',encoding='utf-8') as file:
        file.write(url_contents)
    with open('jiosavan.html','r',encoding = 'utf-8') as fle:
        jiosavan_source = fle.read()
    doc = BeautifulSoup(jiosavan_source,'html.parser')
    return doc

3.2 get_name для получения названия песен из чарта.

Для этого сначала нам нужно изучить HTML-код для чарта. Из кода мы видим, что каждая песня перечислена в теге "div" с классом "c-drag", а название находится в теге "a" с классом "u-color-js-gray". Вы можете проверить ниже.

Итак, сначала мы найдем все теги "div", а затем используем цикл "for" для парсинга названий первых 25 песен.

3.3 get_artist_name для получения имени(ей) исполнителя для песни.

# Определение функции get_artist_name для парсинга имени исполнителя.
def get_artist_name(doc):
    List_tag = doc.find_all('div', {'class':'c-drag'}) # парсинг всех тегов песен
    Artist_name = [] # создание пустого списка для хранения имен исполнителей
    for tag in List_tag:
        main_tag_artist = tag.find_all('p', {'class':'u-centi u-ellipsis u-color-js-gray u-margin-right@sm u-margin-right-none@lg'}) # парсинг основного тега имени исполнителя песни
        for tags in main_tag_artist: 
            artist_tag = tags.find_all('a') # парсинг всех имен исполнителей для песни
            Artist = ""
            for atag in artist_tag: # добавление всех имен исполнителей в элемент списка
                artist1 = atag.text
                Artist = Artist + artist1 +','
            Artist_name.append(Artist) # добавление исполнителей, связанных с песней, в список
            if len(Artist_name) == 25: # ограничение до 25
                break
    return(Artist_name)

3.4 get_duration для получения длительности песни.

_#Определение функции get_duration для получения длительности песни_
def **get_duration**(doc):
    import time
    List_tag = doc.find_all('div', {'class':'c-drag'}) _#для парсинга всех основных тегов песни_
    duration = [] _#мы создали пустой список для хранения длительности песен._
    for tag in List_tag:
        S_duration = tag.find_all('span', {'class':'o-snippet__action-init u-centi'}) _#для парсинга длительности песни._
        for atag in S_duration:
            S_duration = atag.text _#здесь мы получаем время в виде строки._
        duration.append(S_duration) _#добавляем длительность песни в список._
        if len(duration) ==25 : _#ограничение до 25 песен_
            break
    return(duration)

3.5 get_songs_from_url_list для получения информации о требуемой песне из списка URL.

def **get_songs_from_url_list**(lst):
    name = [] _#мы создадим пустой список для хранения связанных данных_
    Artist =[]
    duration = []
    for urls in url:
        doc = Source_code(urls)
        _#теперь мы передадим исходный код, полученный из Source_code, в функцию get_name, чтобы получить названия песен._
        Titles = get_name(doc)
        name = name + Titles
        _#теперь мы передадим исходный код, полученный из Source_code, в функцию get_artist_name, чтобы получить имена исполнителей песен._
        Artist_Title = get_artist_name(doc)
        Artist = Artist + Artist_Title
        _#теперь мы передадим исходный код, полученный из Source_code, в функцию get_duration, чтобы получить продолжительность песен._
        Time_duration = get_duration(doc)
        duration = duration + Time_duration
    _#теперь мы объединим эти 3 списка в один словарь_
    Add_dict = {}
    for i in range(len(name)):
         Add_dict[i] = {'Название' : name[i],
                        'Исполнитель' : Artist[i],
                        'Продолжительность' : duration[i]
             }  
    return(Add_dict)

Теперь нам нужно спарсить URL-адреса для топ-чартов со страницы домашней страницы, и для этого нам нужно получить исходный код этой страницы с помощью функции Source_code.

url_main = 'https://www.jiosaavn.com' _#URL-адрес домашней страницы
doc_home = Source_code(url_main)

4. Инспектирование исходного кода HTML веб-страниц.

Теперь нам нужно спарсить URL для топ-чартов из HTML-кода. Для этого нам нужно проанализировать исходный код HTML. Из исходного кода мы узнали, что «Weekly top songs» находится внутри тега div с классом «o-layout__item u-1/2@sm u-1/3@md u-1/4@lg u-1/5@xxl». Вы можете проверить это в

а другие чарты находятся внутри тега div с классом «o-layout__item u-48@md u-1/3@lg u-1/4@xxl». Вы можете проверить это в

Итак, сначала мы должны найти «href» для URL «weekly top songs», а затем мы будем использовать его в цикле для других чартов.

url = [] _#пустой список для хранения требуемых URL/href_
List_tag = doc_home.find('div',{'class':'o-layout__item u-1/2@sm u-1/3@md u-1/4@lg u-1/5@xxl'}) _#для парсинга основного тега 'weekly top songs'_
url_name = List_tag.find('a', {'class':'o-block__link'}, href = True).get('href') _#для парсинга 'href' из 'weekly top songs'_
url.append('https://www.jiosaavn.com'+url_name) _#теперь мы объединяем href с базовым URL, чтобы получить полный URL и сохранить его в списке url._
    
List_tag2 = doc_home.find_all('div', {'class':'o-layout__item u-48@md u-1/3@lg u-1/4@xxl'}) _#для парсинга основного тега других чартов._
for tag in List_tag2:
    url_name2 = tag.find('a', {'class':'o-block__link'}, href = True).get('href') _#для парсинга href других чартов._
    url.append('https://www.jiosaavn.com'+url_name2) _#добавляем URL других чартов в список url._url _#список URL, которые мы собираемся парсить_['[https://www.jiosaavn.com/featured/weekly-top-songs/8MT-LQlP35c_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fweekly-top-songs%2F8MT-LQlP35c_)',
 '[https://www.jiosaavn.com/featured/trending_today/I3kvhipIy73uCJW60TJk1Q__](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Ftrending_today%2FI3kvhipIy73uCJW60TJk1Q__)',
 '[https://www.jiosaavn.com/featured/romantic_top_40/m9Qkal5S733ufxkxMEIbIw__](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fromantic_top_40%2Fm9Qkal5S733ufxkxMEIbIw__)',
 '[https://www.jiosaavn.com/featured/hindi_90s/T64MUCqdndw_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_90s%2FT64MUCqdndw_)',
 '[https://www.jiosaavn.com/featured/hindi_70s/VSMrnr-njCk_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_70s%2FVSMrnr-njCk_)',
 '[https://www.jiosaavn.com/featured/hindi_retro/dYn-,-QcKzA_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_retro%2FdYn-%2C-QcKzA_)',
 '[https://www.jiosaavn.com/featured/hindi_chartbusters/1HiqW,xnqZTuCJW60TJk1Q__](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_chartbusters%2F1HiqW%2CxnqZTuCJW60TJk1Q__)',
 '[https://www.jiosaavn.com/featured/hindi_00s/tsJahdem34A_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_00s%2FtsJahdem34A_)',
 '[https://www.jiosaavn.com/featured/hindi_80s/fE9YxTvTDjU_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_80s%2FfE9YxTvTDjU_)',
 '[https://www.jiosaavn.com/featured/hindi_60s/TOL5Rewc8Mk_](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fhindi_60s%2FTOL5Rewc8Mk_)',
 '[https://www.jiosaavn.com/featured/delhi_hot_50/GTNWyqVzfESO0eMLZZxqsA__](https://jovian.ai/outlink?url=https%3A%2F%2Fwww.jiosaavn.com%2Ffeatured%2Fdelhi_hot_50%2FGTNWyqVzfESO0eMLZZxqsA__)']

Итак, мы спарсили 11 URL топ-чартов, чтобы спарсить песни. Теперь мы спарсим первые 25 песен (название, имя(я) исполнителя и продолжительность) из каждого топ-чарта. Поскольку нам нужно это сделать для 11 спарсенных URL, мы сначала определим остальные необходимые функции.

_#Теперь мы передадим список url_list 'url' в основную функцию get_songs_from_url_list, чтобы получить требуемый словарь с необходимыми спарсенными данными._
song_dict = get_songs_from_url_list(url)
_#Преобразуем разделы парсинга в файл csv_
_#Давайте сначала преобразуем словарь в Pandas DataFrame. DataFrame - это двумерная структура данных, похожая на двумерный массив или таблицу с рядами и столбцами. Затем, используя to_csv, мы сохраняем DataFrame в файл CSV._
data_frame = pd.DataFrame(song_dict)
data_frame = data_frame.transpose()
data_frame.to_csv('Songs.csv', index=None)
_#Взглянем на csv-файл с помощью библиотеки pandas_
_#read_csv помогает считать файл значений, разделенных запятыми (csv) в DataFrame._
pd.read_csv('Songs.csv')

Сводка

В данном документе представлены идеи для будущих работ.

Идеи для будущих работ

  1. Расширение функционала парсера для обработки сложных структур данных.
  2. Разработка алгоритма для автоматического определения типа данных при парсинге.
  3. Создание пользовательского интерфейса для удобного взаимодействия с парсером.
  4. Исследование и применение методов машинного обучения для улучшения качества парсинга.
  5. Оптимизация производительности парсера для работы с большими объемами данных.

Ссылки