robertvari

Weather Data

Feb 2nd, 2020
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.16 KB | None | 0 0
  1. import requests, re
  2. from matplotlib import pyplot as plt
  3. from matplotlib.ticker import EngFormatter
  4. from bs4 import BeautifulSoup
  5.  
  6. def main(url):
  7.  
  8.     result = requests.get(url)
  9.     status = result.status_code
  10.  
  11.     # status = 404
  12.     assert status == 200, f"Site Error: Status Code {status}"
  13.  
  14.     data = get_data(result.content)
  15.     draw_data(data)
  16.  
  17. def get_data(source):
  18.     """
  19.    Gets a html source (str) and parses it with BeautifulSoup
  20.    :param source: str()
  21.    :return: dict()
  22.    """
  23.  
  24.     soup = BeautifulSoup(source, 'lxml')
  25.     page_title = soup.title.text
  26.  
  27.     columns = soup.find_all('div', class_="oszlop")
  28.  
  29.     day_list = []
  30.     temp_mins = []
  31.     temp_maxes = []
  32.     for col in columns:
  33.         date_day = col.find('div', class_='nap')
  34.         date_num = col.find('div', class_='datum')
  35.  
  36.         day_list.append( f'{date_num.text} {date_day.text}' )
  37.  
  38.         max_temp = col.find('div', class_='max-homerseklet-default max')
  39.         max_num = re.findall(r'\d+', max_temp.text)[0]
  40.         temp_maxes.append( int(max_num) )
  41.  
  42.         min_temp = col.find('div', class_='min-homerseklet-default max')
  43.         min_num = re.findall(r'\d+', min_temp.text)[0]
  44.         temp_mins.append(int(min_num))
  45.  
  46.     return {
  47.         "title": page_title,
  48.         "days": day_list,
  49.         "mins": temp_mins,
  50.         "maxes": temp_maxes
  51.     }
  52.  
  53. def draw_data(data):
  54.     """
  55.    Gets a dictionary and draws a plot fron it's data
  56.    :param data: dict()
  57.    :return: None
  58.    """
  59.  
  60.     plt.style.use("fivethirtyeight")
  61.  
  62.     title = data["title"]
  63.     day_list = data["days"]
  64.  
  65.     minimums = data["mins"]
  66.     maximums = data["maxes"]
  67.  
  68.     plt.plot(day_list, minimums, color="#4965B0", marker="o", label="Minimums")
  69.     plt.plot(day_list, maximums, color="#C08731", marker="o", label="Maximums")
  70.  
  71.     ay = plt.gca().get_yaxis()
  72.     ay.set_major_formatter(EngFormatter(unit="°C"))
  73.  
  74.     plt.xticks(fontsize=10)
  75.  
  76.     plt.title(title)
  77.     plt.legend()
  78.     # plt.savefig(f'{title}.png')
  79.     plt.show()
  80.  
  81. main('https://www.idokep.hu/30napos/Budapest')
  82. # main('https://www.idokep.hu/30napos/Gy%C5%91r')
  83. # main('https://www.idokep.hu/30napos/Debrecen')
Add Comment
Please, Sign In to add comment