暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python爬虫-04-如何爬取网易云音乐的歌曲,再认识urllib模块

运维家 2022-05-14
990

接上文,续写urilib模块在python爬虫中的一些使用方法。

1、urlencode函数

用来将汉字或者其他内容变成浏览器中url
的访问方式,就是乱码(百分号加16进制的编码组成的内容);

示例:

from urllib import parsejier = {'wd''刘亦菲''age'18}suner = parse.urlencode(jier)print(suner)

输出内容为:

wd=%E5%88%98%E4%BA%A6%E8%8F%B2&age=18

上面的实际上已经满足了我们浏览器发起请求的需求了,那么放在实际中如何进行呢?如下:

from urllib import parse, requestjier = {'wd''刘亦菲''age'18}suner = parse.urlencode(jier)Url = 'http://www.baidu.com'Requ = request.urlopen(Url + '?' + suner)Resp = Requ.read().decode('utf-8')print(Resp)

使用如上方式即可完整的模拟我们使用浏览器来发起相关请求了;

2、parse_qs函数

这个函数和urlencode
是正好相反的,urlencode
是将内容转换成浏览器url
形式,parse_qa
是将其反转回来;

示例:

from urllib import parsejier = parse.parse_qs('wd=%E5%88%98%E4%BA%A6%E8%8F%B2&age=18')print(jier)

输出内容为:

{'wd': ['刘亦菲'], 'age': ['18']}

3、urlparse和urlsplit函数

urlparse
urlsplit
基本上是没有什么区别的,都是用来拆分url
中的参数的,还记得我们之前说过一个url
是由好几部分组成的吧,那么这两个函数就是将其反向获取出来的。

示例:

from urllib import parseUrl = 'https://www.baidu.com/s?wd=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=UTF-8#2'jier = parse.urlparse(Url)suner = parse.urlsplit(Url)print(jier)print(suner)

输出内容为:

ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=UTF-8', fragment='2')SplitResult(scheme='https', netloc='www.baidu.com', path='/s', query='wd=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=UTF-8', fragment='2')

可以看到他们urlparse
urlsplit
两个函数的差异就是,urlparse
函数会返回有params
,而urlsplit
函数并不会返回params
;别的方面两者几乎完全相似,所以说使用哪一个函数都是可以的;

写个将每个参数单独取出的:

from urllib import parseUrl = 'https://www.baidu.com/s?wd=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=UTF-8#2'jier = parse.urlparse(Url)print('scheme : ' + jier.scheme)print('netloc : ' + jier.netloc)print('path : ' + jier.path)print('params : ' + jier.params)print('query : ' + str(parse.parse_qs(jier.query)))print('fragment : ' + jier.fragment)print(jier)

输出内容为:

scheme : httpsnetloc : www.baidu.compath : /sparams : query : {'wd': ['刘亦菲'], 'ie': ['UTF-8']}fragment : 2ParseResult(scheme='https', netloc='www.baidu.com', path='/s', params='', query='wd=%E5%88%98%E4%BA%A6%E8%8F%B2&ie=UTF-8', fragment='2')

4、request.Request函数

这个是用来在发起请求的时候加一些请求头的,例如申明我们是浏览器?而不是python
爬虫

示例:

from urllib import requestjier = {    'User-Agent''Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'}suner = request.Request('http://www.baidu.com', headers=jier)Requ = request.urlopen(suner)print(Requ.read().decode('utf-8'))

使用上面的方式,就成功的将我们的爬虫申明成了一个浏览器的访问方式了。

5、用python爬取网易云音乐

也有了不少的内容了,那么我们这次就来个实操,使用我们所学到的内容来做个小实验,在网易云音乐中爬取指定歌曲;

爬取伍佰的音乐;

(1)首先我们登录网易云音乐的PC端;

https://music.163.com/

(2)然后我们根据显示的内容,就可以写出下面的代码:

from urllib import request, parseUrl = 'https://music.163.com/weapi/search/suggest/web?csrf_token='Header = {'user-agent''Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.64 Safari/537.36'}FromData = {'params''jnqza/eCITL891O5pIxF/vO8TgDsabPoYWKQUm5GBmv5ituFKbogtgtKJLEkeo/2hqx48FnTzY0HBQgjMj/U6lNoxSh8PnEd4BY/7ZTSxZU=''encSecKey''dc9006f23215326719eae1416c8da799bcd02a9452218574158a041224877953a83286854071bcc93b976f51e359c12516fc9ff8abf266453a92a8e3cc8a209452a10dd286d04658ac9b6d933121d589c0a881569ffc4faf7573f7f6d1d1aa21dc38d857b4c4625183a1cd419983ced4341342bc9f44c96297d1639226d1357b'}jier = request.Request(Url, headers=Header, data=parse.urlencode(FromData).encode())
suner = request.urlopen(jier)
print(suner.read().decode('utf-8'))

输出内容如下:

这样子我们就获取到了每首歌曲的下载地址;

 # 省略部分内容,并未完全展现哈
{"result":{"albums":[{"id":15823,"name":"爱情的尽头","artist":{"id":222871,"name":"伍佰 & China Blue","picUrl":"https://p2.music.126.net/RfsAo6pgoW7CU9kNTELplg==/7828522790653024.jpg","alias":["Wu Bai & China Blue"],"albumSize":34,"picId":7828522790653024,"img1v1Url":"https://p2.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg","img1v1":0,"alia":["Wu Bai & China Blue"],"trans":null}

以上示例解释:

Header:请求头
FromDate:请求表单
request.Request(Url, headers=Header, data=parse.urlencode(FromData).encode())
 由于是模拟请求,所以我们首先要把参数换成url格式的,然后又因为urlopen接受的是编码是byte,所以我们要使用encode进行编码

至此,本文结束。

 

长按以识别二维码关注运维家~
微信号:yunweijia0909


往期推荐

01-docker系列-linux下的docker安装

docker下载镜像加速

02-docker系列-镜像分类以及操作(导入、导出、删除)



文章转载自运维家,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论