20221323侯冒祯 《Python程序设计》实验四报告

queen_qinw 2023-05-28 11:25:31

20221323侯冒祯 《Python程序设计》实验四报告

课程:《Python程序设计》
班级: 2213
姓名: 侯冒祯
学号:20221323
实验教师:王志强
实验日期:2023年5月10日
必修/选修: 公选课

1.实验内容

利用爬虫技术爬取各音乐软件歌曲

2.实验过程及结果

1.设计思路:

底层逻辑->额外模块->运行模式

(解释:这个爬虫功能的实现需要用到外部的模块;运行模式指加载出较为规整的窗口方便操作)

2.部分核心代码思路:

获取数据->下载歌曲地址->下载音乐

@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='未选择要下载的歌曲,请选择后下载')

3.关于窗口操作的学习:

这一块功能的实现是我在python课程中以外单独接触的部分,python课上有提到过但并未细致讲解。我自己最初接触到的是pyqt6,有人将类似的功能概念称为功能可视化。由于一些原因,这次实验过程中我的pyqt6在现在使用的设备上装配失败了,所以借用了其他已经较为成熟的模块以实现此功能。

4.实验结果截屏(视频未能上传成功,请在要求打包好的压缩包中查看)

img

img

3.实验中遇到的问题及解决过程

1.pyqt6装配失败的问题
解决:放弃使用pyqt6,换用其他模块
2.窗口不规整
解决:学习设置表格

其他

这次实验是一个综合实践,在做实验的时候能感受到对于python小白来说巨大的体量以及过于丰富的知识。通过这段时间的学习,很明显感觉python以及所有相关的知识学习是非常需要见识的积累的,有些知识也许并不需要多么精通,但只要知道就能让效率翻番。

对于我来说,这次实验的主要过程更多的是模仿性学习,创造性学习的部分并不多。但是,当自己最终实现了一个完整的、并且是自己觉得“高攀不起”的功能时,心中还是产生了成就感。

在这次实验中,“功能可视化”的概念相关的学习让我收获颇多。虽然这个实验的本体是爬虫技术,但“功能可视化”极大程度地拓宽了我的视野。

其实实验中遇到的问题还是挺多的,远远不止上述的两点,但是其他的问题的解决要么是较为简单,知识缺乏经验,要么是即使已经解决了也还是糊里糊涂。从这点来说,这个实验还等着我去学习研究。

...全文
312 1 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
于扶摇 2023-05-28
  • 打赏
  • 举报
回复


```python
c = Calculator()  
c.input('2')  
c.input('*')  
c.input('3')  
print(c)  # 输出:6.0  
```以上代码创建了一个新的计算器对象`c`,输入两个数字23,并执行乘法运算。最后输出结果为6.0

```

144

社区成员

发帖
与我相关
我的任务
社区描述
开展Python教学和技术交流
python 高校 北京·丰台区
社区管理员
  • blackwall0321
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧