网络爬虫之金融数据前后端实现

基金监控项目实战

一 设计思想

爬虫

采集基金公司的数据

单线程爬虫,用requests进行处理

web开发

前端

负责页面的设计的设计

HTML+CSS+JavaScript+echarts

后端

负责调用爬虫获取数据,传输给前端

Flask框架

流程思维导图:

二 前端设计

样式里面 .表示class #表示ID

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>基金可视化!</h1>
//设置css属性
//css样式中.表示class,#表示ID 
<style>
    body{
        background-color: lightblue;
    }
//设置名字为 w 的class属性
    .w{
        width: 1200px;
        height: auto;
        margin: auto;
    }
//设置id为box的属性
    .box{
        margin-top:60px;
        height: 60px;
        display: flex;
        justify-content: center;
    }
//设置id为box的模块下的 input的属性
    .box input{
        width: 800px;
        height: 50px;
        border: 1px solid purple;
        padding-left:26px;
        font-size: 20px;
    }
//设置id为box的模块下的 名称为btn的class的属性
    .box #btn{
        width: 66px;
        height:54px;
        background-color: gray;
        cursor: pointer;
    }
//设置名字为 data 的class属性
    #data{
        height: 600px;
        margin-top:60px;
        border: 1px solid pink;
    }
</style>
<!--搜索框-->
//class为w和box的搜索框模块
<div class="w box">
    <input type="text"placeholder="请输入基金编号">
//按钮
    <button id="btn">搜索</button>
</div>
<!--搜索结束-->
<div id="data"class="box">
</div>
</body>
</html>

三 后端设计

  1. document.getElementById('data'): 这是一个 DOM (Document Object Model) 方法,它返回一个在 HTML 文档中具有 ID 属性为 data 的元素。这意味着你应该在你的 HTML 中有一个元素类似于 <div id="data"></div>

  2. echarts.init(...): 这是 ECharts 库的方法,它初始化一个图表实例。它接受一个 DOM 元素作为参数(在这里,是上一步获取的元素),并在该元素中创建一个图表。

  3. var ff = ...: 这部分代码创建了一个新的变量 ff,并将初始化的 ECharts 实例赋值给它。随后,你可以使用这个变量 ff 来调用图表实例的方法,比如设置图表的选项 (setOption)、更新数据等。

javascript 复制代码
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/echarts/3.7.1/echarts.min.js"></script>
<!--这个js是折线图-->
<script>
//初始一个echarts实例
    var ff =echarts.init(document.getElementById('data'))
option = {
  title:{
    text:'李绍幸',
    left:'left',
  },
  tooltip:{
    trigger:'axis',
    axisPointer:{
      type:'line',
      lineStyle:{
        color:'red',
      }
    }
  },
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [150, 230, 224, 218, 135, 147, 260],
      type: 'line'
    }
  ]
};
    ff.setOption(option)
</script>
<!--这个js是aJax请求-->
<script>
    $('#btn').click(function () {
        //获取表数据
            var text = $('.box input').val();
            //构造数据格式
            var data = {'data':text};
        //发包
        $.ajax({
            url:'/api',//路由
            type:'GET',//方法
            data:data,//携带数据
            //发包成功接收后台数据
            success:function (res) {
                //把后端的时间传参给X轴
                option.xAxis.data = res.data.time
                    option.series[0].data=res.data.price
                option.title.text = res.data.title
                        ff.setOption(option)//设置到图表
            },
            error:function () {
                console.log('发包失败!!')
            }
        })
    })
</script>

四 爬虫程序设计

crawl.py

python 复制代码
import requests
import re
def get_data(id):
    # 确保 id 是字符串格式
    id = str(id)
    try:
        resp = requests.get(url='https://fund.eastmoney.com/js/fundcode_search.js?v=20220325212048').text
        # 改进正则表达式以匹配整个赋值语句
        ff = re.findall('var r = (.*?);', resp)
        if not ff:
            raise ValueError("No data found with the provided regex pattern.")

        # 使用 eval 来解析数据
        params_data = eval(ff[0])
        title = ''

        # 寻找匹配的基金名称
        for i in params_data:
            if id == i[0]:
                title = i[2]
                break
        else:
            return {'error': 'No matching fund found for the given ID.'}

        url = f"https://danjuanfunds.com/djapi/fund/growth/{id}?day=3m"
        header = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36'
        }
        res = requests.get(url, headers=header)

        if res.status_code == 200:
            items = res.json()
            times = []
            zf = []
            for item in items.get('data')['fund_nav_growth']:
                date = item.get('date')
                percentage = item.get('percentage')
                params_data = date.replace(date.split('-')[0] + '-', '')
                times.append(params_data)
                zf.append(percentage)
            return {'time': times, 'price': zf, 'title': title}

        return {'error': f"HTTP request failed with status code {res.status_code}."}
    except Exception as e:
        print(e)
        return {'error': str(e)}

五 可视化图表设计

index.html

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>基金可视化!</h1>
<!--.表示class,#表示ID -->

<style>
    body{
        background-color: lightblue;
    }
    .w{
        width: 1200px;
        height: auto;
        margin: auto;

    }
    .box{
        margin-top:60px;
        height: 60px;
        display: flex;
        justify-content: center;
    }
    .box input{
        width: 800px;
        height: 50px;
        border: 1px solid purple;
        padding-left:26px;
        font-size: 20px;
    }
    .box #btn{
        width: 66px;
        height:54px;
        background-color: gray;
        cursor: pointer;
    }
    #data{
        height: 600px;
        margin-top:60px;
        border: 1px solid pink;
    }
</style>
<!--搜索框-->
<div class="w box">
    <input type="text"placeholder="请输入基金编号">
    <button id="btn">搜索</button>
</div>
<!--搜索结束-->
<div id="data"class="box">

</div>
<!--数据展示-->

<!--数据展示结束-->
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdn.bootcss.com/echarts/3.7.1/echarts.min.js"></script>
<!--这个js是折线图-->
<script>
    var ff =echarts.init(document.getElementById('data'))
option = {
  title:{
    text:'李绍幸',
    left:'left',
  },
  tooltip:{
    trigger:'axis',
    axisPointer:{
      type:'line',
      lineStyle:{
        color:'red',
      }
    }
  },
  xAxis: {
    type: 'category',
    data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
  },
  yAxis: {
    type: 'value'
  },
  series: [
    {
      data: [150, 230, 224, 218, 135, 147, 260],
      type: 'line'
    }
  ]
};
    ff.setOption(option)
</script>
<!--这个js是aJax请求-->
<script>
    $('#btn').click(function () {
        //获取表数据
            var text = $('.box input').val();
            //构造数据格式
            var data = {'data':text};
        //发包
        $.ajax({
            url:'/api',//路由
            type:'GET',//方法
            data:data,//携带数据
            //发包成功接收后台数据
            success:function (res) {
                //把后端的时间传参给X轴
                option.xAxis.data = res.data.time
                    option.series[0].data=res.data.price
                option.title.text = res.data.title
                        ff.setOption(option)//设置到图表
            },
            error:function () {
                console.log('发包失败!!')
            }
        })
    })
</script>
</body>
</html>

六 后台编写

mains.py

python 复制代码
from flask import Flask,render_template,jsonify,request
import crawl
app = Flask(__name__)

@app.route('/')
def index():
    # 渲染页面
    return render_template('index.html')

@app.route('/api')
def api_data():
    # 获取前端参数
    id = request.args.get('data')
    # 给爬虫传参
    data = crawl.get_data(id)
    #响应数据传参给前端
    return jsonify({'data':data})
if __name__ == '__main__':
    # 框架入口
    app.run()
相关推荐
ZStack开发者社区2 小时前
AI应用、轻量云、虚拟化|云轴科技ZStack参编金融行标与报告
人工智能·科技·金融
SelectDB技术团队11 小时前
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
大数据·elasticsearch·金融·doris·日志分析
AI趋势预见11 小时前
使用AI生成金融时间序列数据:解决股市场的数据稀缺问题并提升信噪比
人工智能·深度学习·神经网络·语言模型·金融
图扑可视化11 小时前
智慧金融合集:财税资金数据管理一体化大屏
信息可视化·金融·数字孪生·数据大屏·智慧金融
金融OG20 小时前
99.11 金融难点通俗解释:净资产收益率(ROE)VS投资资本回报率(ROIC)VS总资产收益率(ROA)
大数据·python·算法·机器学习·金融
cmgdxrz2 天前
金融项目实战 07|Python实现接口自动化——连接数据库和数据清洗、测试报告、持续集成
自动化测试·金融·pymysql·jenkin
金融OG2 天前
99.8 金融难点通俗解释:净资产收益率(ROE)
大数据·python·线性代数·机器学习·数学建模·金融·矩阵
Damon小智2 天前
全面评测 DOCA 开发环境下的 DPU:性能表现、机器学习与金融高频交易下的计算能力分析
人工智能·机器学习·金融·边缘计算·nvidia·dpu·doca
阿正的梦工坊3 天前
使用ChatGPT写一本书《美国金融市场发展史(英文版)》:Chapter 09 The Future of U.S. Financial Markets
金融·英语
金融OG3 天前
5. 马科维茨资产组合模型+AI金融智能体(qwen-max)识别政策意图方案(理论+Python实战)
大数据·人工智能·python·线性代数·机器学习·金融