From 26e8346f94a88bbda672742e7cea665a9b8a08f1 Mon Sep 17 00:00:00 2001 From: hnu202410040428 <1130435135@qq.com> Date: Wed, 25 Jun 2025 21:47:51 +0800 Subject: [PATCH] Update pc.py --- pc.py | 309 +++++++++++++++++++++++++++++----------------------------- 1 file changed, 154 insertions(+), 155 deletions(-) diff --git a/pc.py b/pc.py index f6c7a22..269d22e 100644 --- a/pc.py +++ b/pc.py @@ -1,156 +1,155 @@ -# 中国500强公司信息爬取程序 -# 版本:1.0 -# 功能:爬取中国500强公司信息并进行注册资本分析可视化 - -# 导入所需模块 -import requests # 用于发送HTTP请求获取网页内容 -import re # 用于正则表达式提取数据 -import csv # 用于数据存储为CSV文件 -import pandas as pd # 用于数据处理和分析 -import matplotlib.pyplot as plt # 用于数据可视化 - -# 配置请求URL和请求头 -url = "https://top.chinaz.com/gongsi/index_zhuce.html" # 目标网页URL -headers = { - "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" -} # 设置请求头,模拟浏览器访问 - -# 发送GET请求获取网页内容 -response = requests.get(url, headers=headers) -html = response.text # 获取响应的HTML文本 - -# 提取第一页公司基础信息(公司名、法定代表人、注册时间、证券类别) -company = re.findall('(.+?)', html) # 提取公司名称 -person = re.findall('法定代表人:(.+?)<', html) # 提取法定代表人 -signDate = re.findall('注册时间:(.+?)<', html) # 提取注册时间 -category = re.findall('证券类别:(.+?)<', html) # 提取证券类别 - -# 合并第一页数据 -pageOne = list(zip(company, person, signDate, category)) -print("第一页数据示例:", pageOne[:2]) # 打印前两条数据示例 - -# 存储所有页面数据的列表 -message = [] - -# 循环爬取16个页面的数据 -for page in range(16): - # 组装不同页面的URL - if page == 0: - current_url = "https://top.chinaz.com/gongsi/index_zhuce.html" - else: - current_url = f"https://top.chinaz.com/gongsi/index_zhuce_{page + 1}.html" # 修正URL格式 - - # 发送请求获取当前页面内容 - response = requests.get(current_url, headers=headers) - html = response.text - - # 提取当前页面的公司基础信息 - company = re.findall('(.+?)', html) - person = re.findall('法定代表人:(.+?)<', html) - signDate = re.findall('注册时间:(.+?)<', html) - category = re.findall('证券类别:(.+?)<', html) - - # 合并当前页面数据并添加到总数据列表 - page_data = list(zip(company, person, signDate, category)) - message.extend(page_data) - -# 将数据保存到CSV文件 -with open("content.csv", "w", newline='', encoding='utf-8-sig') as f: - writer = csv.writer(f) - writer.writerows(message) -print("基础数据已保存至content.csv") - -# 使用pandas读取CSV数据 -df = pd.read_csv("content.csv", names=["company", "person", "signDate", "category"]) -print("数据前5行示例:") -print(df.head()) # 打印数据前5行 -print("数据基本信息:") -df.info() # 打印数据基本信息 - -# 按证券类别分组统计公司数量 -df1 = df.groupby("category").count()["company"] -print("按证券类别分组统计结果:") -print(df1) - -# 定义函数用于提取公司名称和注册资本 -def get_company_data(url, headers): - response = requests.get(url, headers=headers) - html = response.text - - # 提取公司名称(改进正则表达式,匹配完整标签) - company = re.findall('(.+?)', html) - - # 提取注册资本信息 - capital = re.findall('注册资本:(.+?)

', html) - - # 处理注册资本,转换为数值(单位:万元) - capital_values = [] - for cap in capital: - try: - # 提取数字部分,处理带逗号的格式如"1,000.5万" - num_part = re.search(r'(\d+(?:,\d+)*(?:\.\d+)?)', cap) - if num_part: - num = float(num_part.group(1).replace(',', '')) - # 单位转换:如果包含"亿",转换为万元 - if '亿' in cap: - num *= 10000 - capital_values.append(num) - else: - capital_values.append(0) - except: - capital_values.append(0) - - return list(zip(company, capital_values)) - -# 爬取所有页面的注册资本数据 -all_company_data = [] -for page in range(16): - if page == 0: - current_url = "https://top.chinaz.com/gongsi/index_zhuce.html" - else: - current_url = f"https://top.chinaz.com/gongsi/index_zhuce_{page + 1}.html" - - print(f"正在爬取第 {page + 1} 页数据...") - page_data = get_company_data(current_url, headers) - all_company_data.extend(page_data) - -# 将注册资本数据转换为DataFrame -df_capital = pd.DataFrame(all_company_data, columns=['company', 'capital']) - -# 按注册资本降序排序,取前20名 -top20 = df_capital.sort_values('capital', ascending=False).head(20) - -# 打印前20名公司的注册资本信息 -print("\n注册资金最多的20家公司:") -print(top20) - -# 绘制前20名公司注册资本的柱状图 -plt.figure(figsize=(14, 8)) # 设置图表大小 -bars = plt.bar(top20['company'], top20['capital'], color='#4CAF50') # 绘制柱状图 - -# 在每个柱子上方添加具体数值 -for bar in bars: - height = bar.get_height() - plt.text(bar.get_x() + bar.get_width()/2., height, - f'{height:.1f}万元', ha='center', va='bottom', fontsize=10) - -# 设置图表标题和坐标轴标签 -plt.title('中国500强公司中注册资金最多的前20家公司', fontsize=16) -plt.xlabel('公司名称', fontsize=14) -plt.ylabel('注册资金(万元)', fontsize=14) - -# 旋转x轴标签以便更好显示 -plt.xticks(rotation=45, ha="right", fontsize=12) - -# 添加网格线 -plt.grid(axis="y", linestyle="--", alpha=0.7) - -# 调整布局 -plt.tight_layout() - -# 显示图表 -plt.show() - -# 保存前20名公司数据到CSV文件 -top20.to_csv('top20_company_capital.csv', index=False, encoding='utf-8-sig') +# 中国500强公司信息爬取程序 + + +# 导入所需模块 +import requests # 用于发送HTTP请求获取网页内容 +import re # 用于正则表达式提取数据 +import csv # 用于数据存储为CSV文件 +import pandas as pd # 用于数据处理和分析 +import matplotlib.pyplot as plt # 用于数据可视化 + +# 配置请求URL和请求头 +url = "https://top.chinaz.com/gongsi/index_zhuce.html" # 目标网页URL +headers = { + "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36" +} # 设置请求头,模拟浏览器访问 + +# 发送GET请求获取网页内容 +response = requests.get(url, headers=headers) +html = response.text # 获取响应的HTML文本 + +# 提取第一页公司基础信息(公司名、法定代表人、注册时间、证券类别) +company = re.findall('(.+?)', html) # 提取公司名称 +person = re.findall('法定代表人:(.+?)<', html) # 提取法定代表人 +signDate = re.findall('注册时间:(.+?)<', html) # 提取注册时间 +category = re.findall('证券类别:(.+?)<', html) # 提取证券类别 + +# 合并第一页数据 +pageOne = list(zip(company, person, signDate, category)) +print("第一页数据示例:", pageOne[:2]) # 打印前两条数据示例 + +# 存储所有页面数据的列表 +message = [] + +# 循环爬取16个页面的数据 +for page in range(16): + # 组装不同页面的URL + if page == 0: + current_url = "https://top.chinaz.com/gongsi/index_zhuce.html" + else: + current_url = f"https://top.chinaz.com/gongsi/index_zhuce_{page + 1}.html" # 修正URL格式 + + # 发送请求获取当前页面内容 + response = requests.get(current_url, headers=headers) + html = response.text + + # 提取当前页面的公司基础信息 + company = re.findall('(.+?)', html) + person = re.findall('法定代表人:(.+?)<', html) + signDate = re.findall('注册时间:(.+?)<', html) + category = re.findall('证券类别:(.+?)<', html) + + # 合并当前页面数据并添加到总数据列表 + page_data = list(zip(company, person, signDate, category)) + message.extend(page_data) + +# 将数据保存到CSV文件 +with open("content.csv", "w", newline='', encoding='utf-8-sig') as f: + writer = csv.writer(f) + writer.writerows(message) +print("基础数据已保存至content.csv") + +# 使用pandas读取CSV数据 +df = pd.read_csv("content.csv", names=["company", "person", "signDate", "category"]) +print("数据前5行示例:") +print(df.head()) # 打印数据前5行 +print("数据基本信息:") +df.info() # 打印数据基本信息 + +# 按证券类别分组统计公司数量 +df1 = df.groupby("category").count()["company"] +print("按证券类别分组统计结果:") +print(df1) + +# 定义函数用于提取公司名称和注册资本 +def get_company_data(url, headers): + response = requests.get(url, headers=headers) + html = response.text + + # 提取公司名称(改进正则表达式,匹配完整标签) + company = re.findall('(.+?)', html) + + # 提取注册资本信息 + capital = re.findall('注册资本:(.+?)

', html) + + # 处理注册资本,转换为数值(单位:万元) + capital_values = [] + for cap in capital: + try: + # 提取数字部分,处理带逗号的格式如"1,000.5万" + num_part = re.search(r'(\d+(?:,\d+)*(?:\.\d+)?)', cap) + if num_part: + num = float(num_part.group(1).replace(',', '')) + # 单位转换:如果包含"亿",转换为万元 + if '亿' in cap: + num *= 10000 + capital_values.append(num) + else: + capital_values.append(0) + except: + capital_values.append(0) + + return list(zip(company, capital_values)) + +# 爬取所有页面的注册资本数据 +all_company_data = [] +for page in range(16): + if page == 0: + current_url = "https://top.chinaz.com/gongsi/index_zhuce.html" + else: + current_url = f"https://top.chinaz.com/gongsi/index_zhuce_{page + 1}.html" + + print(f"正在爬取第 {page + 1} 页数据...") + page_data = get_company_data(current_url, headers) + all_company_data.extend(page_data) + +# 将注册资本数据转换为DataFrame +df_capital = pd.DataFrame(all_company_data, columns=['company', 'capital']) + +# 按注册资本降序排序,取前20名 +top20 = df_capital.sort_values('capital', ascending=False).head(20) + +# 打印前20名公司的注册资本信息 +print("\n注册资金最多的20家公司:") +print(top20) + +# 绘制前20名公司注册资本的柱状图 +plt.figure(figsize=(14, 8)) # 设置图表大小 +bars = plt.bar(top20['company'], top20['capital'], color='#4CAF50') # 绘制柱状图 + +# 在每个柱子上方添加具体数值 +for bar in bars: + height = bar.get_height() + plt.text(bar.get_x() + bar.get_width()/2., height, + f'{height:.1f}万元', ha='center', va='bottom', fontsize=10) + +# 设置图表标题和坐标轴标签 +plt.title('中国500强公司中注册资金最多的前20家公司', fontsize=16) +plt.xlabel('公司名称', fontsize=14) +plt.ylabel('注册资金(万元)', fontsize=14) + +# 旋转x轴标签以便更好显示 +plt.xticks(rotation=45, ha="right", fontsize=12) + +# 添加网格线 +plt.grid(axis="y", linestyle="--", alpha=0.7) + +# 调整布局 +plt.tight_layout() + +# 显示图表 +plt.show() + +# 保存前20名公司数据到CSV文件 +top20.to_csv('top20_company_capital.csv', index=False, encoding='utf-8-sig') print("前20名公司数据已保存到 top20_company_capital.csv") \ No newline at end of file