In this video we’ll build a fun little Bitcoin Price Web Scraper with Tkinter and Beautiful Soup!

Scraping data from websites is super easy with BeautifulSoup. In this video I’ll show you how to do it and also create a little app that checks for price updates every 30 seconds.

The app will also tell you whether the price of Bitcoin has gone up or down since the last time it checked, and the text will change color to red if the price dropped, and green if the price increased.

We’ll need to pip install beautifulsoup4 from the terminal for this to work.

Python Code:
(Github Code)

from tkinter import *
from bs4 import BeautifulSoup
import urllib
from urllib import request
from datetime import datetime

root = Tk()
root.title(' - Bitcoin Price Grabber')

global previous
previous = False

# Get Current Time
now =
current_time = now.strftime("%I:%M:%S %p")

# Create a Frame
my_frame = Frame(root, bg="black")

# Define logo image
logo = PhotoImage(file='images/bitcoin.png')
logo_label = Label(my_frame, image=logo, bd=0)
logo_label.grid(row=0, column=0, rowspan=2)

# Add bitcoin price label
bit_label = Label(my_frame, text='TEST', 
	font=("Helvetica", 45),
bit_label.grid(row=0, column=1, padx=20, sticky="s")

# Latest Price Up/Down
latest_price = Label(my_frame, text="move test",
	font=("Helvetica", 8),
latest_price.grid(row=1, column=1, sticky="n" )

#Grab the bitcoin price
def Update():
	global previous

	# Grab Bitcoin Price
	page = urllib.request.urlopen("").read()
	html = BeautifulSoup(page, "html.parser")
	price_large = html.find(class_="price-large")
	# convert to string so we can slice
	price_large1 = str(price_large)
	# Grab a slice that contains the price
	price_large2 = price_large1[54:63]

	# Update our bitcoin label
	# Set timer to 30 seconds
	# 1 second = 1000
	root.after(30000, Update)

	# Get Current Time
	now =
	current_time = now.strftime("%I:%M:%S %p")

	# Update the status bar
	status_bar.config(text=f'Last Updated: {current_time}   ')

	# Determine Price Change
	# grab current Price
	current = price_large2

	# remove the comma
	current = current.replace(',', '')

	if previous:
		if float(previous) > float(current):
				text=f'Price Down {round(float(previous)-float(current), 2)}', fg="red")

		elif float(previous) == float(current):
			latest_price.config(text="Price Unchanged", fg="grey")	

				text=f'Price Up {round(float(current)-float(previous), 2)}', fg="green")			

		previous = current
		latest_price.config(text="Price Unchanged", fg="grey")

# Create status bar
status_bar = Label(root, text=f'Last Updated {current_time}   ',

status_bar.pack(fill=X, side=BOTTOM, ipady=2)

# On program start, run update function


John Elder

John is the CEO of where he teaches over 100,000 students how to code! He founded one of the Internet's earliest advertising networks and sold it to a publicly company at the height of the first dot com boom. After that he developed the award-winning Submission-Spider search engine submission software that's been used by over 3 million individuals, businesses, and governments in over 42 countries. He's written several Amazon #1 best selling books on coding, and runs a popular Youtube coding channel.

View all posts

1 comment

Your email address will not be published. Required fields are marked *

  • I often run into issues if I don’t set/spoof a specific header/user-agent spoofing when I request a web page.
    Regular expressions (‘re’ module) might seem difficult, but they’re more generally useful, and a great alternative to beautifulsoup.

    If you read this, Mr. Elder– I appreciate your content and the effort involved. Thank you.

John Elder

John is the CEO of where he teaches over 100,000 students how to code! He founded one of the Internet's earliest advertising networks and sold it to a publicly company at the height of...