用python写的一个爬虫程序,可以实现歌曲的下载功能,大约有50000多首歌曲可以下载(本文仅供学习使用)

1、爬虫程序,请求网页,解析网页,储存所需要的信息(wangyi.py)

from urllib import request
#这里使用的是第三方urllib库来请求url
import random
import lxml
from conn_db import art_db
#这里导入自定义的数据库连接、读写的库
from multiprocessing import Pool
#引用进程池,多进程的请求urlua_list=[{'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'},{'User-Agent':'Mozilla/5.0 (Windows NT 6.2) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.12 Safari/535.11'},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7)"},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; Media Center PC 6.0; InfoPath.3; MS-RTC LM 8; Zune 4.7"},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; InfoPath.3; MS-RTC LM 8; .NET4.0C; .NET4.0E)"},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 3.5.30729; .NET CLR 3.0.30729; .NET CLR 2.0.50727; Media Center PC 6.0)"},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; Zune 4.0; Tablet PC 2.0; InfoPath.3; .NET4.0C; .NET4.0E)"},{"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0"}]
#上面是user-agent池,存放多个不同的user-agent
header = {'User-Agent':random.choice(ua_list)["User-Agent"]}
#上面是动态的随机生成user—agent,减少被识别的风险def url_request(url):requ = request.Request(url,headers=header)html = request.urlopen(requ).read().decode("utf-8")return html
#请求目标urldef get_artist(url):html = url_request(url)html = lxml.etree.HTML(html)li_art = html.xpath('//*[@id="m-artist-box"]/li')for art in li_art:art_name=art.xpath(".//a[1]/text()")[0]art_id =art.xpath(".//a[1]/@href")[0]art_db.get_art(art_name,art_id)get_art_song(art_name,art_id)
#上面部分是得到所有的歌手信息:姓名,id
#调用自定义的db模块,信息存入到数据库中
#并且调用下面的函数,得到歌曲信息
#这里主要用到xpath方法对目标页面进行解析分离出自己想要的部分def get_art_song(art_name,art_id):url = "https://music.163.com{}".format(art_id) html = url_request(url)html = lxml.etree.HTML(html)li_song = html.xpath('//ul[@class="f-hide"]/li')for song in li_song:song_name = song.xpath("./a/text()")[0]print("正在存储---{}--链接".format(song_name))song_src = song.xpath("./a/@href")[0]art_db.get_song(song_name,song_src,art_id)
#同样的将歌曲的信息,下载链接等存放如数据库中if __name__ == "__main__":
#    华语歌手列表        art_id_ch= [1001,1002,1003]       #欧美歌手列表  art_id_ou= [2001,2002,2003]#日本歌手列表  art_id_jp= [6001,6002,6003]     all_art_id = art_id_ch + art_id_ou + art_id_jp#所有分类歌手的id号       pool = Pool()#创建进程池,将对应的分类id的url传入创建进程for x in all_art_id:url_artist = "https://music.163.com/discover/artist/cat?id={}".format(x)pool.apply_async(get_artist,(url_artist,))pool.close()pool.json()

上面的是爬虫的主程序,主要利用多进程的思想,加快的爬取的效率;同时在对目标网页进行解析中可以用到很多方法,比如说:beautifulsoup、正则匹配等都可以快熟的筛选出想要的信息。

2、下面的就是自定义的数据库模块(conn_db.py),这一部分不需要独立运行,而是有主爬虫程序调用使用。

import pymysql as pmclass Mysqlpython:   def __init__(self):self.host = "127.0.0.1"self.port = 3306self.db = "song_db"self.user = "root"self.passwd = "123456"self.charset = "utf8"#上面是数据库的基本参数self.conn = pm.connect(host=self.host, port=self.port, db=self.db, user=self.user,passwd=self.passwd,charset=self.charset)self.cur = self.conn.cursor()#这里初始化的创建连接数据库,不会再使用时重复调用def get_art(self, art_name,art_id):        sql1 =" CREATE TABLE art_id(id int PRIMARY KEY AUTO_INCREMENT,art_name varchar(50) NOT NULL,art_id varchar(50) NOT NULL);"sql2 ="CREATE UNIQUE INDEX art_id_art_id_uindex ON art_id (art_id);"#创建歌手表,生成唯一索引,在后续的歌曲下载过程中加快搜索速度sql3  = "INSERT INTO `song_db`.`art_id` (`art_name`, `art_id`) VALUES ('{}', '{}');".format(art_name,art_id)try:self.cur.execute(sql1)self.cur.execute(sql2)self.conn.commit()#使用try语句创建数据库,判断如果数据库已经创建过的,就生成异常,跳过创建except:passtry:self.cur.execute(sql3)self.conn.commit()#将爬取的歌手信息存储到数据库中except:passreturn Nonedef get_song(self,song_name,song_src,art_id):sql1 = "CREATE TABLE song_id(id int PRIMARY KEY AUTO_INCREMENT,song_name varchar(50),song_id varchar(50),song_art_id varchar(50));"sql2 = "INSERT INTO `song_db`.`song_id` (`song_name`, `song_id`, `song_art_id`) VALUES ('{}', '{}', '{}');".format(song_name,song_src,art_id)try:self.cur.execute(sql1)self.conn.commit()except:passtry:self.cur.execute(sql2)self.conn.commit()except:passreturn None#上面同样是创建歌曲表,将爬取的歌曲信息存放如数据库中def select_song(self,name,song):sql = "SELECT art_name,song_name,song_id from art_id join(select song_name,song_id,song_art_id from song_id)t on song_art_id =art_id and song_name='{}' and art_name = '{}';".format(song,name)self.cur.execute(sql)songs = self.cur.fetchall()self.conn.commit()return songs#上面部分对应的是,在下载歌曲中查找的操作art_db = Mysqlpython()
#生成实例,在爬虫主程序中调用这个实例和与之对应的方法,实现连接数据库的功能

数据库的连接模块独立封装,降低的主程序的代码冗余,可以是整个的逻辑更加畅通,而且复用性更强,添加新的功能更为方面

3、歌曲的下载模块(songs_down.py)
同上上面的两个步骤,已经把我们想要的歌曲存储到数据库中,我们只需要搜索目标歌手,歌曲就能完成下载。

from conn_db import art_db
from urllib import requestdef song_select(name,song):songs = art_db.select_song(name,song)song_num = len(songs)print("搜索到{}首相关歌曲".format(song_num))if song_num:return songselse:return None#这里通过搜索数据库中歌曲信息,来查找对应歌曲def song_down(x):song_id = x[2].split("?")[1]url = "http://music.163.com/song/media/outer/url?{}.mp3".format(song_id)header = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}requ = request.Request(url,headers=header)html = request.urlopen(requ).read()#请求歌曲信息,在爬虫的主程序中,我们已经拿到也歌曲所对应的字节流地址,并写入数据库,现在我们直接请求数据流地址,返回的就是对应歌曲的字节流,在经过写入文件,就能达到下载的目的with open("{}.mp3".format(x[1]),"wb") as song_f:song_f.write(html)print("下载完成!")if __name__ == "__main__":while True:name = input("请输入歌手:")if not name:breaksong = input("请输入歌曲:")songs = song_select(name,song)#输入想要下载的歌手,歌曲,搜索对应信心是否存在if songs:for x in songs:print("正在下载----{}---{}".format(x[0],x[1]))song_down(x)

整个过程基本上完成了,最后的效果如下:

可以看出对应的两首歌曲已经下载完成,程序运行OK。

但是,数据库中的歌曲才有50000多首,可以通过为网易云音乐的网页分析,添加更多的歌手分类id到我们创建的id池中,这样就可以增到歌曲的收纳数,达到任何歌曲,随时下载的目的。

这里可一个自定义一个gui模块,将下载,播放等功能可视化,这样就创建的自己的一个音乐播放软件。

爬取网易云音乐50000+首歌曲相关推荐

  1. python爬取网易云音乐生成王力宏歌曲词云

    python爬取网易云音乐生成王力宏歌曲词云 # -*- coding:utf-8 -*- # 网易云音乐,通过歌手id生成词云 import requests import sys,re,os fr ...

  2. 用python爬取网易云评论10w+的歌曲名_Python爬取网易云音乐评论热门歌曲和ID

    一.构造歌手个人主页的URL 前段时间我们获取了网易云音乐全部歌手的id号,今天我们就利用全部歌手的id号来构造歌手个人主页的URL,从而实现用爬取全部歌手的热门歌曲及其id号的目的.以歌手 薛之谦的 ...

  3. python爬取音乐歌曲大全_Python爬取网易云音乐歌单歌曲

    # 从网易云音乐下载歌单歌曲 # 参考了这些网址 # https://blog.csdn.net/Ciiiiiing/article/details/62434438 # https://github ...

  4. 用python爬取网易云评论10w+的歌曲名_Python3爬取网易云音乐评论

    |下载W3Cschool手机App,0基础随时随地学编程>>戳此了解| 导语 利用Python为自己喜欢的音乐制作专属词云.至于词的来源嘛,当然是对应歌曲的所有评论或者热门评论啦!!!毕竟 ...

  5. Python 爬取网易云音乐所有评论

    题图:by cfunk44 from Instagram 在使用 Ajax 技术加载数据的网站中, JavaScript 发起的 HTTP 请求通常需要带上参数,而且参数的值都是经过加密的.如果我们想 ...

  6. 爬取网易云音乐单曲下的所有评论

    ♚ 作者:极客猴,热衷于 Python,目前擅长利用 Python 制作网络爬虫以及 Django 框架. 在使用 Ajax 技术加载数据的网站中, JavaScript 发起的 HTTP 请求通常需 ...

  7. 用python爬取网易云评论_Python3爬取网易云音乐评论|python爬虫|python入门|python教程...

    https://www.xin3721.com/eschool/pythonxin3721/ 本文转载至知乎ID:Charles(白露未晞)知乎个人专栏 下载W3Cschool手机App,0基础随时随 ...

  8. 网易云词云python_Python3爬取网易云音乐评论制作词云!网易云评论人才辈出啊!...

    主要思路 利用Python爬取网易云音乐中相应歌曲的所有评论,并利用这些评论制作歌曲的专属词云. 具体过程见相关文件中的源代码. 开发工具 Python版本:3.5.4 相关模块: requests模 ...

  9. python爬虫No.1|爬取网易云音乐歌手的前50首歌曲ID及名字

    自学pythonのNo.5 引语 知识总结 Requests XPath 案例 曾经有这样的梗黑网易云音乐 实际上网易云是很不错的音乐软件之一.这个梗挺让我不舒服的,挫折谁都有,矫情没必要但对矫情之人 ...

最新文章

  1. deepLink iOS 应用到自己APP 记录
  2. 大一java实训报告1500字_从800字小作文,到3000字小论文你用了多久? | 校媒FM
  3. Python程序设计题解【蓝桥杯官网题库】 DAY7-基础练习
  4. 列出这周开发工作时间及内容,可以发表各种感想和这周阅读内容。
  5. EasyX制作掩码图
  6. python自带的url提取器
  7. 设计模式理解:装饰模式Decorator
  8. boost::units模块测试元函数 is_unit, is_quantity, is_dimension_list ....
  9. 【渝粤教育】广东开放大学 服务标准化 形成性考核 (41)
  10. php 126怎么设置发送邮箱验证码,邮箱发送验证码(示例代码)
  11. Maven打包三种方法和常用命令大全
  12. 免费的固定资产管理软件|免费的固定资产管理软件哪个好?
  13. vue导入pdf插件报错
  14. 服务器地址和客户端地址详解与区别
  15. 谷粒商城笔记+踩坑(17)——【认证模块】登录,用户名密码登录+微博社交登录+SpringSession+xxl-sso单点登录
  16. 简单的python小程序祝福母亲,母亲节快乐!
  17. 机器学习 基于加州房价的线性回归实验
  18. RISC领域ARM不是唯一
  19. Excel高级筛选操作图解
  20. 服务器异常卡顿 无法重装系统,电脑重装系统经常卡死怎么解决

热门文章

  1. 啊,这该死的天气和路况,让我特靠谱爱车失灵了《打工人的那些事》
  2. c++逆天改命进阶--RedBlackTree
  3. 毕业设计 单片机遥控小车设计与实现
  4. java避免出现科学计数法表示_Java中的浮点数-科学计数法-加减乘除
  5. 饥荒联机版专属服务器建立和后续mod更新
  6. 改写[转载]关闭危险端口的批处理文件FOR WIN7
  7. java集成pdf.js实现pdf文件在线预览
  8. java swing小程序:手动绘制美国队长盾牌
  9. 微信小程序 表情小作坊 — 轻松定制表情包 1
  10. 线上订餐系统初步python