Gold Price, a Web Scraping Project
In this workbook I will show some data scraping techniques to get real time quotes of precious metals from web in a fast, free and automated way! We will see how to extract Gold, Silver & Platinum price from Kitco.com and convert it from "Dollar / Troy Ounce" to "Euro / Gram" using Google Finance currency rates.
This Python code can be used, for example, to automatically update the price of precious metals on your website or extract a .CSV with real time quotes.
Disclaimer: As stated in Kitco.com Terms of Use, data seen and/or extracted with this code are intendended to be used for informational purpose only.
1. Configuration & Functions Definition
In this section we will import libraries and define the functions used to extract and convert data.
Import libraries.
import requests
from datetime import datetime
from bs4 import BeautifulSoup
import pandas as pd
Define the function to get "Dollar / Euro" currency rate from Google Finance.
def get_usd_eur():
global usd_eur
# Connect with Google Finance
URL = 'https://www.google.com/finance/quote/EUR-USD'
HTML_PAGE = requests.get(URL).text
soup = BeautifulSoup(HTML_PAGE, 'html.parser')
# Extract "Euro / Dollar" rate
eur_usd = soup.find_all('div', attrs = {'class': 'YMlKec fxKbKc'})
eur_usd = [float(x.string.replace(',', '')) for x in eur_usd][0]
# Convert "Euro / Dollar" rate in "Dollar / Euro"
usd_eur = round(1 / eur_usd, 5)
return usd_eur
Define the function to get bid & ask value of precious metal in "Dollar / Troy Ounce" from Kitco.com
def get_metal_value(URL):
global bid, ask
# Connect with Kitco.com
HTML_PAGE = requests.get(URL).text
soup = BeautifulSoup(HTML_PAGE, 'html.parser')
# Get precious metal value in "Dollar / Troy Ounce" and convert it from string to float
bid_string = soup.find_all('span', attrs = {'id': 'sp-bid'})
bid = [float(x.string.replace(',', '')) for x in bid_string][0]
ask_string = soup.find_all('span', attrs = {'id': 'sp-ask'})
ask = [float(x.string.replace(',', '')) for x in ask_string][0]
return bid, ask
Define the function to convert precious metal value from "Dollar / Troy Ounce" to "Euro / Gram".
def convert_metal_value():
global bid_final, ask_final
# Convert precious metal value in "Euro / Gram"
t_oz = 31.1034768
bid_final = round(bid * usd_eur / t_oz, 5)
ask_final = round(ask * usd_eur / t_oz, 5)
return bid_final, ask_final
2. Data Scraping & Export
In this section we will store Gold, Silver & Platinum value in a DataFrame so it can be printed on console or exported in .CSV file format.
Extract and convert data.
URL_dict = {'Gold': 'https://www.kitco.com/charts/livegold.html',
'Silver': 'https://www.kitco.com/charts/livesilver.html',
'Platinum': 'https://www.kitco.com/charts/liveplatinum.html'}
header_ = ['metal', 'bid', 'ask', 'datetime']
list_ = []
datetime_ = datetime.now()
# Get and convert values from web
for key, value in URL_dict.items():
get_usd_eur()
get_metal_value(value)
convert_metal_value()
list_.append([key, bid_final, ask_final, datetime_])
# Print values
data = pd.DataFrame(list_, columns = header_)
display(data)
# Export data in .CSV
data.to_csv('metals_' + str(datetime_) + '.csv', sep = ';', decimal = ',', index = None)