请问这串代码哪里有问题?


import os
import tkinter as tk
import requests
import tkinter.messagebox as mes_box
import PySimpleGUI as sg
from tkinter import ttk
from retrying import retry

class SetUI(object):
    """
    音乐弹框界面
    """
    def __init__(self, weight=1000, height=600):
        self.ui_height = height
        self.ui_weight = weight
        self.title = "好课优选·音乐破解软件"
        self.ui_root = tk.Tk(className=self.title)
        self.ui_url = tk.StringVar()
        self.ui_var = tk.IntVar()
        self.ui_var.set(1)
        self.show_result = None
        self.song_num = None
        self.response_data = None
        self.song_url = None
        self.song_name = None
        self.song_author = None

    def set_ui(self):
        """
        设置简易UI界面
        :return:
        """
        # Frame空间
        frame_1 = tk.Frame(self.ui_root)
        frame_2 = tk.Frame(self.ui_root)
        frame_3 = tk.Frame(self.ui_root)
        frame_4 = tk.Frame(self.ui_root)

        # ui界面中菜单设计
        ui_menu = tk.Menu(self.ui_root)
        self.ui_root.config(menu=ui_menu)
        file_menu = tk.Menu(ui_menu, tearoff=0)
        ui_menu.add_cascade(label='菜单', menu=file_menu)
        # file_menu.add_command(label='使用说明', command=lambda: webbrowser.open('www.baidu.com'))
        # file_menu.add_command(label='关于作者', command=lambda: webbrowser.open('www.baidu.com'))
        file_menu.add_command(label='退出', command=self.ui_root.quit)

        # 控件内容设置
        choice_passageway = tk.Label(frame_1, text='请选择音乐搜索通道:', padx=10, pady=10)

        input_link = tk.Label(frame_2, text="请输入歌曲名或歌手:")
        entry_style = tk.Entry(frame_2, textvariable=self.ui_url, highlightcolor='Fuchsia', highlightthickness=1,
                               width=35)
        label2 = tk.Label(frame_2, text=" ")
        play_button = tk.Button(frame_2, text="搜索", font=('楷体', 11), fg='Purple', width=2, height=1,
                                command=self.get_KuWoMusic)
        label3 = tk.Label(frame_2, text=" ")
        # 表格样式
        columns = ("序号", "歌手", "歌曲", "专辑")
        self.show_result = ttk.Treeview(frame_3, height=20, show="headings", columns=columns)
        # 下载
        download_button = tk.Button(frame_4, text="下载", font=('楷体', 11), fg='Purple', width=6, height=1, padx=5,
                                    pady=5, command=self.download_music)
        # 控件布局
        frame_1.pack()
        frame_2.pack()
        frame_3.pack()
        frame_4.pack()
        choice_passageway.grid(row=0, column=0)
        # passageway_button_1.grid(row=0, column=1)
        # passageway_button_2.grid(row=0, column=2)
        # passageway_button_3.grid(row=0, column=3)
        # passageway_button_4.grid(row=0, column=4)
        input_link.grid(row=0, column=0)
        entry_style.grid(row=0, column=1)
        label2.grid(row=0, column=2)
        play_button.grid(row=0, column=3, ipadx=10, ipady=10)
        label3.grid(row=0, column=4)
        self.show_result.grid(row=0, column=4)
        download_button.grid(row=0, column=5)

        # 设置表头
        self.show_result.heading("序号", text="序号")
        self.show_result.heading("歌手", text="歌手")
        self.show_result.heading("歌曲", text="歌曲")
        self.show_result.heading("专辑", text="专辑")
        # 设置列
        self.show_result.column("序号", width=100, anchor='center')
        self.show_result.column("歌手", width=200, anchor='center')
        self.show_result.column("歌曲", width=200, anchor='center')
        self.show_result.column("专辑", width=300, anchor='center')

        # 鼠标点击
        self.show_result.bind('<ButtonRelease-1>', self.get_song_url)

    @retry(stop_max_attempt_number=5)
    def get_KuWoMusic(self):
        """
        获取酷我音乐
        :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,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
            'Cache-Control': 'no-cache',
            'Connection': 'keep-alive',
            'Cookie': '_ga=GA1.2.1945985785.1686285909; uname3=A%u5382%u87BA%u4E1D%u5E08%u5085; t3kwid=598952688; userid=598952688; websid=2089835733; pic3=""; t3=weixin; Hm_lvt_cdb524f42f0ce19b169a8071123a4797=1689310897; Hm_token=JsGCZsKsshMzCjbTQmxN8cFAwTdRcT4a; _gid=GA1.2.1018829078.1689603703; Hm_lpvt_cdb524f42f0ce19b169a8071123a4797=1689603703; _gat=1; _ga_ETPBRPM9ML=GS1.2.1689603703.2.1.1689604057.60.0.0; Hm_Iuvt_cdb524f42f0ce19b169b8072123a4727=58JBhBMTyz3fmWcSsMknFNKiktrnYA8y',
            'Secret': '6b64302e92c6a05dc741de26c9b1faae4ef892e6fba377e213087ebffdf82f42005f969c',
            'Host': 'www.kuwo.cn',
            'Pragma': 'no-cache',
            'Referer': 'http://www.kuwo.cn/search/list?key=%E5%91%A8%E6%9D%B0%E4%BC%A6%E5%85%A8%E9%83%A8%E6%AD%8C%E6%9B%B2',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36 Edg/114.0.1823.67'
        }
        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',
                'plat': 'web_www',
                'from': ''
            }
            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('./KuWoMusic'):
            os.mkdir("./KuWoMusic/")
        if self.song_num is not None:
            song_name = self.song_name + '--' + self.song_author + ".mp3"
            try:
                save_path = os.path.join('./KuWoMusic/{}'.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='未选择要下载的歌曲,请选择后下载')

    def progress_bar(self, file_size):
        """
        任务加载进度条
        :return:
        """
        layout = [[sg.Text('任务完成进度')],
                  [sg.ProgressBar(file_size, orientation='h', size=(40, 20), key='progressbar')],
                  [sg.Cancel()]]

        # window只需将自定义的布局加载出来即可 第一个参数是窗口标题。
        window = sg.Window('机器人执行进度', layout)
        # 根据key值获取到进度条
        _progress_bar = window['progressbar']
        for i in range(file_size):  # 循环
            event, values = window.read(timeout=10)
            if event == 'Cancel' or event is None:
                break
            _progress_bar.UpdateBar(i + 1)

    def ui_center(self):
        """
        UI界面窗口设置:居中
        """
        ws = self.ui_root.winfo_screenwidth()
        hs = self.ui_root.winfo_screenheight()
        x = int((ws / 2) - (self.ui_weight / 2))
        y = int((hs / 2) - (self.ui_height / 2))
        self.ui_root.geometry('{}x{}+{}+{}'.format(self.ui_weight, self.ui_height, x, y))

    def loop(self):
        """
        函数说明:loop等待用户事件
        """
        self.ui_root.resizable(False, False)  # 禁止修改窗口大小
        self.ui_center()  # 窗口居中
        self.set_ui()
        self.ui_root.mainloop()

if __name__ == '__main__':
    a = SetUI()
    a.loop()

请问这串代码哪里有问题?好像177行有问题,但是不知道怎么改,请大家指导一下,谢谢!

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/909338
  • 这篇博客也不错, 你可以看下【差分隐私组合定理,直方图,列联表代码实现】差分隐私代码实现系列(五)
  • 除此之外, 这篇博客: 带有反爬虫机制下进行爬取数据方案,这里以阿里拍卖为例中的 反爬虫机制有那些? 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    解决反爬虫之前,我们首先得了解反爬虫机制。

    • ip限制反爬虫:免登录反爬虫一般用访问ip来判断你是否在爬虫获取网站信息,这里百度亲测过。当初写 了一个脚本自动爬取百度搜索的结果信息,结果前面试了几次还好。而到后面数据再用脚本爬取结果人家百度不再返回数据了。
    • 动态网页与加密混淆网页反爬虫:在有的网页中直接查看源码看到的数据如下图,源码要么被加密混淆要么数据是动态加载,也就是通过源码进行爬虫基本是行不通。但这样的页面也有个弊端,就是不利于seo优化,我们都知道seo也是通过爬虫来收录你的个人网站信息的。在这里插入图片描述
    • 强制登录反爬虫:有没有发现当我们通过浏览器搜索淘宝里的商品时,搜索的次数多了直接弹出登录界面,而且后续也不会再让你搜索了。这就是一个典型的强制登录做的反爬虫。我们用代码几乎很难去模拟正常的用户信息。所以这样的反爬虫几乎阻断了一切脚本爬虫。

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

在这段代码中,存在以下问题:

  1. requests.get(self.song_url) 请求可能会抛出异常。如果请求失败,则会引发异常,但是代码没有处理异常。应该使用 try...except 块来捕获异常,并在出现异常时给出适当的错误信息。

  2. 在写入文件时,应该使用 with open(save_path, 'wb') as file: 语句来打开文件,并在完成写操作后自动关闭文件。否则,可能会导致文件句柄泄漏或其他问题。

  3. 在保存文件名时,应该使用 os.path.join() 函数来连接路径和文件名。这将确保在不同操作系统上正确处理路径分隔符。

  4. 在显示消息框时,应该使用 mes_box.showinfo() 函数来显示信息框。mes_box.showinfo() 函数的第一个参数是标题,第二个参数是消息。

综上所述,以下是修改后的代码:

def download_music(self):
    """
    下载音乐
    :return:
    """
    if not os.path.exists('./KuWoMusic'):
        os.mkdir("./KuWoMusic/")
    if self.song_num is not None:
        song_name = self.song_name + '--' + self.song_author + ".mp3"
        try:
            save_path = os.path.join('./KuWoMusic/{}'.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 as e:
            mes_box.showerror(title='错误', message='未找到存放歌曲的文件夹,错误信息为:%s' % e)

注意,在修改后的代码中,我使用了 resp.content() 来获取响应内容,因为 resp.content 返回的是一个字符串,而 resp.content() 返回的是一个字节数组。另外,我还使用了 %s 格式化字符串,以便在错误消息中包含异常信息。