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

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

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

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

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


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

```

内容概要:本文围绕“计及V2G主动支撑的光伏-储能-电动汽车输配协同日前优化调度”展开研究,提出了一种综合考虑光伏发电、储能系统与电动汽车(EV)在V2G(Vehicle-to-Grid)模式下协同参与电网调度的优化模型。通过Matlab代码实现,构建了日前优化调度框架,充分挖掘电动汽车作为移动储能单元的潜力,利用其双向充放电能力为主动配电网提供调峰、填谷和备用等主动支撑服务。研究综合考虑了可再生能源出力不确定性、负荷需求波动以及电动汽车出行行为特征,建立了多主体、多目标的协同优化机制,旨在降低系统运行成本、提高新能源消纳水平,并增强电网运行的稳定性与可靠性。该资源属于电力系统与综合能源系统领域的高水平科研复现资料,具备较强的理论深度与工程应用价值; 适合人群:具备电力系统分析、优化建模基础及Matlab编程能力的研究生、科研人员,以及从事智能电网、能源互联网、综合能源系统等相关领域技术研发的专业技术人员; 使用场景及目标:①用于学习和复现源-网-荷-储协同优化调度的核心建模方法与求解流程;②掌握V2G技术在电网调频调峰中的数学建模方法及其在优化调度中的集成应用;③支撑光伏、储能与电动汽车耦合系统的低碳经济调度、鲁棒优化或分布鲁棒优化等前沿课题的研究与仿真验证; 阅读建议:建议结合文中提供的Matlab代码与主流优化工具箱(如YALMIP、CPLEX、Gurobi等)进行实践操作,重点理解目标函数设计、约束条件构建及多变量耦合关系的处理策略,同时可进一步拓展至日内滚动优化、实时调度或多时间尺度协调优化方向开展深入研究。
内容概要:本文提出了一种基于改进自适应完备集合经验模态分解(Improved Adaptive Complete Ensemble Empirical Mode Decomposition, ICEEMDAN)的混合储能辅助火电机组调频协同控制策略,并提供了完整的Matlab代码实现。该策略利用ICEEMDAN对电网频率波动信号进行高精度自适应分解,提取不同时间尺度下的功率分量,进而合理分配火电机组与混合储能系统(如蓄电池、飞轮等)的调频任务,充分发挥各自响应速度快慢互补的优势。通过引入优化算法对功率分配系数进行动态整定,实现了调频过程中储能系统的高效协同运行,有效抑制了功率波动,提升了系统频率调节的快速性、稳定性和调节精度,同时延长了储能设备的使用寿命。文中详细阐述了算法原理、模型构建、控制逻辑设计及仿真验证过程,具有较强的可复现性与工程应用价值。; 适合人群:具备电力系统自动化、新能源并网控制或智能优化算法等相关专业知识背景,熟悉Matlab/Simulink仿真平台的技术人员,特别适用于从事电网调频、储能系统控制、信号处理在电力系统中应用等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①深入研究混合储能系统在提升传统火电机组调频性能中的作用机制;②掌握ICEEMDAN等先进非平稳信号处理方法在功率动态分解中的具体实现与参数调优;③构建火电机组-储能协同调频仿真模型,开展多工况对比分析以优化控制性能;④为相关学术论文复现、科研项目申报或实际工程方案设计提供可靠的技术参考与代码支持。; 阅读建议:建议结合Matlab代码逐模块阅读文档内容,重点关注ICEEMDAN的实现流程、IMF分量筛选规则、功率分配权重计算逻辑及整体控制架构的设计思路。读者可通过调整信号噪声水平、滤波参数、储能容量配置等变量进行仿真实验,对比不同策略下的调频效果,从而深化对协同控制机理的理解,并可进一步拓展至风光火储联合系统或多时间尺度协调控制的研究场景。

144

社区成员

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

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