144
社区成员




课程:《Python程序设计》
班级: 2213
姓名: 侯冒祯
学号:20221323
实验教师:王志强
实验日期:2023年5月10日
必修/选修: 公选课
利用爬虫技术爬取各音乐软件歌曲
底层逻辑->额外模块->运行模式
(解释:这个爬虫功能的实现需要用到外部的模块;运行模式指加载出较为规整的窗口方便操作)
获取数据->下载歌曲地址->下载音乐
@retry(stop_max_attempt_number=5)
def get_KuWoMusic(self):
"""
获取qq音乐
:return:
"""
# 清空treeview表格数据
for item in self.show_result.get_children():
self.show_result.delete(item)
headers = {
'accept': 'application/json, text/plain, */*',
'accept - encoding': 'gzip, deflate',
'accept - language': 'zh - CN, zh;q = 0.9',
'cache - control': 'no - cache',
'Connection': 'keep-alive',
'csrf': 'HH3GHIQ0RYM',
'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6',
'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/99.0.4844.51 Safari/537.36',
'Cookie': '_ga=GA1.2.218753071.1648798611; _gid=GA1.2.144187149.1648798611; _gat=1; '
'Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1648798611; '
'Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1648798611; kw_token=HH3GHIQ0RYM'
}
search_input = self.ui_url.get()
if len(search_input) > 0:
search_url = 'http://www.kuwo.cn/api/www/search/searchMusicBykeyWord?'
search_data = {
'key': search_input,
'pn': '1',
'rn': '80',
'httpsStatus': '1',
'reqId': '858597c1-b18e-11ec-83e4-9d53d2ff08ff'
}
try:
self.response_data = requests.get(search_url, params=search_data, headers=headers, timeout=20).json()
songs_data = self.response_data['data']['list']
if int(self.response_data['data']['total']) <= 0:
mes_box.showerror(title='错误', message='搜索: {} 不存在.'.format(search_input))
else:
for i in range(len(songs_data)):
self.show_result.insert('', i, values=(i + 1, songs_data[i]['artist'], songs_data[i]['name'],
songs_data[i]['album']))
except TimeoutError:
mes_box.showerror(title='错误', message='搜索超时,请重新输入后再搜索!')
else:
mes_box.showerror(title='错误', message='未输入需查询的歌曲或歌手,请输入后搜索!')
def get_song_url(self, event):
"""
获取下载歌曲的地址
:return:
"""
# treeview中的左键单击
for item in self.show_result.selection():
item_text = self.show_result.item(item, "values")
# 获取
self.song_num = int(item_text[0])
# 获取下载歌曲的地址
if self.song_num is not None:
songs_data = self.response_data['data']['list']
songs_req_id = self.response_data['reqId']
song_rid = songs_data[self.song_num - 1]['rid']
music_url = 'http://www.kuwo.cn/api/v1/www/music/playUrl?mid={}&type=convert_url3' \
'&httpsStatus=1&reqId={}' \
.format(song_rid, songs_req_id)
response_data = requests.get(music_url).json()
self.song_url = response_data['data'].get('url')
self.song_name = songs_data[self.song_num - 1]['name']
self.song_author = songs_data[self.song_num - 1]['artist']
else:
mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择')
def download_music(self):
"""
下载音乐
:return:
"""
if not os.path.exists('./wangYiYun'):
os.mkdir("./wangYiYun/")
if self.song_num is not None:
song_name = self.song_name + '--' + self.song_author + ".mp3"
try:
save_path = os.path.join('./wangYiYun/{}'.format(song_name)) \
.replace('\\', '/')
true_path = os.path.abspath(save_path)
resp = requests.get(self.song_url)
with open(save_path, 'wb') as file:
file.write(resp.content)
mes_box.showinfo(title='下载成功', message='歌曲:%s,保存地址为%s' % (self.song_name, true_path))
except Exception:
mes_box.showerror(title='错误', message='未找到存放歌曲的文件夹')
else:
mes_box.showerror(title='错误', message='未选择要下载的歌曲,请选择后下载')
这一块功能的实现是我在python课程中以外单独接触的部分,python课上有提到过但并未细致讲解。我自己最初接触到的是pyqt6,有人将类似的功能概念称为功能可视化。由于一些原因,这次实验过程中我的pyqt6在现在使用的设备上装配失败了,所以借用了其他已经较为成熟的模块以实现此功能。
1.pyqt6装配失败的问题
解决:放弃使用pyqt6,换用其他模块
2.窗口不规整
解决:学习设置表格
这次实验是一个综合实践,在做实验的时候能感受到对于python小白来说巨大的体量以及过于丰富的知识。通过这段时间的学习,很明显感觉python以及所有相关的知识学习是非常需要见识的积累的,有些知识也许并不需要多么精通,但只要知道就能让效率翻番。
对于我来说,这次实验的主要过程更多的是模仿性学习,创造性学习的部分并不多。但是,当自己最终实现了一个完整的、并且是自己觉得“高攀不起”的功能时,心中还是产生了成就感。
在这次实验中,“功能可视化”的概念相关的学习让我收获颇多。虽然这个实验的本体是爬虫技术,但“功能可视化”极大程度地拓宽了我的视野。
其实实验中遇到的问题还是挺多的,远远不止上述的两点,但是其他的问题的解决要么是较为简单,知识缺乏经验,要么是即使已经解决了也还是糊里糊涂。从这点来说,这个实验还等着我去学习研究。
```python
c = Calculator()
c.input('2')
c.input('*')
c.input('3')
print(c) # 输出:6.0
```以上代码创建了一个新的计算器对象`c`,输入两个数字2和3,并执行乘法运算。最后输出结果为6.0。
```