工具及环境

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

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

3、第三方库:request

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

明确要目标

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

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

说干咱就干

1、脉络梳理

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

1.爬虫的本质(模拟浏览器的行为)
网络爬虫;
模拟浏览器,访问互联网资源,根据我们制定的规则,
批量的下载我们所需要的数据的程序。 2.利用谷歌浏览器分析http请求
网络资源(例如:网上的歌曲、图片),每一个网络
资源都有全球唯一的一个url。
url(全球统一资源定位符) F12 打开
network选项监控http请求 3.分析百度音乐的请求流程
下载mp3
倒推法
1、先找到mp3的下载请求
2、歌曲的下载地址也是从服务器请求回来的,
找到下载地址的那个请求,根据歌曲id
3、找到歌曲的id 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、爬取一首歌曲

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

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

# -*- coding: utf-8 -*-
# the auther is cjj import requests
import re
# 第一步,获取歌曲的ids
search_api = 'http://music.baidu.com/search'
# 搜索关键字,传递参数,通过字典构造
keyword = {'key': '刘德华'}
# 发送get请求 params 是传递的get参数
response = requests.get(search_api, params=keyword)
# 取出html的源码
response.encoding = 'utf-8' # 编码转换
html = response.text
# 通过正则表达式获取id
ids = re.findall(r'{"id":"(\d+)&quot',html) # 第二步,获取歌曲的信息
mp3_info_api = 'http://play.baidu.com/data/music/songlink'
data = {
'songIds': ','.join(ids),
'hq': 0,
'type': 'm4a,mp3',
'rate': '',
'pt': 0,
'flag': -1,
's2p': -1,
'prerate': -1,
'bwt': -1,
'dur': -1,
'bat': -1,
'bp': -1,
'pos': -1,
'auto': -1
}
# data就是 post的参数
res = requests.post(mp3_info_api,data=data)
# 返回值的数据是就送格式,直接调用json方法,转成字典
info = res.json() # 第三步,去下载歌曲
# 根据数据的结构获取歌曲的信息
song_info = info['data']['songList']
# 循环
for song in song_info:
# 根据数据结构获取信息
# 歌名
song_name = song['songName']
# mp3地址
song_link = song['songLink']
# 格式
for_mat = song['format']
# 歌词地址
lrclink = song['lrcLink']
print(song_name)
# 下载mp3
if song_link: # 可能没有地址
song_res = requests.get(song_link) # 下载
# 写文件
with open('%s.%s' % (song_name, for_mat),'wb') as f:
f.write(song_res.content) # 歌曲是二进制
# 下载歌词
if lrclink:
lrc_response = requests.get(lrclink)
# 写文件
with open('%s.lrc' % song_name, 'w', encoding= 'gbk') as f:
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. 日志自定义Tag

    import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentHashMap; /** * Crea ...

  2. [微信开发] - weixin4j关键类解析

    TokenUtil : get()获取我方自定义的token(从配置文件或数据库) checkSignature(Str..... (服务器配置连接验证有效性) /* * 微信公众平台(JAVA) S ...

  3. poj 2828 Buy Tickets 树状数组

    Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Year in China, so ...

  4. codeforces 256 div2 C. Painting Fence 分治

    C. Painting Fence time limit per test 1 second memory limit per test 512 megabytes input standard in ...

  5. MQ选型对比RabbitMQ RocketMQ ActiveMQ Kafka

    几种MQ产品说明: ZeroMQ :  扩展性好,开发比较灵活,采用C语言实现,实际上他只是一个socket库的重新封装,如果我们做为消息队列使用,需要开发大量的代码 RabbitMQ :结合erla ...

  6. netty做集群 channel共享 方案

    netty做集群 channel如何共享? 方案一: netty 集群,通过rocketmq等MQ 推送到所有netty服务端, channel 共享无非是要那个通道都可以发送消息向客户端, MQ广播 ...

  7. Android之网络图片加载的5种基本方式

    学了这么久,最近有空把自己用到过的网络加载图片的方式总结了出来,与大家共享,希望对你们有帮助. 此博客包含Android 5种基本的加载网络图片方式,包括普通加载HttpURLConnection.H ...

  8. 2-14-1 MySQL基础语句,查询语句

    一. SQL概述 结构化查询语言(Structured Query Language)简称SQL 1. 它是一种特殊目的的编程语言 2. 它还是一种数据库查询和程序设计语言 (用于存取数据以及查询.更 ...

  9. 为了更好更方便地活着——爱上private

    刚开始接触OOP的时候,打心底里我不喜欢private与protected.我声明一个public然后不直接用它,不就跟private一样吗?在某些场合下,我还能偷偷地用一下public变量,这不是更 ...

  10. bzoj1078

    题解: 一道思路题(话说在那个时候有多少人知道左偏树) 考虑最后一个加进来的点 必然满足 (1)从它到根一直是左链上去的 (2)没有左右子树 在这些点中寻找一个最浅的 然后删除 代码: #includ ...