用Python爬取A股股票代码与名称,并存入Excel的保姆级教程(附完整代码)
用Python爬取A股股票代码与名称并存入Excel的保姆级教程附完整代码在金融数据分析和投资研究中获取准确的股票代码与名称是最基础也是最重要的第一步。对于A股市场而言虽然可以通过各种金融终端获取这些数据但掌握自主爬取的能力不仅能提高工作效率还能为后续的量化分析打下坚实基础。本文将手把手教你如何用Python从东方财富网爬取A股股票代码与名称并通过pandas库整理成结构化的Excel表格。1. 环境准备与工具选择在开始之前我们需要准备好Python开发环境和必要的第三方库。建议使用Python 3.6及以上版本以获得最佳的兼容性和功能支持。1.1 安装依赖库打开命令行工具执行以下命令安装所需库pip install requests beautifulsoup4 pandas openpyxl各库的作用如下requests用于发送HTTP请求获取网页内容beautifulsoup4用于解析HTML文档提取所需数据pandas用于数据处理和Excel文件操作openpyxlpandas写入Excel文件所需的引擎1.2 选择数据源A股股票代码和名称可以从多个公开数据源获取包括东方财富网推荐数据全面更新及时新浪财经接口稳定但需要处理反爬机制雪球网数据丰富但页面结构较复杂本教程选择东方财富网作为数据源其股票列表页面结构清晰适合初学者学习。2. 网页分析与数据定位东方财富网的A股股票列表页面包含了所有上市公司的基本数据。我们需要先分析页面结构确定目标数据的位置。2.1 页面结构分析访问东方财富网的A股股票列表页面示例URL通过浏览器开发者工具F12查看HTML结构import requests from bs4 import BeautifulSoup url http://quote.eastmoney.com/stocklist.html response requests.get(url) soup BeautifulSoup(response.text, html.parser)通过分析发现股票数据主要包含在div classquotebody下的li标签中每个li包含一支股票的信息。2.2 数据提取策略每支股票的信息格式为股票名称(股票代码)例如平安银行(000001)。我们需要提取所有li标签中的文本内容使用正则表达式分离股票名称和代码将数据存储到字典或列表中3. 核心爬取代码实现下面我们实现完整的爬取流程包括请求发送、数据处理和异常处理。3.1 发送请求与获取数据import re import pandas as pd def get_stock_list(): headers { User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 } try: response requests.get(url, headersheaders) response.raise_for_status() # 检查请求是否成功 response.encoding response.apparent_encoding # 自动检测编码 return response.text except requests.exceptions.RequestException as e: print(f请求失败: {e}) return None3.2 解析数据与清洗def parse_stock_data(html): soup BeautifulSoup(html, html.parser) stock_items soup.find_all(li) stock_list [] pattern re.compile(r^(.*?)\((\d{6})\)$) for item in stock_items: text item.text.strip() match pattern.match(text) if match: stock_name, stock_code match.groups() # 排除B股和基金等非A股数据 if not stock_code.startswith((2, 3, 5, 9)): stock_list.append({代码: stock_code, 名称: stock_name}) return stock_list3.3 数据存储到Exceldef save_to_excel(stock_list, filenameA股股票列表.xlsx): df pd.DataFrame(stock_list) # 按股票代码排序 df df.sort_values(by代码).reset_index(dropTrue) try: df.to_excel(filename, indexFalse, engineopenpyxl) print(f数据已保存到 {filename}) except Exception as e: print(f保存文件时出错: {e})4. 完整代码与执行流程将上述函数组合起来形成完整的爬取流程def main(): print(开始爬取A股股票列表...) html get_stock_list() if html: stock_list parse_stock_data(html) if stock_list: save_to_excel(stock_list) print(f共爬取 {len(stock_list)} 条A股股票数据) else: print(未解析到有效股票数据) else: print(获取网页内容失败) if __name__ __main__: main()执行上述代码后将在当前目录下生成A股股票列表.xlsx文件包含所有A股上市公司的代码和名称。5. 高级技巧与优化建议5.1 处理反爬机制东方财富网对频繁访问有一定限制可以采取以下措施设置随机User-Agent添加请求间隔时间使用代理IP池import time import random def get_random_ua(): user_agents [ # 这里添加多个不同的User-Agent ] return random.choice(user_agents) # 在请求时使用 headers {User-Agent: get_random_ua()} time.sleep(random.uniform(0.5, 2)) # 随机延迟5.2 多线程爬取对于大量数据可以使用多线程提高效率from concurrent.futures import ThreadPoolExecutor def fetch_page(page): # 分页爬取逻辑 pass with ThreadPoolExecutor(max_workers5) as executor: executor.map(fetch_page, range(1, 10))5.3 定时更新数据可以结合计划任务实现数据自动更新import schedule import time def job(): print(执行定时数据更新...) main() # 每天上午9点执行 schedule.every().day.at(09:00).do(job) while True: schedule.run_pending() time.sleep(60)6. 常见问题与解决方案6.1 数据获取不完整可能原因及解决方法网络问题检查网络连接增加重试机制反爬限制降低请求频率更换User-Agent页面结构变化更新解析逻辑def retry_request(url, max_retries3): for i in range(max_retries): try: response requests.get(url, timeout10) return response except Exception as e: print(f请求失败第{i1}次重试...) time.sleep(2) return None6.2 Excel写入问题常见错误及处理文件被占用确保文件未被其他程序打开权限不足检查文件写入权限格式不兼容使用openpyxl作为引擎try: df.to_excel(output.xlsx, engineopenpyxl) except PermissionError: print(请关闭Excel文件后重试) except Exception as e: print(f写入Excel出错: {e})6.3 数据验证与清洗确保数据的准确性和完整性# 数据清洗示例 def clean_data(df): # 去除空值 df df.dropna() # 验证股票代码格式 df df[df[代码].str.match(r^\d{6}$)] # 去除重复项 df df.drop_duplicates(subset[代码]) return df7. 扩展应用与进阶方向掌握了基础爬取技能后可以进一步扩展7.1 整合更多数据字段# 示例获取股票所属行业 def get_industry(stock_code): # 从详情页爬取行业信息 pass7.2 构建股票数据监控系统class StockMonitor: def __init__(self): self.stock_data pd.DataFrame() def update_data(self): # 更新数据逻辑 pass def alert_changes(self): # 监控变动并提醒 pass7.3 对接量化交易平台# 示例将数据导入回测系统 def export_for_backtesting(df): df.to_csv(backtest_data.csv, indexFalse)