If this code scares you, keep in mind that there are plenty of ways to do scraping in Python, including BeautifulSoup and scrape.py. Yet even these have a non-trivial learning curve and a lot of rough edges. It makes you think the semantic web is really worth pursuing...
import time
import re
import urllib
import smtplib
def update(the_score):
# wait 5 minutes to poll the site
time.sleep(300)
# grab the raw leaderboard
html = urllib.urlopen('http://www.majorschampionships.com/masters/2008/scoring/').readlines()
# Non-greedy regex to pick out relevant blocks
t = re.compile('\/scorecard\/\d+.html">.*?\d+<\/td>')
raw = t.findall(str(html))
# Fill out our leaderboard, cleaning things up along the way
board = []
for item in raw:
r = re.compile('\/scorecard\/\d+.html">')
r2 = re.compile('
')
close = r2.sub('', r.sub('', item))
score = re.compile('-?\d+')
crap = re.compile('<.*')
name = crap.sub('', close)
# Return a list of tuples: [('Trevor Immelman', -11), ('Brandt Snedeker', -9), ...]
board.append((name, int(score.findall(close)[0])))
# Set some useful variables
leader = board[0][0]
leader_score = board[0][1]
tiger_score = 0
for guy in board:
if guy[0] == 'Tiger Woods':
tiger_score = guy[1]
# If there is anything new to report, send out the e-mail.
if tiger_score != the_score:
the_score = tiger_score
msg = open('/path/to/msg.txt', 'r').read()
# use gmail as our SMTP server
server = SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login('[redacted]@gmail.com', '[redacted]')
if the_score > leader_score:
# Compose the message
m = msg.replace('[body]', 'Tiger is now at ' + str(the_score) + ' trailing ' + leader + ' by ' str(abs(leader_score - tiger_score)) strokes.')
else:
m = msg.replace('[body]', 'Tiger is leading the Masters.')
# send and clean up; rinse and repeat.
server.sendmail('[redacted]@gmail.com', '[redacted]@tmo.blackberry.net', m)
server.quit()
return update(the_score)