查找并下载开放的音乐数据(.mp3)
1、Singer_Scraping.py
import urllib.request
import urllib.parse
from bs4 import BeautifulSoup
import re
from pypinyin import pinyin
import Music_ScrapingbaseUrl = 'https://www.9ku.com/geshou'
# 请求头
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/94.0.4606.71 Safari/537.36'}
# 歌手信息
singer_dict = []def findSinger(name):character = pinyin(name)[0][0][0].lower()try:# 请求对象,默认是get方法,key的值会暴露在地址栏上,而post方法会封装好request = urllib.request.Request(url=baseUrl + '/all-' + character + '-all.htm', headers=headers)# 发送请求获取响应response = urllib.request.urlopen(request)# 获取响应内容content = response.read().decode('utf-8')soup = BeautifulSoup(content, 'lxml')for tag in soup.find_all(name='a'):if tag.get("href") is not None:href = str(tag.get("href"))if href.startswith('/geshou/') and href.endswith('.htm'):pattern = re.compile(r'\d+') # 查找数字num = pattern.findall(href)if len(num) == 1:if tag.text.replace('\n', '').strip() is not "":singer_dict.append({'href': href, 'name': tag.text.replace('\n', '').strip()})# 由于往后需要用ajax异步加载,通过分析网页,我们可以发现接下来的人都放在 https://www.9ku.com/geshou/all-z-all/n.htm (n为整数)except urllib.error.URLError as ex:print('请求错误' + str(ex))# 开始搜索ajax_dict = singer_dict# 目标字典_dict = []n = 0ajax_content = contentwhile ajax_content != '':print("第" + str(n + 1) + "轮查找结束")for i in range(len(singer_dict)):if ajax_dict[i]['name'].lower() == name.lower():_dict = ajax_dict[i]return _dict# 开始异步搜索_dict = []n = n + 1ajax_url = baseUrl + '/all-' + character + '-all/' + str(n) + '.htm'ajax_request = urllib.request.Request(url=ajax_url, headers=headers)try:# 发送请求获取响应ajax_response = urllib.request.urlopen(ajax_request)# 获取响应内容ajax_content = ajax_response.read().decode('utf-8')ajax_soup = BeautifulSoup(ajax_content, 'lxml')for ajax_tag in ajax_soup.find_all(name='a'):if ajax_tag.get("href") is not None:ajax_href = str(ajax_tag.get("href"))if ajax_href.startswith('/geshou/') and ajax_href.endswith('.htm'):ajax_pattern = re.compile(r'\d+') # 查找数字ajax_num = ajax_pattern.findall(ajax_href)if len(ajax_num) == 1:if ajax_tag.text.replace('\n', '').strip() is not "":if ajax_tag.text.replace('\n', '').strip().lower() == name.lower():_dict = {'href': ajax_href, 'name': ajax_tag.text.replace('\n', '').strip()}return _dictexcept urllib.error.URLError as ajax_ex:print('请求错误' + str(ajax_ex))return _dictif __name__ == '__main__':singerName = str(input("请输入你要查找的歌手的名字:"))if singerName is not '':result = findSinger(singerName)if not result:print('抱歉,查无此人')else:url = 'https://www.9ku.com' + result['href']print("目标地址:"+url)musicUrlDict, music_list = Music_Scraping.findMusicUrl(url)Music_Scraping.downloadMusic(singerName, music_list)
2、Music_Scraping.py
import urllib.request
from urllib.request import urlretrieve
import urllib.parse
from bs4 import BeautifulSoup
import re
from selenium import webdriver
import time
import requests
import os
import re
import sysfile_name = '任务'def findMusicUrl(url):# 模拟用户点击事件driver = webdriver.Chrome()driver.get(url=url)driver.maximize_window()main_window = driver.current_window_handle_dict = []music_url = []# 请求头headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/94.0.4606.71 Safari/537.36'}# 请求对象,默认是get方法,key的值会暴露在地址栏上,而post方法会封装好request = urllib.request.Request(url=url, headers=headers)try:# 发送请求获取响应response = urllib.request.urlopen(request, timeout=1.0)# 获取响应内容content = response.read().decode('utf-8')soup = BeautifulSoup(content, 'lxml')# print(soup.find_all(name='a'))print("爬取音乐播放地址:")n = 0for tag in soup.find_all(name='a'):if tag.get("href") is not None:href = tag.get("href")if str(href).startswith('/play/') and str(href).endswith('.htm'):# name = BeautifulSoup(str(tag), 'html.parser').find('font')# print(tag)name = BeautifulSoup(str(tag), 'html.parser').textif name is not None:n = n + 1_name = name_href = 'https://www.9ku.com' + str(href)# _dict保存的是播放该歌曲的网页链接,不是下载地址.mp3_dict.append({'href': _href, 'name': _name})# print(_name)# link = driver.find_element_by_link_text(_name)link = driver.find_element_by_xpath('//a[@href="' + str(href) + '"]')link.click()# time.sleep(5)all_handles = driver.window_handlesdriver.switch_to.window(all_handles[1])text = driver.page_source_text = BeautifulSoup(text, 'lxml')# print(text)for _tag in _text.find_all(name='audio'):if str(_tag.get("src")).endswith('.mp3'):print(str(n)+'、'+str(_tag.get("src")))music_url.append({'url': str(_tag.get("src")), 'name': _name})breakdriver.close()# 切换到主窗口driver.switch_to.window(main_window)return _dict, music_urlexcept urllib.error.URLError as ex:print('请求错误')def downloadMusic(singer_name, music_dict):global file_namefolder_path = "./music_get_by_url/music_download/{}".format(singer_name)if not os.path.exists(folder_path):print("The selected folder does not exist, try to create it.")os.makedirs(folder_path)for m in music_dict:try:file_name = m['name']urlretrieve(m['url'], folder_path + '/' + clean_file_name(m['name']) + '.mp3', schedule)except urllib.error.HTTPError as e:print('Download failed:' + e)def clean_file_name(filename: str):# []:表示字符集,一个字符的集合,可匹配其中任意一个字符# \\:转义字符,跟在其后的字符将失去作为特殊元字符的含义,例如\\.只能匹配.,不能再匹配任意字符invalid_chars = '[\\\/:*?"<>|]'replace_char = '-'return re.sub(invalid_chars, replace_char, filename)def schedule(block_num, block_size, total_size):"""blocknum:当前已经下载的块blocksize:每次传输的块大小totalsize:网页文件总大小"""if total_size == 0:percent = 0else:percent = block_num * block_size / total_sizeif percent > 1.0:sys.stdout.write('\r>> Downloading %s %.1f%%\n' % (file_name, 100))time.sleep(0.0005)sys.stdout.flush()else:percent = percent * 100sys.stdout.write('\r>> Downloading %s %.1f%%' % (file_name, percent))time.sleep(0.0005)sys.stdout.flush()# 通过歌曲播放链接爬取失败,因为页面逻辑是跳转的
def findLoadUrl(music_dict):for m in music_dict:# 1、方法一# chromedriver的绝对路径driver_path = r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe'# 初始化一个driver,并且指定chromedriver的路径driver = webdriver.Chrome(executable_path=driver_path)# 请求网页driver.get(m['href'])time.sleep(2)driver.quit()
3、结果说明
3.1 说明
编译器为Pycharm,Python3.7。两个.py文件放在同一个目录下,运行Singer_Scraping.py即可。由于某些客观原因,我不方便在博客作太多解释,有需要的请留言,且代码严禁商用。
3.2 结果展示
3.3 目录结构(这个目录不用自己新建,有俩.py就行)
4、结语
这个自由发挥的空间大,可以做一个flash播放器、对输入进行模糊匹配等。祝大家一切顺利,以上仅供学习。科技向善,切记!
查找并下载开放的音乐数据(.mp3)相关推荐
- Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)
Python爬虫抓取某音乐网站MP3(下载歌曲.存入Sqlite) 最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分 ...
- dicom格式怎么转换_QQ音乐下载的歌曲怎么转换MP3?音频转换格式详细教程
QQ音乐下载的歌曲怎么转换MP3?很多小伙伴们或多或少使用过QQ音乐,对比其他音乐平台,它不仅可以播放歌曲,还能随时随地下载喜欢的歌.在QQ音乐中,歌曲的格式有APE.FLAC等.那在QQ音乐上下载的 ...
- 酷我下载的wma音乐怎么转换为MP3格式
wma格式是目前比较常见的一种音频格式了,是微软公司推出的一款与MP3格式齐名的音频格式,目前应用也比较多,比如我们在酷我音乐盒下载音乐就是wma格式的,还有许多音乐网站的在线试听音乐格式也是wma格 ...
- 资源 | Alibaba Cluster Data 开放下载:270 GB 数据揭秘你不知道的阿里巴巴数据中心...
戳蓝字"CSDN云计算"关注我们哦! CSDN云计算授权转载自阿里系统软件技术 作者:临石 打开一篇篇 IT 技术文章,你总能够看到"大规模"."海量 ...
- 【各个领域公开数据集查找和下载】【定期更新】
各个领域公开数据集查找和下载 写在前面的话 网站 博客 领域 金融 交通 商业 推荐系统 医疗健康 图像数据 综合图像 场景图像 Web标签图像 人形轮廓图像 视觉文字识别图像 特定一类事物图像 材质 ...
- spotify歌曲下载_使用Spotify数据预测哪些“ Novidades da semana”歌曲会成为热门歌曲
spotify歌曲下载 TL; DR (TL;DR) Spotify is my favorite digital music service and I'm very passionate abou ...
- 如何在Mac上将 Spotify 音乐转换为 MP3 格式?
为了在所有设备中下载 Spotify 音乐以供离线使用,您需要录制 Spotify 音乐并将其转换为普通 MP3.NoteBurner Spotify Music Converter可以录制 Spot ...
- 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...
[一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...
- 手把手教你使用Python抓取QQ音乐数据!
[一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...
最新文章
- Java面向对象编程思想
- There is no database available的错误消息
- 对象拷贝的工具类DeepBeanUtils
- un3.0服务器文档,unturned3.0服务器指令是什么?
- lamp源码三层结构
- 三维曲面图像绘制(光照控制)
- 修改窗口的风格ModifyStyle
- python3-曲线拟合(polyfit/polyval)
- Flutter报setState() or markNeedsBuild() called during build.错误解决办法
- u-boot与linux下网卡MAC地址的更改
- 应用程序-特定权限设置_在您的应用程序中管理付款:设置网站-代码
- 数据导入与预处理实验一---KETTLE数据处理
- 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?
- Linux 触摸屏 笔记本,Linux 5.2应该可以解决许多AMD Ryzen笔记本电脑触摸屏/触摸板无法工作的问题...
- UI设计要学习哪些软件
- 如何找出zeppelin的登入帳號密碼?
- 深度学习系列笔记之统计基础
- 曾遭作者“删库”的faker.js,现被社区接手;Apache Ambari 项目被弃用;FFmpeg 5.0 发布 | 开源日报
- loop和goto用法
- 计算机无法开机 警报器在响,按下开机键以后报警器一直滴滴滴的响,而且电脑开启不了,响了一段时...