Парсинг Топ-чартов на 'JioSaavn'
Table Of Content
- Data Science
- Используя библиотеки Python Requests, BeautifulSoup и Pandas
- 1. Установка необходимых библиотек, которые будут полезны для проекта, например requests, BeautifulSoup4, pandas.
- 2. Скачайте веб-страницу с помощью библиотеки requests.
- 3. Парсинг HTML-исходного кода с помощью библиотеки Beautiful Soup.
- 3.1 Определение функции 'Source_code' для получения исходного кода (HTML-файла) URL-адреса и создания объекта Beautiful Soup.
- 3.2 get_name для получения названия песен из чарта.
- 3.3 get_artist_name для получения имени(ей) исполнителя для песни.
- Определение функции get_artist_name для парсинга имени исполнителя.
- 3.4 get_duration для получения длительности песни.
- 3.5 get_songs_from_url_list для получения информации о требуемой песне из списка URL.
- 4. Инспектирование исходного кода HTML веб-страниц.
- Сводка
- Идеи для будущих работ
- Ссылки
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')
Сводка
В данном документе представлены идеи для будущих работ.
Идеи для будущих работ
- Расширение функционала парсера для обработки сложных структур данных.
- Разработка алгоритма для автоматического определения типа данных при парсинге.
- Создание пользовательского интерфейса для удобного взаимодействия с парсером.
- Исследование и применение методов машинного обучения для улучшения качества парсинга.
- Оптимизация производительности парсера для работы с большими объемами данных.