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)相关推荐

  1. Python爬虫抓取某音乐网站MP3(下载歌曲、存入Sqlite)

    Python爬虫抓取某音乐网站MP3(下载歌曲.存入Sqlite) 最近右胳膊受伤,打了石膏在家休息.为了实现之前的想法,就用左手打字.写代码,查资料完成了这个资源小爬虫.网页爬虫, 最主要的是协议分 ...

  2. dicom格式怎么转换_QQ音乐下载的歌曲怎么转换MP3?音频转换格式详细教程

    QQ音乐下载的歌曲怎么转换MP3?很多小伙伴们或多或少使用过QQ音乐,对比其他音乐平台,它不仅可以播放歌曲,还能随时随地下载喜欢的歌.在QQ音乐中,歌曲的格式有APE.FLAC等.那在QQ音乐上下载的 ...

  3. 酷我下载的wma音乐怎么转换为MP3格式

    wma格式是目前比较常见的一种音频格式了,是微软公司推出的一款与MP3格式齐名的音频格式,目前应用也比较多,比如我们在酷我音乐盒下载音乐就是wma格式的,还有许多音乐网站的在线试听音乐格式也是wma格 ...

  4. 资源 | Alibaba Cluster Data 开放下载:270 GB 数据揭秘你不知道的阿里巴巴数据中心...

    戳蓝字"CSDN云计算"关注我们哦! CSDN云计算授权转载自阿里系统软件技术 作者:临石 打开一篇篇 IT 技术文章,你总能够看到"大规模"."海量 ...

  5. 【各个领域公开数据集查找和下载】【定期更新】

    各个领域公开数据集查找和下载 写在前面的话 网站 博客 领域 金融 交通 商业 推荐系统 医疗健康 图像数据 综合图像 场景图像 Web标签图像 人形轮廓图像 视觉文字识别图像 特定一类事物图像 材质 ...

  6. spotify歌曲下载_使用Spotify数据预测哪些“ Novidades da semana”歌曲会成为热门歌曲

    spotify歌曲下载 TL; DR (TL;DR) Spotify is my favorite digital music service and I'm very passionate abou ...

  7. 如何在Mac上将 Spotify 音乐转换为 MP3 格式?

    为了在所有设备中下载 Spotify 音乐以供离线使用,您需要录制 Spotify 音乐并将其转换为普通 MP3.NoteBurner Spotify Music Converter可以录制 Spot ...

  8. 手把手教你入侵网站修改数据_手把手教你使用Python抓取QQ音乐数据(第四弹)...

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

  9. 手把手教你使用Python抓取QQ音乐数据!

    [一.项目目标] 通过手把手教你使用Python抓取QQ音乐数据(第一弹)我们实现了获取 QQ 音乐指定歌手单曲排行指定页数的歌曲的歌名.专辑名.播放链接. 通过手把手教你使用Python抓取QQ音乐 ...

最新文章

  1. Java面向对象编程思想
  2. There is no database available的错误消息
  3. 对象拷贝的工具类DeepBeanUtils
  4. un3.0服务器文档,unturned3.0服务器指令是什么?
  5. lamp源码三层结构
  6. 三维曲面图像绘制(光照控制)
  7. 修改窗口的风格ModifyStyle
  8. python3-曲线拟合(polyfit/polyval)
  9. Flutter报setState() or markNeedsBuild() called during build.错误解决办法
  10. u-boot与linux下网卡MAC地址的更改
  11. 应用程序-特定权限设置_在您的应用程序中管理付款:设置网站-代码
  12. 数据导入与预处理实验一---KETTLE数据处理
  13. 王道数据结构线性表:有读者认为直接去掉p结点会造成断链?
  14. Linux 触摸屏 笔记本,Linux 5.2应该可以解决许多AMD Ryzen笔记本电脑触摸屏/触摸板无法工作的问题...
  15. UI设计要学习哪些软件
  16. 如何找出zeppelin的登入帳號密碼?
  17. 深度学习系列笔记之统计基础
  18. 曾遭作者“删库”的faker.js,现被社区接手;Apache Ambari 项目被弃用;FFmpeg 5.0 发布 | 开源日报
  19. loop和goto用法
  20. 计算机无法开机 警报器在响,按下开机键以后报警器一直滴滴滴的响,而且电脑开启不了,响了一段时...

热门文章

  1. java web 开发是做什么用的?
  2. 无监督学习问题可以分为两类问题
  3. 【无线通信协议笔记】蓝牙篇:BLE HID协议
  4. 怎样计算系统的可靠性和可用性是几个9?
  5. phpstudy构建数据库
  6. 基于AD9850的多功能信号发生器
  7. linux命令忽略大小写zip,Linux基础命令---unzip
  8. 什么是数字证书、公钥私钥
  9. 面向对象程序有哪些优点呢?
  10. 1.GoAhead运行