工具及环境

1、操作系统:windows 64位系统

2、软件工具:谷歌浏览器、pycharm集成开发工具

3、第三方库:request

注:如果第三方库搭建有困难,请看博客:https://www.cnblogs.com/chuijingjing/p/9157049.html

明确要目标

首先,我们了解一下什么是爬虫。网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。

我们今天要爬的内容是百度音乐里面的音乐,为什么要爬百度音乐呢?当然是因为这个软件太垃圾了,根本没有反扒机制,所以我们挑软柿子捏。像我们的信仰网易云音乐是不可能让我们轻易爬到它的内容的,如果想要爬网易云,要有防反爬机制。我们这次只是简单介绍爬虫的原理,写一个小小的爬虫,下次我会给大家带来一个加入防反爬机制复杂的爬虫。话不多说,让我们开干!

说干咱就干

1、脉络梳理

首先,我们把要做的工作先来大体梳理一下,好有一个清晰的脉络。

  1. 1.爬虫的本质(模拟浏览器的行为)
  2. 网络爬虫;
  3. 模拟浏览器,访问互联网资源,根据我们制定的规则,
  4. 批量的下载我们所需要的数据的程序。
  5.  
  6. 2.利用谷歌浏览器分析http请求
  7. 网络资源(例如:网上的歌曲、图片),每一个网络
  8. 资源都有全球唯一的一个url
  9. url(全球统一资源定位符)
  10.  
  11. F12 打开
  12. network选项监控http请求
  13.  
  14. 3.分析百度音乐的请求流程
  15. 下载mp3
  16. 倒推法
  17. 1、先找到mp3的下载请求
  18. 2、歌曲的下载地址也是从服务器请求回来的,
  19. 找到下载地址的那个请求,根据歌曲id
  20. 3、找到歌曲的id
  21.  
  22. 4.通过python去实现请求

2、浏览器设置

我们先进入“百度音乐”,搜索你喜欢的歌手的音乐,我比较喜欢华仔。然后点击浏览器右上方的三个点,选择“更多工具”,选择“开发者工具”,进入开发者模式。或者直接按“F12”进入开发者模式。

点击“Network”,在“Disable cache”前面打上√,不要去缓存,否则死活找不到请求的数据

按照1、2、3、4、5的顺序做下来

1:清空内容;

2:回车,发出请求;

3:查看所有请求的信息;

4:每个请求的名字;

5:每个请求的详细信息。

Header:头信息

  1. Request URL:http://music.baidu.com/cms/hunter/alog/speed.min.js?v=160115  # 请求的地址
  2. Request Method:GET  # 请求的方法
  3. Status Code:200 OK   # 是 http请求成功后返回的 int值
  4. Remote Address:180.76.141.217:80  # 远程地址
  5. Referrer Policy:no-referrer-when-downgrade  # 按照浏览器的默认值执行。默认值为 no-referrer-when-downgrade

先点完上面三个标注按钮,然后点击播放按钮,播放音乐;

音乐播放几秒钟后关闭播放,然后点击下面的三个按钮;

接下来就是分析歌曲的头信息Headers了。

按照图示,找到网页文字对应的网页源码的信息

上面界面中鼠标右键查看页面源码,出现下面的源码界面,按Ctrl+F出现搜索界面,搜索要用到的内容。

3、爬取一首歌曲

由浅入深,我们先来写一段简单的代码,用它来只爬取一首歌。

  1. # -*- coding: utf-8 -*-
  2. # the auther is cjj
  3.  
  4. import requests # 导入关于请求模块
  5. url = 'http://zhangmenshiting.qianqian.com/data2/music/5ebb214edf0a1589e3e1ca58196981e5/594723982/
        594723982.mp3?xcode=f6925df9ce85d4400c486914f0acd7b6'
  6. # 发送http请求
  7. response = requests.get(url) # response 接收请求回来的数据
  8. print(response.content) # response.content 输出歌曲的二进制信息
  9. # 把下载下来的歌曲储存为mp3文件
  10. with open('mp3.mp3','wb') as f: # 把文件以‘f’的名字命名,下面以‘f’为名字打开
  11. f.write(response.content)

这样,我们就可以实现爬虫的基本功能了,我们来看一下这首歌能不能听。

这是你的代码和歌曲储存地址,我们去这里来找一下华仔的“慢慢”

果然在这里找到了,双击之后发现歌曲可以正常播放。

这样,我们完成了一个最简单的歌曲的爬取。

注:文件操作方面如果不了解可以参考:https://www.cnblogs.com/chuijingjing/articles/8034238.html

4、代码演示

文件操作内容:https://www.cnblogs.com/chuijingjing/articles/8034238.html

字典相关内容:https://www.cnblogs.com/chuijingjing/articles/8007387.html

json相关内容:https://www.cnblogs.com/chuijingjing/articles/8074292.html

正则相关内容:http://www.runoob.com/regexp/regexp-syntax.html

  1. # -*- coding: utf-8 -*-
  2. # the auther is cjj
  3.  
  4. import requests
  5. import re
  6. # 第一步,获取歌曲的ids
  7. search_api = 'http://music.baidu.com/search'
  8. # 搜索关键字,传递参数,通过字典构造
  9. keyword = {'key': '刘德华'}
  10. # 发送get请求 params 是传递的get参数
  11. response = requests.get(search_api, params=keyword)
  12. # 取出html的源码
  13. response.encoding = 'utf-8' # 编码转换
  14. html = response.text
  15. # 通过正则表达式获取id
  16. ids = re.findall(r'{"id":"(\d+)&quot',html)
  17.  
  18. # 第二步,获取歌曲的信息
  19. mp3_info_api = 'http://play.baidu.com/data/music/songlink'
  20. data = {
  21. 'songIds': ','.join(ids),
  22. 'hq': 0,
  23. 'type': 'm4a,mp3',
  24. 'rate': '',
  25. 'pt': 0,
  26. 'flag': -1,
  27. 's2p': -1,
  28. 'prerate': -1,
  29. 'bwt': -1,
  30. 'dur': -1,
  31. 'bat': -1,
  32. 'bp': -1,
  33. 'pos': -1,
  34. 'auto': -1
  35. }
  36. # data就是 post的参数
  37. res = requests.post(mp3_info_api,data=data)
  38. # 返回值的数据是就送格式,直接调用json方法,转成字典
  39. info = res.json()
  40.  
  41. # 第三步,去下载歌曲
  42. # 根据数据的结构获取歌曲的信息
  43. song_info = info['data']['songList']
  44. # 循环
  45. for song in song_info:
  46. # 根据数据结构获取信息
  47. # 歌名
  48. song_name = song['songName']
  49. # mp3地址
  50. song_link = song['songLink']
  51. # 格式
  52. for_mat = song['format']
  53. # 歌词地址
  54. lrclink = song['lrcLink']
  55. print(song_name)
  56. # 下载mp3
  57. if song_link: # 可能没有地址
  58. song_res = requests.get(song_link) # 下载
  59. # 写文件
  60. with open('%s.%s' % (song_name, for_mat),'wb') as f:
  61. f.write(song_res.content) # 歌曲是二进制
  62. # 下载歌词
  63. if lrclink:
  64. lrc_response = requests.get(lrclink)
  65. # 写文件
  66. with open('%s.lrc' % song_name, 'w', encoding= 'gbk') as f:
  67. f.write(lrc_response.text)

下面是成功爬取到的音乐!

python3_爬虫_爬百度音乐的更多相关文章

  1. Python爬虫(一)爬百度贴吧

    简单的GET请求: # python2 import urllib2 response = urllib2.urlopen('http://www.baidu.com') html = respons ...

  2. 【python爬虫】 爬云音乐我和xxx共同听过的歌曲

    闲聊的时候,觉得,想写个爬虫,爬下2个人共同听过的歌曲有哪些,然后一鼓作气,花了一个多小时,写了一个.支持最近一周和所有时间,需要用户没有关闭听歌排行显示 How to start 使用到的工具是Se ...

  3. Python 爬虫实例(爬百度百科词条)

    爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入 ...

  4. Python网络爬虫_爬取Ajax动态加载和翻页时url不变的网页

    1 . 什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新 ...

  5. python2.7 爬虫_爬取小说盗墓笔记章节及URL并导入MySQL数据库_20161201

    1.爬取页面 http://www.quanshu.net/book/9/9055/ 2.用到模块urllib(网页下载),re正则匹配取得title及titleurl,urlparse(拼接完整ur ...

  6. Python爬虫(二)爬百度贴吧楼主发言

    爬取电影吧一个帖子里的所有楼主发言: # python2 # -*- coding: utf-8 -*- import urllib2 import string import re class Ba ...

  7. 如何使用百度音乐搜索接口API

    百度有开放音乐搜索的api 比如: http://box.zhangmen.baidu.com/x?op=12&count=1&title=大约在冬季$$齐秦$$$$ http://b ...

  8. pygame系列_原创百度随心听音乐播放器_完整版

    程序名:PyMusic 解释:pygame+music 之前发布了自己写的小程序:百度随心听音乐播放器的一些效果图 你可以去到这里再次看看效果: pygame系列_百度随心听_完美的UI设计 这个程序 ...

  9. Python爬虫初学(二)—— 爬百度贴吧

    Python爬虫初学(二)-- 爬百度贴吧 昨天初步接触了爬虫,实现了爬取网络段子并逐条阅读等功能,详见Python爬虫初学(一). 今天准备对百度贴吧下手了,嘿嘿.依然是跟着这个博客学习的,这次仿照 ...

随机推荐

  1. 枚举子集&高位前缀和

    最近做的题里面有这个东西,于是写一篇博客总结一下吧. 枚举子集 枚举子集就是状压的时候枚举其中的二进制位中的1的子集.直接暴力枚举二进制位时间复杂度是\(O(4^n)\),但是我们可以发现,对于每一位 ...

  2. SDN原理 OpenFlow协议 -4

    通道 Channel 在前面的OpenFlow的内容中,我们提到了在交换层所采用的流表是控制层的Controller下发的,那么Controller是如何下发流表的呢?中间经过了哪些的流程和步骤?控制 ...

  3. Codeforces Round #419 (Div. 2) B. Karen and Coffee(经典前缀和)

    http://codeforces.com/contest/816/problem/B To stay woke and attentive during classes, Karen needs s ...

  4. UOJ #266 【清华集训2016】 Alice和Bob又在玩游戏

    题目链接:Alice和Bob又在玩游戏 这道题就是一个很显然的公平游戏. 首先\(O(n^2)\)的算法非常好写.暴力枚举每个后继计算\(mex\)即可.注意计算后继的时候可以直接从父亲转移过来,没必 ...

  5. Linux常用命令--文件操作、权限设置

    1.编辑文件 cat aaa.txt 查看aaa.txt文件的内容 head - aaa.txt 查看aaa.txt文件前5行的内容 tail - aaa.txt 展示aaa.txt文件最后10行的内 ...

  6. 使用actioncable做的notification(GoRails教学,2课)

    GoRails视频系列: 1.   用actioncable建立Notifications 2.  见博客: 3.  非认证/登陆user不能使用actioncable 用ActionCable 建立 ...

  7. Access数据库 更新 "延时" 现象

    最近发现 Access数据库执行Update或Delete操作成功后,执行select回来的数据未更改.打开数据库查看时却发现已更改,再次执行select 后却发现正常了. 经调试发现:Access数 ...

  8. plsql安装图解

    Plsqldev安装步骤

  9. prim和kruskal比较

    推荐:http://squirrelrao.iteye.com/blog/1044867  http://www.cnblogs.com/xwdreamer/archive/2011/06/16/22 ...

  10. bzoj2594

    题解: lct维护最小生成树 首先,先对于每一条边,生成一个点,这个点连接这一条边的两个端点 点的值为边的权值 其他点的权值都是0 那么每一次查找i-j路径上面最小值,就变成查找树上路径点权最小值 按 ...