
在股票投资中,人工盯盘、手动筛选股票不仅耗时耗力,还容易因情绪干扰做出非理性决策。而借助 Python 爬虫技术,我们可以自动化抓取股票核心数据,并结合量化筛选规则,快速定位具备投资潜力的优质股票。本文将从实战角度出发,手把手教你搭建一套「股票数据爬取 + 自动化筛选」系统,彻底摆脱人工盯盘的低效模式。
整个自动化选股流程分为三个核心步骤:
requests(轻量 HTTP 请求库)、BeautifulSoup(HTML 解析);pandas(数据清洗与筛选);openpyxl(Excel 文件生成);fake-useragent(模拟浏览器 UA,避免反爬)。python
运行
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()fake-useragent随机生成浏览器 UA,避免被网站识别为爬虫;page=2)爬取全市场 A 股;schedule库实现每日收盘后自动爬取筛选,代码示例:python运行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 删除。