Python中如何使用Flask框架编写行情数据抓取页面

没接触过 flask,想用 flask 做一个行情展示页面,比如自己关注的几个股票,利用抓取的新浪财经的 js 数据,展示几个关键的信息在页面上,实现数据实施更新,最多再实现一个价格预警功能。请教一下具体如何做。有类似的代码能介绍下吗?


Python中如何使用Flask框架编写行情数据抓取页面
20 回复

这种应该有现成的工具吧 github 上找找


我来给你一个完整的Flask行情数据抓取页面示例。这个代码会抓取股票行情数据并展示在网页上。

from flask import Flask, render_template, jsonify
import requests
import json
from datetime import datetime
import threading
import time

app = Flask(__name__)

# 模拟行情数据存储
market_data = {
    'AAPL': {'price': 175.25, 'change': 1.25, 'volume': 45218900},
    'GOOGL': {'price': 135.67, 'change': -0.45, 'volume': 18923400},
    'MSFT': {'price': 327.89, 'change': 2.34, 'volume': 28765400},
    'TSLA': {'price': 245.33, 'change': -3.21, 'volume': 65432100}
}

def fetch_real_stock_data(symbol):
    """从公开API获取真实股票数据(示例使用Alpha Vantage)"""
    try:
        # 这里使用模拟数据,实际使用时需要申请API key
        # api_key = 'YOUR_API_KEY'
        # url = f'https://www.alphavantage.co/query?function=GLOBAL_QUOTE&symbol={symbol}&apikey={api_key}'
        # response = requests.get(url)
        # data = response.json()
        
        # 模拟API响应
        return {
            'price': round(market_data[symbol]['price'] + (market_data[symbol]['change'] * 0.1), 2),
            'change': round(market_data[symbol]['change'] * 0.9, 2),
            'volume': market_data[symbol]['volume']
        }
    except:
        return market_data[symbol]

def update_market_data():
    """后台线程定期更新行情数据"""
    while True:
        for symbol in market_data.keys():
            new_data = fetch_real_stock_data(symbol)
            market_data[symbol] = new_data
        time.sleep(10)  # 每10秒更新一次

@app.route('/')
def index():
    """主页面显示所有行情数据"""
    return render_template('index.html', 
                         stocks=market_data, 
                         last_update=datetime.now().strftime('%H:%M:%S'))

@app.route('/api/quote/<symbol>')
def get_quote(symbol):
    """API接口获取单个股票行情"""
    symbol = symbol.upper()
    if symbol in market_data:
        return jsonify({
            'symbol': symbol,
            'data': market_data[symbol],
            'timestamp': datetime.now().isoformat()
        })
    return jsonify({'error': 'Symbol not found'}), 404

@app.route('/api/market')
def get_market():
    """API接口获取所有行情数据"""
    return jsonify({
        'data': market_data,
        'timestamp': datetime.now().isoformat()
    })

if __name__ == '__main__':
    # 启动后台数据更新线程
    update_thread = threading.Thread(target=update_market_data, daemon=True)
    update_thread.start()
    
    app.run(debug=True, port=5000)

还需要创建一个HTML模板文件 templates/index.html

<!DOCTYPE html>
<html>
<head>
    <title>股票行情监控</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; }
        .stock-table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        .stock-table th, .stock-table td { 
            padding: 12px; text-align: left; border-bottom: 1px solid #ddd; 
        }
        .stock-table th { background-color: #f2f2f2; }
        .positive { color: green; }
        .negative { color: red; }
        .update-time { color: #666; font-size: 0.9em; margin-bottom: 20px; }
    </style>
</head>
<body>
    <h1>实时股票行情</h1>
    <div class="update-time">最后更新: {{ last_update }}</div>
    
    <table class="stock-table">
        <thead>
            <tr>
                <th>股票代码</th>
                <th>当前价格</th>
                <th>涨跌幅</th>
                <th>成交量</th>
            </tr>
        </thead>
        <tbody>
            {% for symbol, data in stocks.items() %}
            <tr>
                <td>{{ symbol }}</td>
                <td>${{ data.price }}</td>
                <td class="{{ 'positive' if data.change >= 0 else 'negative' }}">
                    {{ '+' if data.change >= 0 else '' }}{{ data.change }}
                </td>
                <td>{{ "{:,}".format(data.volume) }}</td>
            </tr>
            {% endfor %}
        </tbody>
    </table>

    <script>
        // 自动刷新页面数据
        setInterval(() => {
            location.reload();
        }, 30000); // 每30秒刷新
        
        // 或者使用AJAX获取数据(更优雅的方式)
        function fetchData() {
            fetch('/api/market')
                .then(response => response.json())
                .then(data => {
                    console.log('最新行情:', data);
                });
        }
    </script>
</body>
</html>

这个实现有几个关键点:

  1. Flask应用结构:创建了主页面和API接口
  2. 数据获取:使用fetch_real_stock_data函数模拟从API获取数据
  3. 后台更新:用线程定期更新数据,避免阻塞主线程
  4. 前端展示:HTML模板展示表格化的行情数据
  5. API接口:提供JSON格式的数据接口供其他应用调用

要运行这个应用,先安装依赖:

pip install flask requests

然后运行python app.py,访问http://localhost:5000就能看到行情页面。

实际使用时,你需要:

  1. 替换fetch_real_stock_data函数为真实的API调用
  2. 添加错误处理和重试机制
  3. 考虑使用数据库存储历史数据
  4. 添加用户认证(如果需要)

简单说就是:Flask做后端提供数据接口,前端用模板或JavaScript展示,后台线程定期更新数据。

flask 是 web 框架,你要抓取,那还得用 scrapy

js 数据比较难搞吧. ![img]( )

Scrapy 抓取丢 Redis 上面,Flask 读 Redis 用来展示。

抓取数据已经解决了,不知道怎么展示在浏览器页面上。。。。。新浪的 js 特别规律,好多年没有变化了。
就是不知道怎么放到浏览器上

flask 不适合做爬虫,试试 pyspider

#5 看看四楼的建议

你需要学习 Web 开发技术, 而不是爬虫。 毕竟你已经爬好了。
你看 flask 的入门资料, 把 hello world 换成爬虫的数据就行了。

实时数据最好用 websocket 实现 所以你需要看看 flask-socketio 偷懒一点的方法前端每 1s 轮巡一下数据 至于图标的展现 参考一下 highcharts 和 eharts 这个和 flask 无关 你这个需求 flask 只不过用来渲染下 html 而已

什么行情 很多行情有免费接口的 简单事情不要做复杂了

1.get js 数据
2.解析数据
3.flask 显示

其实楼主的问题是怎么展示,前端展示建议你用百度的 echarts,  flask 跟着官方教程走一走就行了

太感谢大家的建议了。确实,现在有很多的免费的接口,新浪啊,tradingview 啊之类的,我想把几个数据源整合起来(爬虫做好了),就是要展示在浏览器上,现在看 flask 的文档,无奈对 web 开发一窍不通。
谢谢楼上提供的技术思路,真是学无止境。

几个市场的股票行情和期货行情

echarts 确实高大上,还没找到合适的控件,其实就是特简单的几个表格,然后数据根据 python 爬取的及时更新就好。不是特别理解 web 的运作。。。汗颜。

Flask-Notifications 这个 package 可以满足我的要求,而且也是使用了 redis,问题是使用 pip 安装,我用的是 conda 来管理,如何实现安装这个包呢,不在 anaconda 源里面。

回到顶部