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

queen_qinw queen_qinw 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

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以及所有相关的知识学习是非常需要见识的积累的,有些知识也许并不需要多么精通,但只要知道就能让效率翻番。

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

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

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

...全文

相关推荐

【雷达信号处理】数字下变频(DDC)(Matlab代码实现)

内容概要:本文介绍了基于MATLAB的雷达信号处理中数字下变频(DDC)技术的实现方法,重点阐述了DDC在雷达接收机前端信号处理中的关键作用。通过将高频回波信号下变频至基带,便于后续进行数字化处理与目标信息提取。文中提供了完整的MATLAB代码实现,涵盖混频、低通滤波、抽取等核心步骤,帮助读者理解DDC的工作原理与工程实现细节。; 适合人群:具备一定信号与系统、数字信号处理基础知识,从事雷达、通信或电子工程相关领域的研究生、科研人员及工程技术人员。; 使用场景及目标:①用于教学演示,加深对数字下变频原理的理解;②作为雷达或通信系统仿真项目的基础模块;③辅助科研人员快速搭建信号处理链路,进行算法验证与性能分析。; 阅读建议:建议结合数字信号处理教材中的混频、奈奎斯特采样及多速率信号处理理论进行学习,动手运行并调试代码,尝试调整参数(如本振频率、滤波器阶数、抽取因子)以观察对输出信号的影响,从而深入掌握DDC的设计要点与实际应用。

小念念_

福建省福州新区矢量面数据-02坐标-geojson格式.json

福州新区区划面数据,geojson格式,02坐标

samLi0620

量化数据笔记第2篇:外盘期货历史高频tick数据涵盖主流交易所的活跃合约,以逐笔成交记录为主 字段通常包含品种代码、交易所、日期、精确到毫秒的时间戳、成交价格、成交量、持仓量变化,以及盘口买卖一档挂单

量化数据笔记第2篇:外盘期货历史高频tick数据涵盖主流交易所的活跃合约,以逐笔成交记录为主。字段通常包含品种代码、交易所、日期、精确到毫秒的时间戳、成交价格、成交量、持仓量变化,以及盘口买卖一档挂单价与挂单量。数据保留了原始行情序列,反映微观价格变动与流动性瞬时变化。 数据源:CMES金融数据库

cmes_love

【多机器人路径规划】基于优先级规划与Petri网融合的多机器人路径规划框架研究(Matlab代码实现)

内容概要:本文提出了一种基于优先级规划与Petri网融合的多机器人路径规划框架,旨在解决多机器人系统在共享环境中进行路径规划时可能出现的冲突与死锁问题。该方法结合了优先级规划的高效性与Petri网在建模并发与冲突方面的优势,通过建立形式化的Petri网模型对机器人运动状态进行精确描述,并引入优先级机制动态调整路径执行顺序,从而实现无冲突、无死锁的安全路径规划。研究通过Matlab代码实现了算法仿真,验证了该框架在复杂网格环境下的可行性与有效性,能够有效提升多机器人系统的运行效率与安全性。 适合人群:具备一定自动化、机器人或控制理论基础的科研人员,以及从事智能物流、智能制造、多智能体系统等相关方向的研究生与工程技术人员。 使用场景及目标:①应用于仓储机器人、AGV调度、自动化码头等多移动机器人协同作业场景;②解决多机器人路径规划中的死锁预防、冲突消解与资源竞争问题;③为开发高效、可靠的多智能体路径规划系统提供理论支持与实现参考。 阅读建议:此资源以Matlab代码实现为核心,建议读者在理解Petri网基本原理和优先级调度机制的基础上,结合提供的代码进行仿真实验,通过调整优先级规则与网络结构,深入掌握算法的设计思路与优化方法。

荔枝科研社

碰碰炸挤黑单机游戏,好玩

碰碰炸挤黑单机游戏,好玩

塔◎
评论 1
收藏 已收藏
分享
返回顶部