Python入门之爬取百度音乐

先说一下为什么会有这篇文章,首先肯定是有这个需求了,本人出差在外地,这里的网速卡到爆,根本支撑不了在线听歌的要求,所以就想下载到本地来慢慢听。这可是python的绝活,最近对Python爬虫很有兴趣,于是想到以前写过Q他版本的,拿来一试接口竟然还可以用,具体音乐信息的获取流程见上一篇简单几步实现网络音乐播放器(Qt版百度FM)中的分析。

这里不得不感叹一句:Life is short, you need Python! 简单优雅到你试一次后就会爱上它,对于爬取个神马美女图片啦顺手捻来,不多废话了,直接上代码才100来行,代码只做了简单的注释

import json
import threading
#from bs4 import BeautifulSoup
import re
import os
from urllib.request import urlopen,Requestimport socket
socket.setdefaulttimeout(10)#http://fm.baidu.com/dev/api/?tn=channellist
def get_channel_list(page_url):try:htmlDoc = urlopen(page_url).read().decode('utf8')except:return {}with open("./channle.json", mode = 'w', encoding = 'utf-8') as file:file.write(htmlDoc)file = open('channle.json')content = json.load(file)channel_list = content['channel_list']for channel in channel_list:print(channel['channel_name'])return channel_listdef get_song_list(channel_url):try:htmlDoc = urlopen(channel_url).read().decode('utf8')except:return{}with open("./songs.json", mode = 'w', encoding = 'utf-8') as file:file.write(htmlDoc)file = open('songs.json')content = json.load(file)song_id_list = content['list']#for song in song_id_list:#    print(song)return song_id_listdef get_song_real_url(song_url):try:htmlDoc = urlopen(song_url).read().decode('utf8')#print(htmlDoc)except:return(None, None, 0)with open("./song.json", mode = 'w', encoding = 'utf-8') as file:file.write(htmlDoc)file = open('song.json')content = json.load(file)#print(content['data']['songList'])try:song_link = content['data']['songList'][0]['songLink']song_name = content['data']['songList'][0]['songName']song_size = int(content['data']['songList'][0]['size'])except:print('get real link failed')return(None, None, 0)#print(song_name + ':' + song_link)return song_name, song_link, song_sizedef donwn_mp3_by_link(song_link, song_name, song_size):file_name = song_name + ".mp3"base_dir = os.path.dirname(__file__)file_full_path = os.path.join(base_dir, file_name)if os.path.exists(file_full_path):returnprint("begin DownLoad %s, size = %d" % (song_name, song_size))mp3 = urlopen(song_link) block_size = 8192down_loaded_size = 0file = open(file_full_path, "wb")while True:try:buffer = mp3.read(block_size)down_loaded_size += len(buffer)if(len(buffer) == 0):if down_loaded_size < song_size:if os.path.exists(file_full_path):os.remove(file_full_path)print('download time out, file deleted')with open('log.txt', 'a') as log_file:log_file.write("time out rm %s\n" % file_name)breakprint('%s %d of %d' % (song_name, down_loaded_size, song_size))file.write(buffer)if down_loaded_size >= song_size:print('%s download finshed' % file_full_path)breakexcept:if os.path.getsize(file_full_path) < song_size:if os.path.exists(file_full_path):os.remove(file_full_path)print('download time out, file deleted')with open('log.txt', 'a') as log_file:log_file.write("time out rm %s\n" % file_name)breakfile.close()def downViaMutiThread(song_info_list):task_threads = []  #存储线程for song_name, song_link, song_size in song_info_list:t = threading.Thread(target = donwn_mp3_by_link, args = (song_link, song_name, song_size))task_threads.append(t)for task in task_threads:task.start()for task in task_threads:task.join()if __name__ == '__main__':# 第一步,获取频道列表channelpage_url = 'http://fm.baidu.com/dev/api/?tn=channellist'channel_list = get_channel_list(page_url)while True:#第二步,获取某个频道列表下的所有歌曲#get all song's id in one channelchannel_url = 'http://fm.baidu.com/dev/api/?tn=playlist&format=json&id=%s' % 'public_yuzhong_yueyu'song_id_list = get_song_list(channel_url)#第三步,获取该歌曲的所有信息#get song real url#song_info = {}song_info_list = []for song_id in song_id_list:#print(song_id['id'])song_url = "http://music.baidu.com/data/music/fmlink?type=mp3&rate=320&songIds=%s" % song_id['id']song_name, song_link, song_size = get_song_real_url(song_url)if song_size != 0:#song_info[song_name] = song_link#song_info = (song_name, song_link, song_size)#song_info_list.append(song_info)#single thread way#最后下载歌曲donwn_mp3_by_link(song_link, song_name, song_size)#downViaMutiThread(song_info_list)

简单几步实现网络音乐播放器(Python爬虫版百度FM)相关推荐

  1. 简单几步实现网络音乐播放器(Qt版百度FM)

                                  百度FM音乐Qt版本 很久之前写的软件了,一直没有总结,也懒得继续开发了,这里简单总结一下,也算是对自己的努力一个交代吧. 先来个ubunt ...

  2. android网络音乐播放器

    ** 网络音乐播放器 ** 转载请指明博客网址 作者:WangYouHu我的主页网址 链接:https://www.jianshu.com/p/855659f266ae 著作权归作者所有,任何形式的转 ...

  3. 基于QT的网络音乐播放器(一)

    自学Qt已经有一段时间了,但是始终感觉自己还是很弱(其实并不是感觉自己很弱,是自己本来就很弱,哈哈).自己也照着书上敲了几个例子,但觉得还是要写点东西才能真正运用起来.所以,前段时间就写了个很简单的音 ...

  4. 基于android的网络音乐播放器-添加viewpager和fragment实现滑动切换多个界面(二)

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

  5. 100个vc小项目开发:二、一步一点设计音乐播放器 [I]

    100个vc小项目开发:二.一步一点设计音乐播放器 [源码解读] 文章作者: July 软件来源:开源 ================== 1.有不正之处,恳请指正. 2.本文贴出的是关键实现代码部 ...

  6. 全网首个tk网络音乐播放器!支持歌词滚动!你看我吊不?

    这是一个用 Python 的 tkinter 库做的一个网络音乐播放器.我不说它的 UI 设计的有多好看,但是它的功能绝对是全站首个!坚持看到底,你不点赞算我输! 成果展示 程序截图 前期准备 程序结 ...

  7. android 收藏歌曲功能,基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)...

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

  8. 基于android的网络音乐播放器-播放音乐及收藏音乐的效果展示(四)

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

  9. 基于android的网络音乐播放器-回调实现音乐播放及音乐收藏的实现(三)

    作为android初学者,最近把疯狂android讲义和疯狂Java讲义看了一遍,看到书中介绍的知识点非常多,很难全部记住,为了更好的掌握基础知识点,我将开发一个网络音乐播放器-EasyMusic来巩 ...

最新文章

  1. 超越Google,快手落地业界首个万亿参数推荐精排模型
  2. R可视化ggplot2绘制重叠密度图(Overlay Density Plots)
  3. 虚拟路由冗余协议VRRP
  4. bzoj 2436: [Noi2011]Noi嘉年华
  5. 从hadoop框架与MapReduce模式中谈海量数据处理
  6. L1-008. 求整数段和
  7. 用vim + xdebug 来追踪thinkphp的执行过程
  8. 设置调试PHP,debug php输出所有错误信息
  9. Spring Boot + Spring Cloud 实现权限管理系统 配置中心(Config、Bus)
  10. Python 分析在德的中国程序员,告别 996 ?
  11. 决策树算法的应用python实现_决策树ID3和C4.5算法Python实现源码
  12. 软件授权注册码_授权码授予
  13. 立即从iOS 10和macOS Sierra下载壁纸
  14. HTML5期末大作业:游戏网站设计与实现——基于bootstrap响应式游戏资讯网站制作HTML+CSS+JavaScript
  15. 收藏一些web应用,留作DzzOffice日后添加web应用时使用。
  16. STM32CubeIDE 介绍及安装
  17. Eel初次使用示例(使用Scala读取Hive表)
  18. WeChat基础 senparc公众平台搭建
  19. 选择 conforming 还是 non-conforming ?
  20. 大学物理实验 基本量的测量

热门文章

  1. 蓝牙麦克风 android,带有蓝牙麦克风的Android语音识别器
  2. Web-big、html、css、JavaScript、vue、webpack、git、微信小程序、uni-app、性能优化、兼容性、网络请求、web安全、其他
  3. 鼠标侧键设置工具X-Mouse安装教程
  4. lterator的初体验
  5. 激活 MarkDownPad 2
  6. Vue 使用vue-seo-phantomjs 实现SEO抓取优化方案
  7. 【C++】ios::sync_with_stdio(false) 与 cin.tie(nullptr) 加速 IO
  8. Rook Ceph浅谈
  9. android通知栏样式自定义,如何给状态栏上的时钟自定义样式或位置?(位置篇)
  10. 美图秀秀网页版新功能上线 新增磨皮祛痘