【发布时间】:2023-03-29 09:46:01
【问题描述】:
目前正在构建一个基于 Python3.6 Flask 的网站,该网站托管在 Flask 服务器上,并在一个地方提供从网络上其他来源获取的产品的实时价格,以便于比较。
我有一个 scraper.py 文件,它使用 BeautifulSoup4 抓取网络以获取信息。包含此信息的变量被导入到名为 app.py 的文件中,该文件包含作为模块的烧瓶脚本(从 scraper.py 导入 X、Y、Z)。 X、Y、Z 变量通过烧瓶传递到网页,并通过 jinja 2 语法显示:<p> {{ X }} </p>。
问题是 scraper.py 仅在烧瓶服务器启动时执行一次。但是,我需要以设定的时间间隔更新变量,以便显示最新信息。
如果有人可以通过提供我可以建立的灵魂来帮助我,那就太好了。我从未使用过 AJAX,所以理想情况下,该解决方案将由 Python/Flask 组成。
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()
【问题讨论】:
-
将值保存在静态文件夹中,在烧瓶中创建一个更新值的例程,然后使用 ajax 刷新值
标签: python web flask dynamic screen-scraping