Python PyQt5 实现天眼查小程序数据抓取与GUI展示
本文详细介绍如何使用Python和PyQt5框架开发一个包含天眼查查询功能的桌面GUI程序。文章涵盖了界面布局设计、样式美化以及通过抓包获取小程序API接口的核心步骤。重点解析了如何构造请求头、处理Authorization令牌及调用API获取公司数据,并展示了将结果集成至GUI组件的完整代码实现。
今天我们将一起开发一个基于Python的天眼查图形用户界面(GUI)程序。首先,让我们直观地看一下最终实现的程序效果。

在本项目中,我们选用的GUI开发框架是PyQt5。相较于其他常见框架如tkinter,该框架提供了更为丰富的内置组件库,并且在界面视觉美化和交互体验方面表现出显著优势。
从展示的效果图中可以看出,我们的开发目标具有相当的扩展性。最终愿景是构建一个多功能工具集,将日常常用功能整合至该GUI程序中,例如集成天眼查企业信息查询、知乎用户知识图谱分析以及B站视频弹幕抓取等功能。
为了聚焦核心功能,本次教程首先专注于实现天眼查信息查询模块。
界面搭建
如前所述,本GUI程序的整体视觉效果尚可(暂且用“不丑”来形容)。尽管目前可能仅停留在视觉层面的基本美观,但其背后的样式定制与美化工作实际上相当繁琐且细致。
在此过程中,我们参考了网络上优秀开发者提供的开源基础代码。特别感谢“州的先生”在PyQt5领域的深入研究与分享,建议读者关注其相关资源以获取更多技术细节。
整体布局
首先,我们需要对程序界面的整体布局结构进行大致梳理。
界面在逻辑上主要划分为左侧的功能导航Widget和右侧的内容显示Widget两部分。
左侧 Widget 部分代码
def leftWidget(self):
self.left_close = QtWidgets.QPushButton(qtawesome.icon('fa.close', color='white'), "") # 关闭按钮
self.left_visit = QtWidgets.QPushButton(qtawesome.icon('fa.circle-o', color='white'), "") # 空白按钮
self.left_mini = QtWidgets.QPushButton(qtawesome.icon('fa.minus', color='white'), "") # 最小化按钮
self.left_label_1 = QtWidgets.QPushButton("网络抓取")
self.left_label_1.setObjectName('left_label')
self.left_label_2 = QtWidgets.QPushButton("待开发")
self.left_label_2.setObjectName('left_label')
self.left_label_3 = QtWidgets.QPushButton("联系与帮助")
self.left_label_3.setObjectName('left_label')
self.left_button_1 = QtWidgets.QPushButton(qtawesome.icon('fa.eye', color='white'), "天眼查")
self.left_button_1.setObjectName('left_button')
self.left_button_2 = QtWidgets.QPushButton(qtawesome.icon('fa.bullhorn', color='white'), "知乎")
self.left_button_2.setObjectName('left_button')
self.left_button_3 = QtWidgets.QPushButton(qtawesome.icon('fa.bold', color='white'), "B站")
self.left_button_3.setObjectName('left_button')
...左侧区域主要负责功能按钮的布局与管理。我们可以将所有相关按钮的初始化与排列逻辑封装在一个独立的函数中完成。
对于右侧 Widget,我们需要根据用户选择的不同的功能模块进行区分处理,例如针对天眼查查询功能的特定逻辑。
def tianyanchaWidget(self):
self.left_button_widget_1 = QtWidgets.QWidget()
self.left_button_widget_1.setGeometry(QtCore.QRect(10, 10, 591, 461))
self.left_button_widget_1.setObjectName("left_button_1")
self.gridLayout = QtWidgets.QGridLayout(self.left_button_widget_1)
self.gridLayout.setContentsMargins(0, 0, 0, 0)
self.gridLayout.setObjectName("gridLayout")
self.lineEdit = QtWidgets.QLineEdit()
self.lineEdit.setObjectName("lineEdit")
self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 7)
self.pushButton = QtWidgets.QPushButton(qtawesome.icon('fa.search', color='black'), "Search")
self.pushButton.setObjectName("pushButton")
self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
# 下载按钮
self.downButton = QtWidgets.QPushButton(qtawesome.icon('fa.download', color='black'), "Download")
self.downButton.setObjectName("downButton")
self.gridLayout.addWidget(self.downButton, 0, 8, 1, 1)
self.textEdit = QtWidgets.QTextEdit(self.left_button_widget_1)
self.textEdit.setObjectName("textEdit")
self.gridLayout.addWidget(self.textEdit, 3, 0, 1, 9)
self.right_layout.addWidget(self.left_button_widget_1, 0, 0, 1, 9)
为各个功能模块设置独立的QtWidgets.QWidget()实例,这样便于后续实现点击左侧不同按钮时,右侧界面能够动态切换至对应的功能视图。
上述内容构成了程序的大致布局框架。此外,还有一些界面美化细节需要处理,接下来我们将简要介绍这部分工作。
界面美化
在美化工作中,我们主要依赖setStyleSheet函数来执行。其核心逻辑是为各个UI组件添加特定的样式表,这与Web开发中CSS的作用机制类似。
优化函数
def leftStyle(self):
self.left_close.setFixedSize(15, 15) # 设置关闭按钮的大小
self.left_visit.setFixedSize(15, 15) # 设置按钮大小
self.left_mini.setFixedSize(15, 15) # 设置最小化按钮大小
self.left_close.setStyleSheet(
'''QPushButton{background:#F76677;border-radius:5px;}QPushButton:hover{background:red;}''')
self.left_visit.setStyleSheet(
'''QPushButton{background:#F7D674;border-radius:5px;}QPushButton:hover{background:yellow;}''')
self.left_mini.setStyleSheet(
'''QPushButton{background:#6DDF6D;border-radius:5px;}QPushButton:hover{background:green;}''')
self.left_widget.setStyleSheet('''
QPushButton{border:none;color:white;}
QPushButton#left_label{
border:none;
border-bottom:1px solid white;
font-size:18px;
font-weight:700;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
QPushButton#left_button:hover{border-left:4px solid red;font-weight:700;}
QWidget#left_widget{
background:gray;
border-top:1px solid white;
border-bottom:1px solid white;
border-left:1px solid white;
border-top-left-radius:10px;
border-bottom-left-radius:10px;
}
''')
从代码实现可以看出,美化过程本质上就是编写和注入样式规则的过程。对于熟悉CSS样式的开发者而言,这一部分的逻辑应当十分直观且易于掌握。
至此,界面构建部分已基本完成。接下来,我们将重点探讨天眼查数据抓取的核心实现逻辑。
天眼查爬虫
天眼查是一个广为人知的平台,主要用于查询企业和个人的相关公开信息。
获取信息
鉴于该网站拥有较为完善的反爬虫机制,直接爬取Web端数据难度较大。因此,我们转而针对其微信小程序进行抓包分析。通过捕获小程序请求公司数据时的header结构以及对应的URL地址,我们可以获取关键的接口参数。随后,我们使用Postman工具对获取到的接口进行初步测试,验证其有效性。

在实际调用上述URL时,只需在header请求头中携带特定的Authorization字段即可。经过实际测试,该Authorization令牌具有较长的有效期,具体过期时间虽未完全明确,但实测中获取一次后可长期使用,这大大简化了开发流程。
代码编写
在明确了请求方法后,编写具体的数据获取代码便成为相对简单的步骤。
def query(self):
company_name = self.lineEdit.text()
if not company_name:
QMessageBox.information(self, "Error", "公司名称不能为空",
QMessageBox.Yes)
return
# 获取基本信息
headers = {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36',
'version': 'TYC-XCX-WX',
'Host': 'api9.tianyancha.com',
'Authorization': '0###2088812821785822###1661951360266###fec9a76739ba0efd0a7f8b0b4a9a0074',
}
url = f'https://api9.tianyancha.com/services/v3/search/sNorV3/{company_name}'
response = requests.get(url, headers=headers)
response_json, data = response.json(), dict()
if response_json['state'] == 'ok':
data = response_json.get('data', {})
...
上述函数负责返回经过处理的公司信息数据。随后,我们通过绑定Button组件的点击事件来调用该函数,并将获取到的数据输出显示在textEdit组件中。
self.pushButton.clicked.connect(self.query)
self.textEdit.setText(company_info_str)
至此,我们完成的天眼查查询工具的主要功能模块已全部实现。
结果展示
下面,让我们通过实际运行来查看最终的程序效果。

到此,关于基于Python制作天眼查小程序GUI工具的示例代码介绍完毕。如需了解更多Python相关技术内容,欢迎查阅本站往期文章或继续关注后续更新,感谢大家的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













