Python高效查询企业信息:从API到数据清洗的全流程指南
2025.09.18 16:00浏览量:0简介:本文详细介绍了如何利用Python实现企业信息的自动化查询,涵盖公开API调用、网页爬取、数据清洗及可视化分析,帮助开发者快速构建企业信息检索系统。
一、企业信息查询的核心场景与技术选型
企业信息查询是金融风控、供应链管理、市场调研等领域的核心需求。传统方式依赖人工检索或购买商业数据库,存在成本高、时效性差的问题。Python凭借其丰富的生态库(如requests、pandas、selenium),可实现从公开API到网页爬取的全流程自动化。
技术选型需考虑三方面:
- 数据源合法性:优先选择政府公开平台(如国家企业信用信息公示系统)、第三方授权API(天眼查、企查查部分接口)
- 查询效率:批量查询时建议使用异步请求(aiohttp)或分布式爬虫(Scrapy+Redis)
- 反爬策略应对:通过User-Agent轮换、IP代理池、验证码识别(如tesseract-ocr)突破限制
二、基于公开API的企业信息查询实现
1. 政府平台API调用示例
以国家企业信用信息公示系统为例,其提供部分企业基础信息的JSON接口:
import requests
import json
def query_company_by_name(company_name):
url = "https://www.gsxt.gov.cn/affiche/queryCreditInfo"
params = {
"keyword": company_name,
"pageNum": 1,
"pageSize": 10
}
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
"Referer": "https://www.gsxt.gov.cn/"
}
try:
response = requests.get(url, params=params, headers=headers)
data = response.json()
if data["code"] == 200:
return data["result"]
else:
print(f"API Error: {data['message']}")
return None
except Exception as e:
print(f"Request Failed: {str(e)}")
return None
# 示例调用
results = query_company_by_name("腾讯科技")
if results:
for item in results["list"]:
print(f"企业名称: {item['entName']}, 统一社会信用代码: {item['creditCode']}")
关键点:需遵守平台API使用条款,部分接口需申请权限密钥。
2. 第三方商业API集成
以企查查为例(需申请开发者账号):
import requests
def query_company_by_credit_code(credit_code, api_key):
url = "https://api.qcc.com/open/api/ent/info"
params = {
"key": api_key,
"creditCode": credit_code,
"datatype": "json"
}
response = requests.get(url, params=params)
if response.status_code == 200:
data = response.json()
if data["status"] == 200:
return data["result"]
else:
print(f"API Error: {data['message']}")
else:
print(f"HTTP Error: {response.status_code}")
# 示例调用(需替换真实api_key)
company_info = query_company_by_credit_code("91440300MA5DUW5X7K", "your_api_key")
if company_info:
print(f"注册资本: {company_info['regCap']}万元, 成立日期: {company_info['estDate']}")
优势:数据维度丰富(含股东信息、司法风险等),但需注意调用频率限制。
三、网页爬取技术的深度应用
当API无法满足需求时,网页爬取成为补充手段。以天眼查为例:
1. 基础信息爬取
from bs4 import BeautifulSoup
import requests
def scrape_company_basic(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 解析企业名称
name_tag = soup.find('h1', class_='company-header__name')
name = name_tag.text.strip() if name_tag else "N/A"
# 解析法定代表人
legal_person_tag = soup.find('div', class_='legalPersonName')
legal_person = legal_person_tag.text.strip() if legal_person_tag else "N/A"
return {
"企业名称": name,
"法定代表人": legal_person
}
# 示例调用
url = "https://www.tianyancha.com/company/3043284"
info = scrape_company_basic(url)
print(info)
2. 动态页面处理(Selenium示例)
对于JavaScript渲染的页面:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
def scrape_dynamic_company_info(company_url):
chrome_options = Options()
chrome_options.add_argument("--headless") # 无头模式
driver = webdriver.Chrome(options=chrome_options)
try:
driver.get(company_url)
time.sleep(3) # 等待JS加载
# 解析股东信息(示例)
shareholders = []
elements = driver.find_elements_by_css_selector(".shareholder-item")
for element in elements:
name = element.find_element_by_css_selector(".name").text
ratio = element.find_element_by_css_selector(".ratio").text
shareholders.append({"股东名称": name, "持股比例": ratio})
return shareholders
finally:
driver.quit()
# 示例调用
url = "https://www.tianyancha.com/company/3043284/shareholder"
shareholders = scrape_dynamic_company_info(url)
for s in shareholders:
print(s)
四、数据清洗与存储优化
1. 数据标准化处理
import pandas as pd
from datetime import datetime
def clean_company_data(raw_data):
df = pd.DataFrame(raw_data)
# 统一日期格式
if "成立日期" in df.columns:
df["成立日期"] = pd.to_datetime(df["成立日期"], errors='coerce')
# 数值字段处理
if "注册资本" in df.columns:
df["注册资本"] = df["注册资本"].str.replace("万", "").astype(float)
# 缺失值填充
df.fillna({"法定代表人": "未知", "经营范围": "未公示"}, inplace=True)
return df
# 示例数据
raw_data = [
{"企业名称": "腾讯科技", "成立日期": "1998-11-11", "注册资本": "5000万"},
{"企业名称": "阿里云", "成立日期": "2009-09-10", "注册资本": "1000万"}
]
cleaned_df = clean_company_data(raw_data)
print(cleaned_df)
2. 高效存储方案
- SQLite:轻量级本地存储
```python
import sqlite3
def save_to_sqlite(df, db_path=”companies.db”):
conn = sqlite3.connect(db_path)
df.to_sql(“companies”, conn, if_exists=”replace”, index=False)
conn.close()
save_to_sqlite(cleaned_df)
- **MongoDB**:适合非结构化数据
```python
from pymongo import MongoClient
def save_to_mongodb(data, db_name="company_db", collection_name="companies"):
client = MongoClient("mongodb://localhost:27017/")
db = client[db_name]
collection = db[collection_name]
if isinstance(data, pd.DataFrame):
data = data.to_dict("records")
collection.insert_many(data)
client.close()
五、进阶应用:企业关系图谱构建
利用networkx构建企业关联网络:
import networkx as nx
import matplotlib.pyplot as plt
def build_company_graph(shareholder_data):
G = nx.Graph()
for record in shareholder_data:
company = record["企业名称"]
shareholder = record["股东名称"]
ratio = float(record["持股比例"].replace("%", ""))
G.add_node(company, type="company")
G.add_node(shareholder, type="shareholder")
G.add_edge(company, shareholder, weight=ratio)
# 可视化
pos = nx.spring_layout(G)
nx.draw_networkx_nodes(G, pos, nodelist=[n for n,d in G.nodes(data=True) if d["type"]=="company"],
node_color="blue", node_size=500)
nx.draw_networkx_nodes(G, pos, nodelist=[n for n,d in G.nodes(data=True) if d["type"]=="shareholder"],
node_color="red", node_size=300)
nx.draw_networkx_edges(G, pos, width=[d["weight"]*0.1 for _,_,d in G.edges(data=True)])
nx.draw_networkx_labels(G, pos)
plt.show()
# 示例数据(需替换为真实数据)
shareholder_data = [
{"企业名称": "腾讯科技", "股东名称": "马化腾", "持股比例": "8.61%"},
{"企业名称": "腾讯科技", "股东名称": "张志东", "持股比例": "6.23%"}
]
build_company_graph(shareholder_data)
六、最佳实践与合规建议
- 频率控制:API调用间隔建议≥1秒,爬虫设置
time.sleep(random.uniform(1,3))
- 数据脱敏:处理个人信息时遵守《个人信息保护法》
- 异常处理:
```python
import requests
from requests.exceptions import RequestException, Timeout, TooManyRedirects
def safe_request(url, kwargs):
try:
response = requests.get(url, timeout=10, kwargs)
response.raise_for_status()
return response
except Timeout:
print(“Request timeout”)
except TooManyRedirects:
print(“Too many redirects”)
except RequestException as e:
print(f”Request failed: {str(e)}”)
return None
4. **代理池管理**:
```python
import random
from fake_useragent import UserAgent
class ProxyPool:
def __init__(self, proxies):
self.proxies = proxies
self.ua = UserAgent()
def get_random_proxy(self):
return {
"http": random.choice(self.proxies),
"headers": {"User-Agent": self.ua.random}
}
# 示例代理池
proxies = ["http://123.123.123.123:8080", "http://124.124.124.124:8080"]
pool = ProxyPool(proxies)
print(pool.get_random_proxy())
七、总结与展望
Python在企业信息查询领域展现出强大能力,通过合理组合API调用、网页爬取、数据处理技术,可构建高效的企业信息检索系统。未来发展方向包括:
- 结合NLP技术实现企业新闻的情感分析
- 利用图数据库(Neo4j)优化关系查询
- 开发低代码平台降低技术门槛
开发者需持续关注数据源的政策变化,在合规前提下探索技术创新。建议初学者从政府公开API入手,逐步掌握反爬策略和数据清洗技巧,最终构建完整的企业信息分析体系。
发表评论
登录后可评论,请前往 登录 或 注册