1. Введение
В последнее время я не могу слушать много музыки Netease. Мне довелось увидеть много туториалов. Я проследил и изучил их, и я собрал полную коллекцию. Я хотел ее оптимизировать, но обнаружил, что проблема в том, все еще немного сложно.
Основная ссылка этой статьиPython пишет версию NetEase Cloud Music Crawler с графическим интерфейсомПосле переписывания, если вам интересно, вы можете взглянуть на графический интерфейс статьи, чтобы узнать больше~
2. Python + краулер
Сначала поговорим о подготовке:
- Python: требуется основа базового синтаксиса Python
- запросы: специализированный для обработки запросов,Китайская версия запрашивает учебный документ библиотеки
- lxml: На самом деле, вы можете использовать библиотеку регулярных выражений re, которая поставляется с pythonth, но для того, чтобы начать работу проще, используйтеlxmlEtree в расположении данных веб-страницы и сканировании.
- Re: обработка регулярных выражений Python
- json: библиотека обработки json для python
Если вы не понимаете вышеприведенную библиотеку, вы можете прочитать мою предыдущую статью«Введение в практику обхода Python»
Затем, скажем, теперь мы знаем, что ссылка для скачивания выглядит так:
http://music.163.com/song/media/outer/url?id='
idЭто идентификатор песни!
Итак, теперь основная задача нашего краулера найти этот id.Конечно, для лучшей сохранности нам нужно найти еще и название этой песни!
Теперь пришло время найти ссылку на сайт, который нам нужен гусеничный! Я проанализировал его, и это, вероятно, следующие три:
#歌曲清单
music_list = 'https://music.163.com/#/playlist?id=2412826586'
#歌手排行榜
artist_list = 'https://music.163.com/#/artist?id=8325'
#搜索列表
search_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹'
Если вы уже просто хотите скачать песню, например Jingru - Courage:https://music.163.com/#/song?id=254485, то вы можете открыть его прямо в браузереhttp://music.163.com/song/media/outer/url?id=254485Все, не надо гадов!
Хорошо! Я чувствую, что с основными моментами все закончено.Извлечение и парсинг заключается в использовании lxml.Если вы не понимаете, просто прочитайте мою предыдущую статью.«Введение в практику обхода Python»
3. Скачать текст
Если вы хотите скачать текст, это также очень просто.Через интерфейс вы можете получить идентификатор песни:
url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
Возвращенные данные JSON выглядят так:
{
sgc: true,
sfy: false,
qfy: false,
lrc:
{
version: 7,
lyric: "[00:39.070]开了窗 等待天亮\n[00:46.160]看这城市 悄悄的 熄了光\n[00:51.850]听风的方向\n[00:55.090]这一刻 是否和我一样\n[00:58.730]孤单的飞翔\n[01:02.300]模糊了眼眶\n[01:07.760]广播里 那首歌曲\n[01:14.830]重复当时 那条街那个你\n[01:20.410]相同的桌椅\n[01:23.740]不用言语 就会有默契\n[01:27.470]这份亲密\n[01:30.560]那么熟悉\n[01:33.850]在爱里 等着你\n[01:37.480]被你疼惜 有种暖意\n[01:41.090]在梦里 全是你\n[01:43.920]不要再迟疑 把我抱紧"
},
klyric:
{
version: 0,
lyric: null
},
tlyric:
{
version: 0,
lyric: null
},
code: 200
}
Больше нечего сказать!
4. Ямный и продвинутый
На первый взгляд это очень просто, но следует отметить, что данные, возвращаемые NetEase, динамически загружаются js, то есть данные веб-страницы, полученные сканером, и содержимое и структура DOM, полученные браузером, отличаются!
-
яма Среди них контент, возвращаемый сканером списка поиска, вообще не может получить идентификатор песни! ! !
-
решать Есть и решения!
- браузер моделирования Python Используя браузер без интерфейса selenium + phantomjs, комбинация этих двух фактически работает с браузером напрямую, и вы можете получить данные страницы после рендеринга JavaScript.
недостаток:
Поскольку это браузер без интерфейса, эффективность этого решения крайне низкая, и его не рекомендуется использовать для масштабного сканирования.
Для асинхронных запросов и данных, не существующих в исходном коде, данные не могут быть захвачены одновременно.
- 搜索的歌曲变成歌单
比如想下载全部的某一歌手的全部音乐,用手机云音乐搜索,然后全部保存到新建一个歌单,这样就可以啦!
- Передовой Если вы хотите узнать больше о процессе шифрования и дешифрования NetEase Cloud Music js, вы можете взглянуть на этоКак сканер Python получает URL-адрес и содержимое веб-страницы, сгенерированные JS? - Ответ прохожего А - Зная
Суммировать
Используя python, это должно быть просто, я думаю, что сложных вещей нужно делать как можно меньше, и вы можете использовать трюки, как можете, поэтому в этой статье не используется практика selenium + phantomjs, если вы хотите узнать большеselenium+phantomjsДля содержания вы можете обратиться к ссылке для цитирования в конце статьи.
Примечание. Эта статья предназначена только для технического обмена, пожалуйста, не используйте ее в коммерческих целях~ Я не несу ответственности за любые нарушения.
весь код
Еще очень простые 100 строк кода! ! !
GitHub: WebCrawlerExample/163_NeteaseMusic.py at master · iHTCboy/WebCrawlerExample
import os
import re
import json
import requests
from lxml import etree
def download_songs(url=None):
if url is None:
url = 'https://music.163.com/#/playlist?id=2384642500'
url = url.replace('/#', '').replace('https', 'http') # 对字符串进行去空格和转协议处理
# 网易云音乐外链url接口:http://music.163.com/song/media/outer/url?id=xxxx
out_link = 'http://music.163.com/song/media/outer/url?id='
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
}
# 请求页面的源码
res = requests.get(url=url, headers=headers).text
tree = etree.HTML(res)
# 音乐列表
song_list = tree.xpath('//ul[@class="f-hide"]/li/a')
# 如果是歌手页面
artist_name_tree = tree.xpath('//h2[@id="artist-name"]/text()')
artist_name = str(artist_name_tree[0]) if artist_name_tree else None
# 如果是歌单页面:
#song_list_tree = tree.xpath('//*[@id="m-playlist"]/div[1]/div/div/div[2]/div[2]/div/div[1]/table/tbody')
song_list_name_tree = tree.xpath('//h2[contains(@class,"f-ff2")]/text()')
song_list_name = str(song_list_name_tree[0]) if song_list_name_tree else None
# 设置音乐下载的文件夹为歌手名字或歌单名
folder = './' + artist_name if artist_name else './' + song_list_name
if not os.path.exists(folder):
os.mkdir(folder)
for i, s in enumerate(song_list):
href = str(s.xpath('./@href')[0])
song_id = href.split('=')[-1]
src = out_link + song_id # 拼接获取音乐真实的src资源值
title = str(s.xpath('./text()')[0]) # 音乐的名字
filename = title + '.mp3'
filepath = folder + '/' + filename
print('开始下载第{}首音乐:{}\n'.format(i + 1, filename))
try: # 下载音乐
#下载歌词
#download_lyric(title, song_id)
data = requests.get(src).content # 音乐的二进制数据
with open(filepath, 'wb') as f:
f.write(data)
except Exception as e:
print(e)
print('{}首全部歌曲已经下载完毕!'.format(len(song_list)))
def download_lyric(song_name, song_id):
url = 'http://music.163.com/api/song/lyric?id={}&lv=-1&kv=-1&tv=-1'.format(song_id)
# 请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'Referer': 'https://music.163.com/',
'Host': 'music.163.com'
# 'Origin': 'https://music.163.com'
}
# 请求页面的源码
res = requests.get(url=url, headers=headers).text
json_obj = json.loads(res)
lyric = json_obj['lrc']['lyric']
reg = re.compile(r'\[.*\]')
lrc_text = re.sub(reg, '', lyric).strip()
print(song_name, lrc_text)
if __name__ == '__main__':
#music_list = 'https://music.163.com/#/playlist?id=2384642500' #歌曲清单
music_list = 'https://music.163.com/#/artist?id=8325' #歌手排行榜
# music_list = 'https://music.163.com/#/search/m/?order=hot&cat=全部&limit=435&offset=435&s=梁静茹' #搜索列表
download_songs(music_list)
Ссылаться на
- Python пишет версию NetEase Cloud Music Crawler с графическим интерфейсом
- Введение в практику Python Crawler | Блог iHTCboy
- Как сканер Python получает URL-адрес и содержимое веб-страницы, сгенерированные JS? - Ответ прохожего А - Зная
- Сканер Python получает тексты исполнителя облачной музыки Netease
- Лучшая практика сканера python (5) - Простое использование селена + PhantomJS
- Selenium с Python — Документация Selenium Python Bindings 2
- ariya/phantomjs: Scriptable Headless Browser
- WebCrawlerExample/163_NeteaseMusic.py at master · iHTCboy/WebCrawlerExample
- Если у вас есть какие-либо вопросы, добро пожаловать на обсуждение в разделе комментариев!
- Если есть какое-то неправильное место, добро пожаловать в руководство!
> Примечание. Эта статья была впервые опубликована в [блоге iHTCboy] (https://iHTCboy.com), при воспроизведении укажите источник.