使用python实现的天眼查小工具

此文章已同步更新至我的个人博客https://simonting.gitee.io


前言

帮老同学写的一个python脚本,具体需求主要是绘制一个面板,连接数据库,输入公司名称关键字,查询满足要求的数据,并且带有导出excel功能。数据库中的数据来源于https://blog.csdn.net/King__Cheung/article/details/109484246 这篇博客中通过python脚本调用企查查接口所获取到的数据。

一、代码

#!/usr/bin/python3
# -*- coding: UTF-8 -*-

# pip3 install PyMySQL

import tkinter as tk
from tkinter import messagebox
import pymysql
import csv
import os

window = tk.Tk()
# 标题
window.title('天眼查小工具')
# 窗口大小
window.geometry('900x500+500+250')
# 请输入关键字提示文字
label1 = tk.Label(window, text="请输入关键字:")
# 下方提示文字
label2 = tk.Label(window, text="输入关键字点击查询按钮即可搜索,点击导出数据即可导出为excel文件。")
# 关键字输入框
company_name_input = tk.Entry(window, show=None, font=('微软雅黑', 14))
# 查询结果显示文本框
text = tk.Text(window, width=71, height=14, font=('微软雅黑', 15))
# 滚动条
scroll = tk.Scrollbar()
# 连接数据库
db = pymysql.connect("localhost", "root", "zhangting", "holder")
cursor = db.cursor()
success_text = "程序启动成功。\n数据库连接成功。\n输入关键字开始查询吧..."
text.insert("insert", success_text)
export_res = ()
export_file_name = "data.csv"


# 清空
def reset():
    global export_res
    export_res = ()
    company_name_input.delete(0, "end")
    text.delete(1.0, "end")


# 查询
def search():
    text.delete(1.0, "end")
    key_word = company_name_input.get()
    key_word = str(key_word).lstrip().rstrip()
    get_data(key_word)


# 导出
def export():
    if len(export_res) == 0:
        messagebox.showwarning('提示', '内容为空,无法导出!')
        return
    create_csv_file('data-1')
    csv_file = open(export_file_name, 'a+', newline='')
    try:
        writer = csv.writer(csv_file)
        header = ('股东', '公司', 'Account UserName', 'Primary UserName', 'Account Segment', 'AM Name')
        writer.writerow(header)
        for res in export_res:
            writer.writerow(res)
        abspath = os.path.abspath(export_file_name)
        messagebox.showinfo('提示', '文件导出完成!\n文件地址:' + abspath + "\n")
    finally:
        csv_file.close()


# 生成csv文件,且防止重名
def create_csv_file(file_name):
    if os.path.exists(file_name + '.csv'):
        index = int(file_name.split('-', 1)[1]) + 1
        create_csv_file('data-' + str(index))
    else:
        global export_file_name
        export_file_name = str(file_name) + '.csv'


# 查询按钮
button_search = tk.Button(window, text="查询", bg="LightBlue", font=('微软雅黑', 12), width=6, height=1, command=search)
# 清空按钮
button_reset = tk.Button(window, text="清空", bg="LightCyan", font=('微软雅黑', 12), width=6, height=1, command=reset)
# 导出按钮
button_export = tk.Button(window, text="导出数据", font=('微软雅黑', 12), width=8, height=1, command=export)


# 查询所有数据(包含直接关联与非直接关联的数据)
def execute_sql(key_word):
    if len(key_word) != 0:
        cursor.execute(
            'select share,name,account_username,primary_username,account_segment'
            ',am_name from holder where share in (select share from holder where'
            ' name like \'%' + key_word + '%\')')
    return cursor.fetchall()


# 查询直接关联的数据
def search_direct(key_word):
    if len(key_word) != 0:
        cursor.execute(
            'select share,name,account_username,primary_username,account_segment'
            ',am_name from holder where name like \'%' + key_word + '%\'')
    return cursor.fetchall()


# 查询数据、数据处理
def get_data(key_word):
    content = '请输入关键字!'
    if len(key_word) != 0:
        result = execute_sql(key_word)
        result = dig_data(result)
        # 直接关联的数据
        direct_result = search_direct(key_word)
        # 求出非直接关联的公司
        indirect_result = set(result).difference(set(direct_result))
        indirect_result = tuple(indirect_result)
        global export_res
        export_res = result
        if len(result) != 0:
            content = "共查询到" + str(len(result)) + "条与“" + key_word + "”相关的信息:\n股东" \
                      + " - " + "公司" + " - " + "Account UserName" \
                      + " - " + "Primary UserName" + " - " + "Account Segment" \
                      + " - " + "AM Name" + "\n"
            content += "------------------------------\n与“" + key_word + "”直接关联的数据为:\n"
            i = 1
            for res in direct_result:
                content += str(i) + "、" + res[0] + "  -  " + res[1] + "  -  " + res[2] \
                           + "  -  " + res[3] + "  -  " + res[4] + "  -  " \
                           + res[5] + "\n"
                i += 1
            content += "------------------------------\n与“" + key_word + "”非直接关联的数据为:\n"
            if len(indirect_result) != 0:
                for res in indirect_result:
                    content += str(i) + "、" + res[0] + "  -  " + res[1] + "  -  " + res[2] \
                               + "  -  " + res[3] + "  -  " + res[4] + "  -  " \
                               + res[5] + "\n"
                    i += 1
            else:
                content += "无数据\n"
        else:
            content = "未查询到任何与“" + key_word + "”相关的结果!"
    text.insert("insert", content)
    db.commit()


# 数据挖掘
def dig_data(result):
    all_company = ""
    for res in result:
        all_company += res[1]
    data = ()
    for res in result:
        share = str(res[0])
        if share.endswith("公司"):
            data += execute_sql(share)
    return tuple(set(result + data))


# 控件布局
def main():
    # "请输入关键字"提示文字坐标
    label1.place(x=10, y=20)
    # 关键字输入框坐标
    company_name_input.place(x=100, y=17)
    # 关键字输入框的长度与宽度
    company_name_input.place(width=590, height=30)
    # 查询按钮坐标
    button_search.place(x=720, y=12)
    # 清空按钮坐标
    button_reset.place(x=800, y=12)
    # 查询结果显示文本框坐标
    text.place(x=12, y=60)
    # 滚动条的位置
    scroll.pack(side=tk.RIGHT, fill=tk.Y)
    scroll.config(command=text.yview)
    text.config(yscrollcommand=scroll.set)
    # 导出按钮坐标
    button_export.place(x=780, y=455)
    # 下方提示文字坐标
    label2.place(x=10, y=465)
    window.mainloop()


if __name__ == '__main__':
    main()

功能截图

查询功能:

  • 1、 支持向下挖掘一层
  • 2、支持直接关联数据与非直接关联数据分开显示
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

导出功能:

导出文件名支持自动重命名,不会覆盖之前导出的文件。
在这里插入图片描述

内容为空,无法导出:
在这里插入图片描述

导出的excel示例:

在这里插入图片描述

数据库数据示例:

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值