logo

Python高效查询企业信息:从API到数据清洗的全流程指南

作者:谁偷走了我的奶酪2025.09.18 16:00浏览量:0

简介:本文详细介绍了如何利用Python实现企业信息的自动化查询,涵盖公开API调用、网页爬取、数据清洗及可视化分析,帮助开发者快速构建企业信息检索系统。

一、企业信息查询的核心场景与技术选型

企业信息查询是金融风控、供应链管理、市场调研等领域的核心需求。传统方式依赖人工检索或购买商业数据库,存在成本高、时效性差的问题。Python凭借其丰富的生态库(如requests、pandas、selenium),可实现从公开API到网页爬取的全流程自动化。

技术选型需考虑三方面:

  1. 数据源合法性:优先选择政府公开平台(如国家企业信用信息公示系统)、第三方授权API(天眼查、企查查部分接口)
  2. 查询效率:批量查询时建议使用异步请求(aiohttp)或分布式爬虫(Scrapy+Redis)
  3. 反爬策略应对:通过User-Agent轮换、IP代理池、验证码识别(如tesseract-ocr)突破限制

二、基于公开API的企业信息查询实现

1. 政府平台API调用示例

以国家企业信用信息公示系统为例,其提供部分企业基础信息的JSON接口:

  1. import requests
  2. import json
  3. def query_company_by_name(company_name):
  4. url = "https://www.gsxt.gov.cn/affiche/queryCreditInfo"
  5. params = {
  6. "keyword": company_name,
  7. "pageNum": 1,
  8. "pageSize": 10
  9. }
  10. headers = {
  11. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)",
  12. "Referer": "https://www.gsxt.gov.cn/"
  13. }
  14. try:
  15. response = requests.get(url, params=params, headers=headers)
  16. data = response.json()
  17. if data["code"] == 200:
  18. return data["result"]
  19. else:
  20. print(f"API Error: {data['message']}")
  21. return None
  22. except Exception as e:
  23. print(f"Request Failed: {str(e)}")
  24. return None
  25. # 示例调用
  26. results = query_company_by_name("腾讯科技")
  27. if results:
  28. for item in results["list"]:
  29. print(f"企业名称: {item['entName']}, 统一社会信用代码: {item['creditCode']}")

关键点:需遵守平台API使用条款,部分接口需申请权限密钥。

2. 第三方商业API集成

以企查查为例(需申请开发者账号):

  1. import requests
  2. def query_company_by_credit_code(credit_code, api_key):
  3. url = "https://api.qcc.com/open/api/ent/info"
  4. params = {
  5. "key": api_key,
  6. "creditCode": credit_code,
  7. "datatype": "json"
  8. }
  9. response = requests.get(url, params=params)
  10. if response.status_code == 200:
  11. data = response.json()
  12. if data["status"] == 200:
  13. return data["result"]
  14. else:
  15. print(f"API Error: {data['message']}")
  16. else:
  17. print(f"HTTP Error: {response.status_code}")
  18. # 示例调用(需替换真实api_key)
  19. company_info = query_company_by_credit_code("91440300MA5DUW5X7K", "your_api_key")
  20. if company_info:
  21. print(f"注册资本: {company_info['regCap']}万元, 成立日期: {company_info['estDate']}")

优势:数据维度丰富(含股东信息、司法风险等),但需注意调用频率限制。

三、网页爬取技术的深度应用

当API无法满足需求时,网页爬取成为补充手段。以天眼查为例:

1. 基础信息爬取

  1. from bs4 import BeautifulSoup
  2. import requests
  3. def scrape_company_basic(url):
  4. headers = {
  5. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
  6. }
  7. response = requests.get(url, headers=headers)
  8. soup = BeautifulSoup(response.text, 'html.parser')
  9. # 解析企业名称
  10. name_tag = soup.find('h1', class_='company-header__name')
  11. name = name_tag.text.strip() if name_tag else "N/A"
  12. # 解析法定代表人
  13. legal_person_tag = soup.find('div', class_='legalPersonName')
  14. legal_person = legal_person_tag.text.strip() if legal_person_tag else "N/A"
  15. return {
  16. "企业名称": name,
  17. "法定代表人": legal_person
  18. }
  19. # 示例调用
  20. url = "https://www.tianyancha.com/company/3043284"
  21. info = scrape_company_basic(url)
  22. print(info)

2. 动态页面处理(Selenium示例)

对于JavaScript渲染的页面:

  1. from selenium import webdriver
  2. from selenium.webdriver.chrome.options import Options
  3. import time
  4. def scrape_dynamic_company_info(company_url):
  5. chrome_options = Options()
  6. chrome_options.add_argument("--headless") # 无头模式
  7. driver = webdriver.Chrome(options=chrome_options)
  8. try:
  9. driver.get(company_url)
  10. time.sleep(3) # 等待JS加载
  11. # 解析股东信息(示例)
  12. shareholders = []
  13. elements = driver.find_elements_by_css_selector(".shareholder-item")
  14. for element in elements:
  15. name = element.find_element_by_css_selector(".name").text
  16. ratio = element.find_element_by_css_selector(".ratio").text
  17. shareholders.append({"股东名称": name, "持股比例": ratio})
  18. return shareholders
  19. finally:
  20. driver.quit()
  21. # 示例调用
  22. url = "https://www.tianyancha.com/company/3043284/shareholder"
  23. shareholders = scrape_dynamic_company_info(url)
  24. for s in shareholders:
  25. print(s)

四、数据清洗与存储优化

1. 数据标准化处理

  1. import pandas as pd
  2. from datetime import datetime
  3. def clean_company_data(raw_data):
  4. df = pd.DataFrame(raw_data)
  5. # 统一日期格式
  6. if "成立日期" in df.columns:
  7. df["成立日期"] = pd.to_datetime(df["成立日期"], errors='coerce')
  8. # 数值字段处理
  9. if "注册资本" in df.columns:
  10. df["注册资本"] = df["注册资本"].str.replace("万", "").astype(float)
  11. # 缺失值填充
  12. df.fillna({"法定代表人": "未知", "经营范围": "未公示"}, inplace=True)
  13. return df
  14. # 示例数据
  15. raw_data = [
  16. {"企业名称": "腾讯科技", "成立日期": "1998-11-11", "注册资本": "5000万"},
  17. {"企业名称": "阿里云", "成立日期": "2009-09-10", "注册资本": "1000万"}
  18. ]
  19. cleaned_df = clean_company_data(raw_data)
  20. 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)

  1. - **MongoDB**:适合非结构化数据
  2. ```python
  3. from pymongo import MongoClient
  4. def save_to_mongodb(data, db_name="company_db", collection_name="companies"):
  5. client = MongoClient("mongodb://localhost:27017/")
  6. db = client[db_name]
  7. collection = db[collection_name]
  8. if isinstance(data, pd.DataFrame):
  9. data = data.to_dict("records")
  10. collection.insert_many(data)
  11. client.close()

五、进阶应用:企业关系图谱构建

利用networkx构建企业关联网络

  1. import networkx as nx
  2. import matplotlib.pyplot as plt
  3. def build_company_graph(shareholder_data):
  4. G = nx.Graph()
  5. for record in shareholder_data:
  6. company = record["企业名称"]
  7. shareholder = record["股东名称"]
  8. ratio = float(record["持股比例"].replace("%", ""))
  9. G.add_node(company, type="company")
  10. G.add_node(shareholder, type="shareholder")
  11. G.add_edge(company, shareholder, weight=ratio)
  12. # 可视化
  13. pos = nx.spring_layout(G)
  14. nx.draw_networkx_nodes(G, pos, nodelist=[n for n,d in G.nodes(data=True) if d["type"]=="company"],
  15. node_color="blue", node_size=500)
  16. nx.draw_networkx_nodes(G, pos, nodelist=[n for n,d in G.nodes(data=True) if d["type"]=="shareholder"],
  17. node_color="red", node_size=300)
  18. nx.draw_networkx_edges(G, pos, width=[d["weight"]*0.1 for _,_,d in G.edges(data=True)])
  19. nx.draw_networkx_labels(G, pos)
  20. plt.show()
  21. # 示例数据(需替换为真实数据)
  22. shareholder_data = [
  23. {"企业名称": "腾讯科技", "股东名称": "马化腾", "持股比例": "8.61%"},
  24. {"企业名称": "腾讯科技", "股东名称": "张志东", "持股比例": "6.23%"}
  25. ]
  26. build_company_graph(shareholder_data)

六、最佳实践与合规建议

  1. 频率控制:API调用间隔建议≥1秒,爬虫设置time.sleep(random.uniform(1,3))
  2. 数据脱敏:处理个人信息时遵守《个人信息保护法》
  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

  1. 4. **代理池管理**:
  2. ```python
  3. import random
  4. from fake_useragent import UserAgent
  5. class ProxyPool:
  6. def __init__(self, proxies):
  7. self.proxies = proxies
  8. self.ua = UserAgent()
  9. def get_random_proxy(self):
  10. return {
  11. "http": random.choice(self.proxies),
  12. "headers": {"User-Agent": self.ua.random}
  13. }
  14. # 示例代理池
  15. proxies = ["http://123.123.123.123:8080", "http://124.124.124.124:8080"]
  16. pool = ProxyPool(proxies)
  17. print(pool.get_random_proxy())

七、总结与展望

Python在企业信息查询领域展现出强大能力,通过合理组合API调用、网页爬取、数据处理技术,可构建高效的企业信息检索系统。未来发展方向包括:

  1. 结合NLP技术实现企业新闻的情感分析
  2. 利用图数据库(Neo4j)优化关系查询
  3. 开发低代码平台降低技术门槛

开发者需持续关注数据源的政策变化,在合规前提下探索技术创新。建议初学者从政府公开API入手,逐步掌握反爬策略和数据清洗技巧,最终构建完整的企业信息分析体系。

相关文章推荐

发表评论