在基于Flask的网站上显示更改的Python变量

问题描述 投票:0回答:1

我目前正在建立一个基于Python3.6 Flask的网站,该网站托管在Flask服务器上,并提供从网上其他来源获取的产品的实时价格,所有这些都集中在一个地方,以便于比较。 Currentley我有一个使用BeautifulSoup4的scraper.py文件,该文件可在Web上获取我需要的信息。包含此信息的变量将导入到名为app.py的文件中,该文件包含flask脚本作为模块(来自scraper.py import x,y,z)。X,Y,Z变量通过flask传递到网页,并通过jinja 2语法<p> {{ X }} </p>显示。

我面临的问题是,在flask服务器启动时,scraper.py仅执行一次。但是,我需要更新变量,以便显示最新信息。为了解决我的问题,我创建了一个为数据抓取的循环,然后暂停五分钟,然后再次运行。但是,由于它们是一个循环,所以我的app.py文件似乎无法导入scraper.py文件,结果网页上没有显示任何信息。

是否可以同时运行两个python脚本(flask Web服务器脚本和scraper)并将实时数据报告给网页?我现在很困。谢谢!App.py:

        # Import Modules Here:
    import markdown
    import os
    import datetime

    # Import Flask Framework Here:
    from flask import Flask, flash, redirect, render_template, request, session, abort, url_for
    app = Flask(__name__)

    # Import Variables From ScrprAG.py:
    from ScprAG import AG_GRAM_SPOT, AG_OUNCE_SPOT, GLDAG_BRITANNIA, GLDAG_MAPLE, GLDAG_PHILHARMONIC, BBPAG_BRITANNIA, BBPAG_MAPLE, BBPAG_PHILHARMOIC

    # ./Home Script + Portfolio Page:
    @app.route("/")
    @app.route("/index")
    def index():
        return render_template('index.html', AG_GRAM_SPOT_WEB=AG_GRAM_SPOT, AG_OUNCE_SPOT_WEB=AG_OUNCE_SPOT, GLDAG_BRITANNIA_WEB=GLDAG_BRITANNIA, BBPAG_BRITANNIA_WEB=BBPAG_BRITANNIA, GLDAG_PHILHARMONIC_WEB=GLDAG_PHILHARMONIC, BBPAG_PHILHARMOIC_WEB=BBPAG_PHILHARMOIC, GLDAG_MAPLE_WEB=GLDAG_MAPLE, BBPAG_MAPLE_WEB=BBPAG

_MAPLE)

Scraper.py:

    # Import Modules Here:
import requests
import urllib.request
import time
from bs4 import BeautifulSoup

# Variable List:
url_spot_gram = (None)  # AG_GRAM_SPOT
AG_GRAM_SPOT = (None)

url_spot_ounce = (None)  # AG_OUNCE_SPOT
AG_OUNCE_SPOT = (None)

url_1 = (None)  # GLDAG_BRITANNIA
GLDAG_BRITANNIA = (None)

url_2 = (None)  # BBPAG_BRITANNIA
BBPAG_BRITANNIA = (None)

url_3 = (None)
GLDAG_PHILHARMONIC = (None)

url_4 = (None)
BBPAG_PHILHARMOIC = (None)

url_5 = (None)
GLDAG_MAPLE = (None)

url_6 = (None)
BBPAG_MAPLE = (None)

# Scraping Script Here:

def job():

    # Current Silver Spot Price: GRAM:
    global AG_GRAM_SPOT
    url_spot_gram = 'https://www.bullionbypost.co.uk/silver-price/silver-price-per-gram/'
    response = requests.get(url_spot_gram)
    soup = BeautifulSoup(response.text, 'html.parser')
    AG_GRAM_SPOT = soup.find('span', {'name': 'current_price_field'})

    # Current Silver Spot Price: OUNCE:
    global AG_OUNCE_SPOT
    url_spot_ounce = 'https://www.bullionbypost.co.uk/silver-price/week/ounces/GBP/'
    response = requests.get(url_spot_ounce)
    soup = BeautifulSoup(response.text, 'html.parser')
    AG_OUNCE_SPOT = soup.find('span', {'name': 'current_price_field'})

    # Script: GOLD.CO.UK | Silver Britannia
    global GLDAG_BRITANNIA
    url_1 = 'https://www.gold.co.uk/silver-coins/silver-britannia-coins/1oz-silver-britannia-dog-2018/'
    response = requests.get(url_1)
    soup = BeautifulSoup(response.text, 'html.parser')
    GLDAG_BRITANNIA = soup.find('td', {'id': 'total-price-inc-vat-1'})

    # Script: BULLIONBYPOST.CO.UK | Silver Britannia
    global BBPAG_BRITANNIA
    url_2 = 'https://www.bullionbypost.co.uk/silver-coins/britannia-silver-ounce/1oz-silver-britannia-best-value/'
    response = requests.get(url_2)
    soup = BeautifulSoup(response.text, 'html.parser')
    BBPAG_BRITANNIA = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: GOLD.CO.UK | Silver Philharmonic
    global GLDAG_PHILHARMONIC
    url_3 = 'https://www.gold.co.uk/silver-coins/austrian-silver-philharmonic-coins/silver-philharmonic-2020/'
    response = requests.get(url_3)
    soup = BeautifulSoup(response.text, 'html.parser')
    GLDAG_PHILHARMONIC = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: BULLIONBYPOST.CO.UK | Silver Philharmoic
    global BBPAG_PHILHARMOIC
    url_4 = 'https://www.bullionbypost.co.uk/silver-coins/austrian-philharmonic/2020-1oz-austrian-philharmonic-silver-coin/'
    response = requests.get(url_4)
    soup = BeautifulSoup(response.text, 'html.parser')
    BBPAG_PHILHARMOIC = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: GOLD.CO.UK | Silver Maple
    global GLDAG_MAPLE
    url_5 = 'https://www.gold.co.uk/silver-coins/candian-silver-maple-coins/1oz-canadian-maple-silver-coin-2020/'
    response = requests.get(url_5)
    soup = BeautifulSoup(response.text, 'html.parser')
    GLDAG_MAPLE = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})

    # Script: BULLIONBYPOST.CO.UK | Silver Maple
    global BBPAG_MAPLE
    url_6 = 'https://www.bullionbypost.co.uk/silver-coins/britannia-silver-ounce/1oz-silver-britannia-best-value/'
    response = requests.get(url_6)
    soup = BeautifulSoup(response.text, 'html.parser')
    BBPAG_MAPLE = soup.find('td', {'id': 'price-inc-vat-per-unit-1'})
    time.sleep(60)

    print(BBPAG_MAPLE)
    print(BBPAG_PHILHARMOIC)
    print(BBPAG_BRITANNIA)
    print(GLDAG_MAPLE)
    print(GLDAG_PHILHARMONIC)
    print(GLDAG_BRITANNIA)

while True:
    job()
python web flask dynamic screen-scraping
1个回答
0
投票
您的页面在功能末尾呈现。我不知道有什么方法可以更新Jinja模板中{{}}中的值...它们已经呈现。

我的建议是使用Ajax并为这些值创建一个REST Api。

    [所有可能的产品都通过ajax在浏览器中每隔x秒要求其价格;
  • Flask应用程序每隔x秒刷新一次所有可能的价格;
  • 烧瓶通过API提供所需的值。
© www.soinside.com 2019 - 2024. All rights reserved.