20183411 李丞灏 2019-2020 《python程序设计》 实验四 爬取QQ音乐中周杰伦歌单 实验报告

20183411 李丞灏 2019-2020 《python程序设计》 实验四 爬取QQ音乐中周杰伦歌单 实验报告

课程:《Python程序设计》
班级: 1834
姓名: 李丞灏
学号:20183411
实验教师:王志强老师
实验日期:2020年6月9日
必修/选修: 公选课

1、实验内容:

爬取QQ音乐中周杰伦的歌单,并输出歌名、时长、网址等信息。

2、实验过程及结果:

代码如下:

'''
学号:20183411
姓名:李丞灏
'''
import requests

# 引用requests库
res_music = requests.get(
    'https://c.y.qq.com/soso/fcgi-bin/client_search_cp?ct=24&qqmusic_ver=1298&new_json=1&remoteplace=txt.yqq.song&searchid=60997426243444153&t=0&aggr=1&cr=1&catZhida=1&lossless=0&flag_qc=0&p=1&n=20&w=%E5%91%A8%E6%9D%B0%E4%BC%A6&g_tk=5381&loginUin=0&hostUin=0&format=json&inCharset=utf8&outCharset=utf-8&notice=0&platform=yqq.json&needNewCode=0')
# 调用get方法,下载这个字典
json_music = res_music.json()
# 使用json()方法,将response对象,转为列表/字典
list_music = json_music['data']['song']['list']
# 一层一层地取字典,获取歌单列表
for music in list_music:
    # list_music是一个列表,music是它里面的元素
    print(music['name'])
    # 打印歌曲名
    print('专辑名:' + music['album']['name'])
    # 所属专辑名
    print('播放时长:' + str(music['interval']) + '秒')
    # 播放时长
    print('播放地址:' + 'https://y.qq.com/n/yqq/song/' + music['mid'] + '.html\n')

# 爬取所有歌曲页面
import requests

# 引用requests模块
url = 'https://c.y.qq.com/soso/fcgi-bin/client_search_cp'
for x in range(200):

    params = {
        'ct': '24',
        'qqmusic_ver': '1298',
        'new_json': '1',
        'remoteplace': 'sizer.yqq.song_next',
        'searchid': '64405487069162918',
        't': '0',
        'aggr': '1',
        'cr': '1',
        'catZhida': '1',
        'lossless': '0',
        'flag_qc': '0',
        'p': str(x + 1),
        'n': '20',
        'w': '周杰伦',
        'g_tk': '5381',
        'loginUin': '0',
        'hostUin': '0',
        'format': 'json',
        'inCharset': 'utf8',
        'outCharset': 'utf-8',
        'notice': '0',
        'platform': 'yqq.json',
        'needNewCode': '0'
    }
    # 将参数封装为字典
    res_music = requests.get(url, params=params)
    # 调用get方法,下载这个字典
    json_music = res_music.json()
    # 使用json()方法,将response对象,转为列表/字典
    list_music = json_music['data']['song']['list']
    # 一层一层地取字典,获取歌单列表
    for music in list_music:
        # list_music是一个列表,music是它里面的元素
        print(music['name'])
        # 以name为键,查找歌曲名
        print('所属专辑:' + music['album']['name'])
        # 查找专辑名
        print('播放时长:' + str(music['interval']) + '秒')
        # 查找播放时长
        print('播放链接:https://y.qq.com/n/yqq/song/' + music['mid'] + '.html\n\n')
        # 查找播放链接

运行结果如下:
alt 运行图片
代码码云的链接:
码云链接:

3、实验中遇到的问题:

这次实验对于我来说是一次深度的学习,由于之前对于爬取网页的认知还停留在看过一些教程视频的程度,所以在实际的操作中难免会有问题,
首先是解决URL的问题,先进入了开发者模式,然后对其中的网络进行分析,发现有很多URL,于是只能一个个的找,最终在一个以json命名的
文件中找到了一个很长的URL,看网上的解说,这个一长串中有很多是对我们无用的信息,但由于我不会分析只能全盘接收,之后就是写分析的
代码了,先用Beautifulsoup进行处理,发现效果并不理想,返回的值大多是空值,在提取a title时也只能返回歌曲MV的网址,因此在借鉴网
络中其他人的方法时发现得通过别的方式爬取,找到网页中各个元素的位置,再进行分析,通过一层层的爬取得到了结果。

其他(感悟、思考等)

这次的实验不仅让我丰富了对于爬虫技术的经验,也同时加深了我对于网络网页构成的理解,获益良多。

参考资料:

网络上有关知识
蓝墨云资料

posted @ 2020-06-14 20:25  李丞灏  阅读(546)  评论(0编辑  收藏  举报