0
点赞
收藏
分享

微信扫一扫

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


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

1、urlencode函数

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

示例:

from urllib import parse

jier = {'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, request

jier = {'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 parse
jier = 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 parse

Url = '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 parse

Url = '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 : https
netloc : www.baidu.com
path : /s
params :
query : {'wd': ['刘亦菲'], 'ie': ['UTF-8']}
fragment : 2
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')

4、request.Request函数

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

示例:

from urllib import request

jier = {
'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/


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

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

from urllib import request, parse

Url = '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进行编码

至此,本文结束。

更多内容请转至VX公众号 “运维家” ,获取最新文章。

------ “运维家”  ------

------ “运维家”  ------

------ “运维家”  ------

linux卸载硬盘,win7共享linux,linuxgdal安装,Linux7忘记密码,linux怎么进入文件的子目录,高通开源代码linux,linuxusr大小,重启服务器的linux命令,linux的jdk怎么安装啊;

linuxtar文件打不开,linux常用状态检测,linux成功开机界面,linux七种文件,linux命令死机,Linux+删除数据的命令,linux自动监听重启服务器,如何快速担任linux运维,Linux返回到波浪线,linux大数据架构搭建,分析linux被。




举报

相关推荐

java爬取网易云音乐评论

0 条评论