计算机毕设项目(一)基于flask+mongo+angular实现爬取加密货币信息并使用LSTM模型预测价格的论坛可视化平台

文章目录

  • 加密货币平台项目介绍
    • 技术栈
      • 1. 用户管理
      • 2. 新闻和帖子管理
      • 3. 加密货币数据
      • 4. 对话获取
      • 5. 数据获取
    • 服务端代码
    • 完整代码

加密货币平台项目介绍

这个项目是一个基于 Flask 和 MongoDB 的深度学习应用程序,通过爬虫爬取加密货币行情和介绍信息,并根据新的数据使用LSTM去预测行情价格。展示涵盖了用户管理、新闻获取、加密货币数据处理、对话获取和处理、帖子管理等多个功能。
在这里插入图片描述

技术栈

  • 后端: Flask 提供了一个轻量级的网页服务器和后端API。
  • 前端: 使用angular+echart进行界面构建和图表绘制。
  • 数据库: 使用 MongoDB 作为数据库,用于存储用户信息、新闻、帖子和其他数据。
  • 数据处理: 对于加密货币价格预测,使用 LSTM 模型处理历史市场数据。
  • 代理支持: 在获取外部数据时支持通过代理访问。

1. 用户管理

  • 注册(/signin): 允许新用户创建账户。系统会检查用户名是否已存在,并对密码进行加密保存。
  • 登录(/login): 用户可以登录到系统。该接口验证用户名和密码的正确性。
  • 密码修改(/modify): 用户可以修改他们的密码。
  • 删除用户(/dele): 提供用户删除自己账户的功能。

2. 新闻和帖子管理

  • 获取卡片详情(/card-details/<card_id>): 根据卡片ID获取加密货币相关新闻的详细信息。
  • 上传帖子(/uploadpost): 允许用户上传新的帖子,包括标题、内容、日期等信息。
  • 获取所有帖子(/getposts): 可以获取平台上所有用户上传的帖子。
  • 更新帖子喜欢数(/updatelikes)更新评论数(/updatecomments): 这两个接口允许用户更新帖子的喜欢数和评论数。
    在这里插入图片描述

3. 加密货币数据

  • 获取市场数据(/market): 从外部API获取实时的加密货币市场数据。
  • 获取特定加密货币数据(/cryptos): 允许用户根据特定加密货币获取历史市场数据。
  • 价格预测(/predict): 使用 LSTM 模型预测特定加密货币的未来价格。
    在这里插入图片描述
    在这里插入图片描述

4. 对话获取

  • 获取对话(/dialog): 提供一个接口来获取存储的对话数据。

5. 数据获取

  • 获取数据(/fetch_data 和 /fetch_data2): 这两个接口用于从指定的URL获取数据,支持代理设置。

服务端代码

flask的服务端代码如下

import json
import bcrypt
from bson import json_util
from flask import Flask, request, jsonify, session
from pymongo import MongoClient
from flask_cors import CORS
import requests
from predict_price import lstm_predictor# 连接到 MongoDB 服务器
mongo_client = MongoClient("mongodb://localhost:27017/")# 选择数据库和集合
db_name = "crypto_db"
collection_name = "users"
collection_name2 = "news"
collection_name3 = "crypto"
collection_name4 = "dialog"
collection_name5 = "post"
db = mongo_client[db_name]
collection = db[collection_name]
collection2 = db[collection_name2]
collection3 = db[collection_name3]
collection4 = db[collection_name4]
collection5 = db[collection_name5]
# 如果集合为空,则插入初始化记录
if collection.estimated_document_count() == 0:initial_record = {"usr": "admin", "pwd": "admin"}collection.insert_one(initial_record)# 初始化 Flask 应用
app = Flask(__name__)
CORS(app)def need_proxy():url = "https://www.google.com"try:response = requests.get(url, timeout=1)# 检查响应状态是否正常(状态码 200)if response.status_code == 200:return 1else:return 0except Exception as e:# print(f"Error accessing Google: {e}")return 0# 路由 - 注册
@app.route('/signin', methods=['POST'])
def signin():user_data = request.get_json()username = user_data.get('usr')password = user_data.get('pwd')print(username, password)if username and password:# 检查用户名是否已存在existing_user = collection.find_one({"usr": username})if existing_user:return jsonify({"status": "fail", "message": "Username already exists."})# 哈希密码并插入新用户password = password.encode('utf-8')hashed_password = bcrypt.hashpw(password, bcrypt.gensalt())new_user = {"usr": username, "pwd": hashed_password}collection.insert_one(new_user)return jsonify({"status": "success", "message": "User registered successfully."})else:return jsonify({"status": "fail", "message": "Username or password missing."})# 路由 - 登录
@app.route('/login', methods=['POST'])
def login():user_data = request.get_json()username = user_data.get('usr')password = user_data.get('pwd')if username and password:# 查找用户existing_user = collection.find_one({"usr": username})if existing_user:# 验证密码password = password.encode('utf-8')if bcrypt.checkpw(password, existing_user['pwd']):return jsonify({"status": "success", "message": "Login successful."})else:return jsonify({"status": "fail", "message": "Incorrect password."})else:return jsonify({"status": "fail", "message": "User not found."})else:return jsonify({"status": "fail", "message": "Username or password missing."})@app.route('/card-details/<card_id>', methods=['GET'])
def get_card_details(card_id):card = collection2.find_one({'_id': int(card_id)})# print(card)if card:card_dict = json_util.loads(json_util.dumps(card))  # 将结果转换为 dict 类型card_dict.pop('_id')  # 删除 '_id' 键,因为它无法被 JSON 序列化return jsonify(card_dict)else:return jsonify({'error': 'Card not found'}), 404@app.route('/dialog', methods=['GET'])
def get_dialogue():dialogue_data = collection4.find_one()if dialogue_data:dialogue_data.pop('_id')return dialogue_dataelse:return jsonify({"error": "Data not found"}), 404def fetch_market_data():url = "https://www.okx.com/priapi/v5/market/mult-cup-tickers?t=1682245351541&ccys=BTC,ETH,USDT,BNB,USDC,XRP,ADA,OKB,DOGE,MATIC,SOL,DOT,LTC,SHIB,TRX,AVAX,DAI,WBTC,UNI,LINK,TON,LEO,ATOM,XMR,ETC,XLM,ICP,BCH,FIL,TUSD"# 设置代理proxies = {"http": "http://127.0.0.1:10809","https": "http://127.0.0.1:10809",}res = need_proxy()try:if res:response = requests.get(url)else:response = requests.get(url, proxies=proxies)if response.status_code == 200:return response.json()else:print(f"Error fetching market data: {response.status_code}")return 0except Exception as e:print(f"Error fetching market data: {e}")return 0@app.route('/market', methods=['GET'])
def get_market_data():market_data = fetch_market_data()# print(market_data)return jsonify(market_data['data'][:9])def fetch_market_data2(coin):if coin == 'USDT':url = 'https://www.okx.com/priapi/v5/market/index-candles?t=1682316274275&instId=USDT-USD&limit=1000&bar=1D'else:url = "https://www.okx.com/priapi/v5/market/candles?t=1682307645213&instId=" + coin + "-USDT&limit=1000&bar=1D"# 设置代理proxies = {"http": "http://127.0.0.1:10809","https": "http://127.0.0.1:10809",}res = need_proxy()try:if res:response = requests.get(url)else:response = requests.get(url, proxies=proxies)if response.status_code == 200:return response.json()else:print(f"Error fetching market data: {response.status_code}")return 0except Exception as e:print(f"Error fetching market data: {e}")return 0@app.route('/cryptos', methods=['POST'])
def get_cryptos():data = request.get_json()coin = data.get('coin')market_data = fetch_market_data2(coin)#  save the data to local,filename is coin+timestapfilename = "datasets/" + coin + ".csv"with open(filename, 'w') as f:# 保存每个元素的第一个和第六个元素,即时间和收盘价存为csv文件f.write('time,price\n')for i in market_data['data']:f.write(str(i[0]) + ',' + str(i[5]) + '\n')return jsonify(market_data['data'][::-1])@app.route('/modify', methods=['POST'])
def modify():user_data = request.get_json()username = user_data.get('usr')password = user_data.get('pwd')if username and password:# 查找用户existing_user = collection.find_one({"usr": username})if existing_user:# 哈希新密码并更新用户密码new_password = password.encode('utf-8')hashed_new_password = bcrypt.hashpw(new_password, bcrypt.gensalt())collection.update_one({"usr": username}, {"$set": {"pwd": hashed_new_password}})return jsonify({"status": "success", "message": "Password updated successfully."})else:return jsonify({"status": "fail", "message": "Username not found."})else:return jsonify({"status": "fail", "message": "Username, or new password missing."})@app.route('/dele', methods=['POST'])
def dele():user_data = request.get_json()username = user_data.get('usr')if username:# 查找用户existing_user = collection.find_one({"usr": username})if existing_user:collection.delete_one({"usr": username})return jsonify({"status": "success", "message": "User deleted successfully."})else:return jsonify({"status": "fail", "message": "Username not found."})else:return jsonify({"status": "fail", "message": "Username  missing."})# post
@app.route('/uploadpost', methods=['POST'])
def upload_post():post_data = request.get_json()title = post_data.get('title')content = post_data.get('content')date = post_data.get('date')summary = post_data.get('summary')likes = post_data.get('likes')comments = post_data.get('comments')if title and content and date and summary:new_post = {"title": title,"content": content,"date": date,"summary": summary,"likes": likes,"comments": comments}collection5.insert_one(new_post)print(new_post)return jsonify({"status": "success", "message": "Post saved successfully."})else:return jsonify({"status": "fail", "message": "Post data missing or incomplete."})@app.route('/getposts', methods=['GET'])
def get_all_posts():try:posts = list(collection5.find({}))for post in posts:post['_id'] = str(post['_id'])return jsonify({"status": "success", "data": posts})except Exception as e:print(f"Error retrieving posts: {e}")return jsonify({"status": "fail", "message": "Error retrieving posts."})@app.route('/updatelikes', methods=['POST'])
def updatelikes():post_data = request.get_json()posttitle = post_data.get('title')new_likes = post_data.get('likes')if posttitle and new_likes is not None:result = collection5.update_one({"title": posttitle}, {"$set": {"likes": new_likes}})if result.modified_count > 0:return jsonify({"status": "success", "message": "Post likes updated successfully."})else:return jsonify({"status": "fail", "message": "Post not found or likes not updated."})else:return jsonify({"status": "fail", "message": "Post title or new likes missing."})@app.route('/updatecomments', methods=['POST'])
def updatecomments():post_data = request.get_json()posttitle = post_data.get('title')new_comments = post_data.get('comments')if posttitle and new_comments is not None:result = collection5.update_one({"title": posttitle}, {"$set": {"comments": new_comments}})if result.modified_count > 0:return jsonify({"status": "success", "message": "Post comments updated successfully."})else:return jsonify({"status": "fail", "message": "Post not found or comments not updated."})else:return jsonify({"status": "fail", "message": "Post title or new comments missing."})@app.route('/fetch_data', methods=['POST'])
def fetch_data():data = request.jsonurl = data['url']print(url)proxies = {"http": "http://127.0.0.1:10809","https": "http://127.0.0.1:10809",}response = requests.get(url, proxies=proxies)xml_data = json.loads(response.text)return xml_data["data"]@app.route('/fetch_data2', methods=['POST'])
def fetch_data2():data = request.jsonurl = data['url']print(url)proxies = {"http": "http://127.0.0.1:10809","https": "http://127.0.0.1:10809",}response = requests.get(url, proxies=proxies)xml_data = json.loads(response.text)return jsonify({"data": xml_data["data"]["introduce"]})@app.route('/predict', methods=['POST'])
def predict():data = request.jsoncoin = data['coin']return jsonify({"data": lstm_predictor(coin)})if __name__ == '__main__':app.run(debug=True)

完整代码

整个项目为加密货币爱好者提供了一个综合平台,不仅支持基本的用户管理和社交功能,还整合了市场数据获取和分析,以及数据预测功能,是一个多功能的加密货币社区应用。
需要获取源码的可以关注公众号"一颗程序树",点击菜单栏的免费源码-源码集合的页面中输入关键词加密货币即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620184.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)

一. Seata介绍 Seata 是一款开源的分布式事务解决方案&#xff0c;致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前&#xff0c;其内部版本在阿里系内部一直扮演着应用架构层数据一致性的中间件角色&#xff0c;帮助经济体平稳的度过历年的双11&…

【Vue3/Vue2】判断设备是移动端还是pc端跳转不同路由router

Vue3代码 APP文件中写入js代码 1、首先&#xff0c;通过isMobile()函数判断用户的设备类型。该函数使用正则表达式匹配navigator.userAgent字符串&#xff0c;以确定用户是在移动设备上访问网页还是在桌面设备上访问网页 2、然后&#xff0c;在onMounted()钩子函数中&#…

vue3 - 自定义弹框组件

写了一个弹框组件 <template><transition name"modal-fade"><div v-if"showFlag" class"myModal"><div class"content"><div class"topBox"><div class"leftTitle"><spa…

线性代数——行列式按行(列)展开

目录 一、余子式&#xff1a;将行列式某元素所在行和列的元素全去掉 剩余部分所构成的行列式&#xff0c;称为该元素的余子式 二、代数余子式 三、行列式等于它的任一行&#xff08;列&#xff09;的各元素与对应代数余子式乘积之和 四、行列式某行元素&#xff08;列&…

单机物理机部署Datax

一、概述 DataX 是阿里巴巴开源的一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 源码地址&#xff1a;https://github.com/alibaba/DataX 为了解决异构数据…

什么是云服务器?云服务器的工作原理是介绍

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

Linux shell jq工具操作文档(jq --help使用示例)

文章目录 jq工具介绍jq --help解读英文中文 使用示例1. 使用最简单的过滤器。将输入复制到输出&#xff0c;不做任何修改&#xff08;除了格式化&#xff09;2. 使用 -c 选项进行紧凑输出而非美化输出3. 使用 -n 选项以 null 作为单一输入值&#xff08;用于创建新json&#xf…

STL——stack容器和queue容器详解

目录 &#x1f4a1;stack &#x1f4a1;基本概念 常用接口 &#x1f4a1;queue &#x1f4a1;基本概念 &#x1f4a1;常用接口 &#x1f4a1;stack &#x1f4a1;基本概念 栈&#xff08;stack&#xff09;&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端…

OpenGL 网格拾取坐标(Qt)

文章目录 一、简介二、代码实现三、实现效果参考资料一、简介 有时候我们希望通过鼠标来拾取某个网格中的坐标,这就涉及到一个很有趣的场景:光线投射,也就是求取一条射线与网格的交点,这里如果我们采用普通遍历网格中的每个面片的方式,当网格的面片数据量很大时计算效率就…

pyside6 捕捉主窗口关闭后,进行释放相关的资源

import sys from PySide6 import QtGui from PySide6.QtWidgets import QWidget,QApplication,QMessageBoxclass Message(QWidget):def __init__(self):# 如果希望窗口内嵌于其他部件&#xff0c;可添加parent参数super(Message, self).__init__()# 调用初始化方法self.initUI(…

Python基本语法与变量的相关介绍

python基本语法与变量 python语句的缩进 Python代码块使用缩进对齐表示代码逻辑&#xff0c;Python每段代码块缩进的空白数量可以任意&#xff0c;但要确保同段代码块语句必须包含相同的缩进空白数量。建议在代码块的每个缩进层次使用单个制表符或两个空格或四个空格 , 切记不…

flutter使用get库管理路由,并设页面跳转动画和常见动画

get库还是非常强大的一个仓库&#xff0c;里面包含了非常常用的一些方法&#xff0c;比如路由管理&#xff0c;这是最常见和最常用的一个功能了&#xff0c;我们可以先配置一个路由对象&#xff0c;然后在里面配置路由列表&#xff0c;并且设置路由跳转方式。 第一种方式&…

教师资格证照片分辨率怎么调?教师资格证上传照片要求

最近教师资格证考试开始报名了&#xff0c;在报名之前需要准备好一些必备的材料&#xff0c;比如证件照片&#xff0c;报名考试平台一般都会对上传的证件照有具体的要求&#xff0c;比如考生本人近6个月以内的免冠正面证件照&#xff1b;照片格式及大小&#xff1a;JPG/JPEG格式…

Springboot读取配置文件

多种配置文件格式 springboot项目中不同配置文件的优先加载顺序 为&#xff1a;properties> yml >yaml>自定义核心类配置 自定义配置文件的加载 一般系统会加载默认的application.properties或者application.yml,但如果使用自定义配置文件&#xff0c;可使用下面方…

SpringSecurity入门demo(二)表单认证

上一篇博客集成 Spring Security&#xff0c;使用其默认生效的 HTTP 基本认证保护 URL 资源&#xff0c;下面使用表单认证来保护 URL 资源。 一、默认表单认证&#xff1a; 代码改动&#xff1a;自定义WebSecurityConfig配置类 package com.security.demo.config; import or…

Next.js 集成 Auth0 登入和自定义登入页面

Next.js 集成 Auth0 和自定义登入页面 注册账号和基本配置进入 auth0 官网注册账号并登入进入控制台后访问 Applications/Applications进入程序配置页面添加配置 在 Next.js 使用在项目中集成 通过 Auth0Lock 配置方式自定义登入页面效果展示实现过程 注册账号和基本配置 进入…

scroll-view在小程序页面里实现滚动,uniapp项目

要实现红框中的区域进行滚动,scroll-view必须写高 <template><!-- 合同-待确认 --><view class"viewport"><!-- 上 --><view class"top-box"><!-- tab --><view class"tabs"><textv-for"(ite…

Alibaba-> EasyExcel 整理3

1 导入依赖 <!-- easyExcel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version >3.2.1</version><exclusions><exclusion><artifactId>poi-ooxml-schemas</art…

what is BERT?

BERT Introduction Paper 参考博客 9781838821593_ColorImages.pdf (packt-cdn.com) Bidirectional Encoder Representation from Transformer 来自Transformer的双向编码器表征 基于上下文&#xff08;context-based&#xff09;的嵌入模型。 那么基于上下文&#xff08;…

【MySQL性能优化】- MySQL结构与SQL执行过程

MySQL结构与SQL执行过程 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f3c6; 博客首页 怒放吧德德 To记录领地 &#x1f31d;分享学习心得&#xff0c;欢迎指正…