首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >不用盯盘!Python 爬虫帮你自动筛选优质股票

不用盯盘!Python 爬虫帮你自动筛选优质股票

原创
作者头像
小白学大数据
发布2026-03-17 16:44:23
发布2026-03-17 16:44:23
2830
举报

在股票投资中,人工盯盘、手动筛选股票不仅耗时耗力,还容易因情绪干扰做出非理性决策。而借助 Python 爬虫技术,我们可以自动化抓取股票核心数据,并结合量化筛选规则,快速定位具备投资潜力的优质股票。本文将从实战角度出发,手把手教你搭建一套「股票数据爬取 + 自动化筛选」系统,彻底摆脱人工盯盘的低效模式。

一、核心思路与技术选型

1.1 实现逻辑

整个自动化选股流程分为三个核心步骤:

  1. 数据爬取:通过爬虫抓取股票基础信息(代码、名称)、财务指标(市盈率、市净率)、交易数据(涨幅、成交量);
  2. 规则筛选:设定量化筛选条件(如低市盈率、高成长、小市值),过滤不符合要求的股票;
  3. 结果输出:将筛选后的优质股票导出为 Excel,方便后续分析。

1.2 技术栈

  • 爬虫框架:requests(轻量 HTTP 请求库)、BeautifulSoup(HTML 解析);
  • 数据处理:pandas(数据清洗与筛选);
  • 输出工具:openpyxl(Excel 文件生成);
  • 辅助工具:fake-useragent(模拟浏览器 UA,避免反爬)。

二、实战实现:Python 自动化选股完整代码

2.1 环境准备

2.2 完整代码实现

python

运行

代码语言:txt
复制
import requests
import pandas as pd
from fake_useragent import UserAgent
from bs4 import BeautifulSoup
import time

class StockSelector:
    def __init__(self):
        # 初始化请求头,模拟浏览器访问
        self.ua = UserAgent()
        self.headers = {
            'User-Agent': self.ua.random,
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
            'Referer': 'https://www.eastmoney.com/',
            'Connection': 'keep-alive'
        }
        # 配置代理信息
        self.proxyHost = "www.16yun.cn"
        self.proxyPort = "5445"
        self.proxyUser = "16QMSOML"
        self.proxyPass = "280651"
        # 构建代理字典(支持http和https)
        self.proxies = {
            "http": f"http://{self.proxyUser}:{self.proxyPass}@{self.proxyHost}:{self.proxyPort}",
            "https": f"https://{self.proxyUser}:{self.proxyPass}@{self.proxyHost}:{self.proxyPort}"
        }
        # 存储股票数据的列表
        self.stock_data = []

    def get_stock_list(self):
        """
        爬取东方财富网A股列表(示例:沪深京A股)
        数据源:东方财富网行情中心
        """
        # 分页爬取(这里仅爬取第一页,可扩展多页)
        url = 'https://quote.eastmoney.com/center/gridlist.html#hs_a_board'
        try:
            # 加入proxies参数使用代理请求
            response = requests.get(
                url, 
                headers=self.headers, 
                proxies=self.proxies,  # 核心修改:启用代理
                timeout=15  # 代理请求适当延长超时时间
            )
            response.raise_for_status()  # 抛出HTTP请求异常
            soup = BeautifulSoup(response.text, 'html.parser')
            
            # 解析表格数据
            table = soup.find('table', class_='table_wrapper-table')
            if not table:
                print("未找到股票列表表格")
                return
            
            rows = table.find_all('tr')[1:]  # 跳过表头行
            for row in rows:
                cols = row.find_all('td')
                if len(cols) < 10:
                    continue  # 过滤无效行
                
                # 提取核心字段(可根据需求扩展更多字段)
                stock_code = cols[1].text.strip()  # 股票代码
                stock_name = cols[2].text.strip()  # 股票名称
                price = cols[3].text.strip()       # 最新价
                pe_ttm = cols[12].text.strip()     # 滚动市盈率
                pb = cols[13].text.strip()         # 市净率
                market_cap = cols[18].text.strip() # 总市值
                rise_rate = cols[5].text.strip()   # 涨跌幅
                
                # 处理空值和异常值
                pe_ttm = float(pe_ttm) if pe_ttm not in ['-', ''] else 9999
                pb = float(pb) if pb not in ['-', ''] else 9999
                rise_rate = float(rise_rate.replace('%', '')) if rise_rate not in ['-', ''] else 0
                market_cap = self._format_market_cap(market_cap)  # 格式化市值
                
                # 存储数据
                self.stock_data.append({
                    '股票代码': stock_code,
                    '股票名称': stock_name,
                    '最新价': price,
                    '市盈率TTM': pe_ttm,
                    '市净率': pb,
                    '总市值(亿)': market_cap,
                    '涨跌幅(%)': rise_rate
                })
            print(f"成功爬取 {len(self.stock_data)} 只股票基础数据")
            
        except Exception as e:
            print(f"爬取股票列表失败:{str(e)}")

    def _format_market_cap(self, cap_str):
        """格式化市值(将"亿/万"单位转换为纯数字,单位:亿)"""
        if not cap_str or cap_str == '-':
            return 0
        if '亿' in cap_str:
            return float(cap_str.replace('亿', ''))
        elif '万' in cap_str:
            return float(cap_str.replace('万', '')) / 10000
        else:
            return float(cap_str)

    def filter_high_quality_stocks(self):
        """
        筛选优质股票:设定量化规则(可根据自身策略调整)
        示例规则:
        1. 市盈率TTM < 30(估值合理)
        2. 市净率 < 5(资产负债率合理)
        3. 总市值 > 50亿 且 < 500亿(中小市值,成长空间大)
        4. 涨跌幅 > -5%(近期无大幅下跌)
        """
        if not self.stock_data:
            print("无股票数据可筛选")
            return pd.DataFrame()
        
        # 转换为DataFrame方便筛选
        df = pd.DataFrame(self.stock_data)
        
        # 应用筛选规则
        filter_condition = (
            (df['市盈率TTM'] > 0) &  # 排除负市盈率(亏损企业)
            (df['市盈率TTM'] < 30) &
            (df['市净率'] < 5) &
            (df['总市值(亿)'] > 50) &
            (df['总市值(亿)'] < 500) &
            (df['涨跌幅(%)'] > -5)
        )
        high_quality_stocks = df[filter_condition].copy()
        
        # 按市盈率升序排序(估值越低越靠前)
        high_quality_stocks = high_quality_stocks.sort_values('市盈率TTM', ascending=True)
        
        print(f"筛选出 {len(high_quality_stocks)} 只优质股票")
        return high_quality_stocks

    def export_to_excel(self, df, filename='优质股票筛选结果.xlsx'):
        """将筛选结果导出为Excel文件"""
        if df.empty:
            print("无数据可导出")
            return
        try:
            df.to_excel(filename, index=False, engine='openpyxl')
            print(f"筛选结果已导出至:{filename}")
        except Exception as e:
            print(f"导出Excel失败:{str(e)}")

    def run(self):
        """执行完整选股流程"""
        print("开始爬取股票数据...")
        self.get_stock_list()
        time.sleep(2)  # 延迟,避免请求过快被封
        
        print("开始筛选优质股票...")
        high_quality_df = self.filter_high_quality_stocks()
        
        print("导出筛选结果...")
        self.export_to_excel(high_quality_df)

if __name__ == '__main__':
    # 实例化并运行选股系统
    selector = StockSelector()
    selector.run()

2.3 代码核心解析

  1. 请求头伪装:通过fake-useragent随机生成浏览器 UA,避免被网站识别为爬虫;
  2. 数据爬取模块:解析东方财富网 A 股列表页面,提取股票代码、市盈率、市值等核心字段,并处理空值 / 异常值;
  3. 市值格式化:将带单位(亿 / 万)的市值字符串转换为纯数字,方便后续数值筛选;
  4. 量化筛选规则:设定市盈率 < 30、市值 50-500 亿等规则,过滤出符合条件的股票;
  5. 结果导出:将筛选结果保存为 Excel,便于后续人工复核和分析。

三、功能扩展与风险提示

3.1 功能扩展方向

  1. 多数据源整合:除东方财富网外,可扩展爬取同花顺、雪球等平台的财务数据(如净利润增长率、ROE 等),提升筛选维度;
  2. 多页爬取:当前代码仅爬取第一页数据,可通过循环拼接分页参数(如page=2)爬取全市场 A 股;
  3. 定时运行:结合schedule库实现每日收盘后自动爬取筛选,代码示例:python运行
代码语言:txt
复制
import schedule
def daily_select():
    selector = StockSelector()
    selector.run()
# 每日15:30(收盘后)执行
schedule.every().day.at("15:30").do(daily_select)
while True:
    schedule.run_pending()
    time.sleep(60)

策略优化:可加入均线、MACD 等技术指标,或结合行业分类筛选细分赛道优质股。3.2 风险提示爬虫合规性:爬取数据前需遵守网站robots.txt协议,避免高频请求导致 IP 被封;数据准确性:网页数据可能存在延迟或误差,筛选结果仅作参考,不构成投资建议;策略迭代:股票市场动态变化,需根据市场环境调整筛选规则,避免单一策略失效。四、运行效果与使用建议4.1 运行效果执行代码后,控制台会输出爬取 / 筛选进度,最终生成优质股票筛选结果.xlsx文件,包含股票代码、名称、市盈率、市值等核心信息,且按市盈率升序排列,便于快速定位低估值标的。4.2 使用建议新手适配:可先降低筛选条件(如市盈率 < 50),扩大筛选范围,再逐步精细化规则;数据验证:筛选后可通过券商软件复核股票财务数据,确认基本面无重大风险;小范围测试:先对筛选结果做小仓位试错,验证策略有效性后再扩大应用。总结通过 Python 爬虫技术实现自动化选股,核心是将「数据抓取 - 规则筛选 - 结果输出」的全流程标准化,既解决了人工盯盘的效率问题,也能通过量化规则减少主观情绪干扰。需要注意的是,自动化选股只是辅助工具,最终投资决策仍需结合市场趋势、行业逻辑和风险控制。后续可基于本文代码,结合自身投资理念迭代筛选规则,搭建更贴合个人风格的选股系统。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、核心思路与技术选型
    • 1.1 实现逻辑
    • 1.2 技术栈
  • 二、实战实现:Python 自动化选股完整代码
    • 2.1 环境准备
    • 2.2 完整代码实现
    • 2.3 代码核心解析
  • 三、功能扩展与风险提示
    • 3.1 功能扩展方向
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档