数据集搜集器(百科)008

news2024/11/30 9:23:24

对数据集搜集器(百科)007进行一下改进:
错误处理:增加更多的错误处理,比如网络请求超时、解析错误等。
用户界面:增加一些提示信息,让用户更清楚当前的操作状态。
多线程处理:确保多线程处理更加安全,避免多个线程同时操作同一资源。
日志记录:增加更多的日志记录,方便调试和追踪问题。
配置文件:引入配置文件,方便修改一些常量(如记录文件夹名称)。
完善后的代码
python

import tkinter as tk
from tkinter import filedialog, messagebox
import requests
from bs4 import BeautifulSoup
import json
import os
import threading
from tkinter import ttk
import logging

# 配置日志
logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 读取配置文件
CONFIG_FILE = 'config.json'
DEFAULT_CONFIG = {
    "record_folder": "记录",
    "log_file": "app.log"
}

def load_config():
    if os.path.exists(CONFIG_FILE):
        with open(CONFIG_FILE, 'r', encoding='utf-8') as file:
            return json.load(file)
    return DEFAULT_CONFIG

config = load_config()

class BaikeSearchApp:
    def __init__(self, root):
        self.root = root
        self.root.title("百度百科查询工具")

        # 创建输入框
        self.input_label = tk.Label(root, text="输入问题:")
        self.input_label.pack(pady=5)
        self.input_entry = tk.Entry(root, width=80)
        self.input_entry.pack(pady=5)

        # 创建文本框
        self.text = tk.Text(root, wrap='word', height=20, width=80)
        self.text.pack(pady=10)

        # 创建按钮
        self.load_button = tk.Button(root, text="加载文件", command=self.load_file)
        self.load_button.pack(side=tk.LEFT, padx=10)

        self.query_button = tk.Button(root, text="获取回答", command=self.get_answer)
        self.query_button.pack(side=tk.LEFT, padx=10)

        self.save_button = tk.Button(root, text="保存记录", command=self.save_record)
        self.save_button.pack(side=tk.LEFT, padx=10)

        self.history_button = tk.Button(root, text="查看历史记录", command=self.show_history)
        self.history_button.pack(side=tk.LEFT, padx=10)

        self.help_button = tk.Button(root, text="帮助", command=self.show_help)
        self.help_button.pack(side=tk.LEFT, padx=10)

        # 创建状态栏
        self.status_var = tk.StringVar()
        self.status_bar = tk.Label(root, textvariable=self.status_var, bd=1, relief=tk.SUNKEN, anchor=tk.W)
        self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)

        # 创建进度条
        self.progress = ttk.Progressbar(root, orient="horizontal", length=300, mode="determinate")
        self.progress.pack(pady=10)

        # 初始化历史记录
        self.history = []

        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def on_closing(self):
        if hasattr(self, 'thread') and self.thread.is_alive():
            messagebox.showinfo("提示", "请等待所有任务完成后再关闭窗口。")
        else:
            self.root.destroy()

    def load_file(self):
        file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt")])
        if file_path:
            with open(file_path, 'r', encoding='utf-8') as file:
                lines = file.readlines()
                total_lines = len(lines)
                self.progress["maximum"] = total_lines
                for i, line in enumerate(lines):
                    self.text.insert(tk.END, f"问题: {line.strip()}\n")
                    self.get_answer(line.strip())
                    self.progress["value"] = i + 1
                    self.root.update_idletasks()
            self.status_var.set(f"已加载文件: {file_path}")

    def get_answer(self, query=None):
        if not query:
            query = self.input_entry.get().strip()
            if not query:
                query = self.text.get("insert linestart", "insert lineend").strip()
            if not query:
                messagebox.showwarning("警告", "请先输入或选择一个问题")
                return

        self.status_var.set(f"正在查询: {query}")
        logging.info(f"开始查询: {query}")
        self.thread = threading.Thread(target=self._get_answer, args=(query,))
        self.thread.start()

    def _get_answer(self, query):
        url = f"https://baike.baidu.com/item/{query}"
        try:
            response = requests.get(url, timeout=10)
            response.raise_for_status()
            soup = BeautifulSoup(response.content, 'html.parser')

            # 从<meta>标签中提取描述
            description_tag = soup.find('meta', attrs={'name': 'description'})
            if description_tag and 'content' in description_tag.attrs:
                content = description_tag['content']
            else:
                content = "未找到相关词条"

            answer = {
                "question": query,
                "human_answers": [content],
                "chatgpt_answers": [content]
            }

            formatted_answer = f"问题: {query}\n答案: {content}\n\n"
            self.text.insert(tk.END, formatted_answer)
            self.history.append(answer)
            self.status_var.set(f"查询完成: {query}")
            logging.info(f"查询完成: {query}")
        except requests.RequestException as e:
            self.text.insert(tk.END, f"请求失败: {e}\n")
            self.status_var.set("请求失败")
            logging.error(f"请求失败: {e}")

    def save_record(self):
        record_folder = config["record_folder"]
        if not os.path.exists(record_folder):
            os.makedirs(record_folder)

        with open(os.path.join(record_folder, "bata.txt"), 'w', encoding='utf-8') as file:
            for record in self.history:
                file.write(json.dumps(record, ensure_ascii=False) + "\n")
        self.status_var.set("记录已保存")

    def show_history(self):
        history_window = tk.Toplevel(self.root)
        history_window.title("历史记录")

        history_text = tk.Text(history_window, wrap='word', height=20, width=80)
        history_text.pack(pady=10)

        for record in self.history:
            history_text.insert(tk.END, json.dumps(record, ensure_ascii=False) + "\n")

        clear_button = tk.Button(history_window, text="清空历史记录", command=self.clear_history)
        clear_button.pack(pady=10)

    def clear_history(self):
        self.history = []
        self.text.delete(1.0, tk.END)
        self.status_var.set("历史记录已清空")

    def show_help(self):
        help_window = tk.Toplevel(self.root)
        help_window.title("帮助文档")

        help_text = tk.Text(help_window, wrap='word', height=20, width=80)
        help_text.pack(pady=10)

        help_content = """
        使用说明:
        1. 在输入框中输入问题,点击“获取回答”按钮查询答案。
        2. 点击“加载文件”按钮,选择包含问题的文本文件,批量查询答案。
        3. 查询结果会显示在文本框中,并自动保存到历史记录。
        4. 点击“保存记录”按钮,将历史记录保存到文件中。
        5. 点击“查看历史记录”按钮,查看和管理历史记录。
        6. 点击“帮助”按钮,查看使用说明。
        """
        help_text.insert(tk.END, help_content)

if __name__ == "__main__":
    root = tk.Tk()
    app = BaikeSearchApp(root)
    root.mainloop()

主要改进点

配置文件:引入了 config.json 文件来存储一些常量,如记录文件夹名称。
错误处理:增加了网络请求的超时处理。
日志记录:增加了更多的日志记录,方便调试和追踪问题。
用户界面:增加了更多的状态提示,让用户更清楚当前的操作状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250340.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数据集划分】训练集train/验证集val/测试集test是如何划分的?

&#x1f680;在跑代码时常常将数据集简单的划分为训练集train和测试集test(二划分)&#xff0c;其实更为全面完整的划分应该是划分为训练集train、验证集val、测试集test(三划分)。那么具体如何划分呢&#xff1f;各个部分起着什么作用呢&#xff1f; 如下图所示&#xff0c;…

Gentoo Linux部署LNMP

一、安装nginx 1.gentoo-chxf ~ # emerge -av nginx 提示配置文件需更新 2.gentoo-chxf ~ # etc-update 3.gentoo-chxf ~ # emerge -av nginx 4.查看并启动nginx gentoo-chxf ~ # systemctl status nginx gentoo-chxf ~ # systemctl start nginx gentoo-chxf ~ # syst…

Ubantu系统非root用户安装docker教程

非root用户没有超级权限&#xff0c;根据docker安装教程安装完毕会发现无法拉取镜像&#xff0c;或者每次运行docker都需要加上sudo&#xff0c;输入密码验证。 解决办法如下&#xff1a; 1、创建docker用户组 sudo groupadd docker2、将非root用户&#xff08;当前用户&am…

python可视化高纬度特征

可视化网络的特征层&#xff0c;假如resnet网络输出的特征维度是(batch_size,512). 如果要可视化测试集的每个图片的512高维度特征分布呢&#xff1f; embeds resnet18(x)&#xff0c;embeds是(batch_size,512)高维度特征。如下可视化。 import torch import matplotlib.pyp…

OceanBase 大数据量导入(obloader)

现需要将源数据库&#xff08;Oracle|MySQL等&#xff09;一些表的海量数据迁移到目标数据库 OceanBase 中&#xff0c;基于常规 jdbc 驱动编码的方式涉及开发工作&#xff0c;性能效率也要看编码的处理机制。 OceanBase 官方提供了的 OceanBase Migration Service (OMS) 数据…

Mac启动服务慢问题解决,InetAddress.getLocalHost().getHostAddress()慢问题。

项目启动5分钟&#xff0c;很明显有问题。像网上其他的提高jvm参数就不说了&#xff0c;应该不是这个问题&#xff0c;也就快一点。 首先找到自己的电脑名称&#xff08;用命令行也行&#xff0c;只要能找到自己电脑名称就行&#xff0c;这里直接在共享里看&#xff09;。 复制…

Ubuntu交叉编译 opencv for QNX

前言 在高通板子上开发一些程序的时候,会用到opencv帮助处理一下图像数据,高通车载板子sa8155和sm8295都有QNX os,需要交叉编译opencv的库,(这个交叉编译真是搞得我太恶心了,所以进行一个记录和分享) 搜了很多资料,有些太过于复杂,有些也存在错误导致最后没有编译成…

.NET 9 AOT的突破 - 支持老旧Win7与XP环境

引言 随着技术的不断进步&#xff0c;微软的.NET 框架在每次迭代中都带来了令人惊喜的新特性。在.NET 9 版本中&#xff0c;一个特别引人注目的亮点是 AOT&#xff08; Ahead-of-Time&#xff09;支持&#xff0c;它允许开发人员将应用程序在编译阶段就优化为能够在老旧的 Win…

Mac 环境下类Xshell 的客户端介绍

在 Mac 环境下&#xff0c;类似于 Windows 环境中 Xshell 用于访问 Linux 服务器的工具主要有以下几种&#xff1a; SecureCRT&#xff1a; 官网地址&#xff1a;https://www.vandyke.com/products/securecrt/介绍&#xff1a;支持多种协议&#xff0c;如 SSH1、SSH2、Telnet 等…

Cookie跨域

跨域&#xff1a;跨域名&#xff08;IP&#xff09; 跨域的目的是共享Cookie。 session操作http协议&#xff0c;每次既要request&#xff0c;也要response&#xff0c;cookie在创建的时候会产生一个字符串然后随着response返回。 全网站的各个页面都会带着登陆的时候的cookie …

虚拟机CentOS系统通过Docker部署RSSHub并映射到主机

公告 &#x1f4cc;更新公告 20241124-该文章已同步更新到作者的个人博客&#xff08;链接&#xff1a;虚拟机CentOS系统通过Docker部署RSSHub并映射到主机&#xff09; 一、编辑 YUM 配置文件 1、打开 CentOS 系统中的 YUM 软件仓库配置文件 vim /etc/yum.repos.d/CentOS-Ba…

DreamCamera2相机预览变形的处理

最近遇到一个问题&#xff0c;相机更换了摄像头后&#xff0c;发现人像角度顺时针旋转了90度&#xff0c;待人像角度正常后&#xff0c;发现 预览时图像有挤压变形&#xff0c;最终解决。在此记录 一人像角度的修改 先放示意图 设备预览人像角度如图1所示&#xff0c;顺时针旋…

Taro React小程序开发框架 总结

目录 一、安装 二、目录结构 三、创建一个自定义页面 四、路由 1、API 2、传参 3、获取路由参数 4、设置TabBar 五、组件 六、API Taro非常好用的小程序框架&#xff0c;React开发者无缝衔接上。 一、安装 官方文档&#xff1a;Taro 文档 注意&#xff0c;项目创建…

RPA:电商订单处理自动化

哈喽&#xff0c;大家好&#xff0c;我是若木&#xff0c;最近闲暇时间较多&#xff0c;于是便跟着教程做了一个及RPA&#xff0c;谈到这个&#xff0c;可能很多人并不是很了解&#xff0c;但是实际上&#xff0c;这玩意却遍布文末生活的边边角角。话不多说&#xff0c;我直接上…

通过金蝶云星空实现高效仓储管理

金蝶云星空数据集成到旺店通WMS的技术案例分享 在企业日常运营中&#xff0c;库存管理和物流调度是至关重要的环节。为了实现高效的数据流转和业务协同&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将金蝶云星空的数据无缝对接到旺店通WMS。本次案例聚焦于“调拨入库…

go结构体匿名“继承“方法冲突时继承优先顺序

在 Go 语言中&#xff0c;匿名字段&#xff08;也称为嵌入字段&#xff09;可以用来实现继承的效果。当你在一个结构体中匿名嵌入另一个结构体时&#xff0c;嵌入结构体的方法会被提升到外部结构体中。这意味着你可以直接通过外部结构体调用嵌入结构体的方法。 如果多个嵌入结…

丹摩|丹摩智算平台使用教学指南

本指南旨在为新用户提供一个详细的操作步骤和实用的入门指导&#xff0c;帮助大家快速上手丹摩智算平台。 一、平台简介 丹摩智算平台是一款强大的数据分析和计算平台&#xff0c;支持多种编程语言&#xff0c;提供丰富的数据处理和机器学习工具。无论您是数据分析师、开发者…

从网桥到交换机:技术演变与应用场景

交换机和网桥是网络基础设施中不可或缺的设备&#xff0c;它们都用于提升网络性能和连接网络节点。然而&#xff0c;两者在设计目的、功能范围和适用场景上存在诸多不同之处。本文将从功能、差异和相互关系的角度&#xff0c;探讨交换机与网桥在网络中的角色。 交换机的功能与特…

ollama部署bge-m3,并实现与dify平台对接

概述 这几天为了写技术博客,各种组件可谓是装了卸,卸了装,只想复现一些东西,确保你们看到的东西都是可以复现的。 (看在我这么认真的份上,求个关注啊,拜托各位观众老爷了。) 这不,为了实验在windows上docker里运行pytorch,把docker重装了。 dify也得重装: Dify基…

《String类》

目录 一、定义与概述 二、创建字符串对象 2.1 直接赋值 2.2 使用构造函数 三、字符串的不可变性 四、常用方法 4.1 String对象的比较 4.1.1 比较是否引用同一个对象 4.1.2 boolean equals(Object anObject)方法&#xff1a;按照字典序比较 4.1.3 int compareTo(Strin…