Делаем консольное приложение погода на Python с помощью requests и bs4

от автора

Привет, Хабр!

Сегодня я буду делать консольное приложение «Погода» на Python с помощью requests и bs4.
Что будет делать эта программа?

  1. Показывать погоду в вашем городе.
  2. Показывать температуру воздуха.
  3. Показывать осадки.
  4. Показывать влажность.
  5. И скорость ветра.

Фронт работ ясен, значит можно приступать.

Установка модулей и создание папки с проектом

Для начала открываем командную строку и устанавливаем модули requests и bs4 с помощью этой команды:

pip install requests bs4

Отлично! Теперь создаем новую папку с именем «WeatherApp».

Далее в этой папке создаем файл main.py

Пишем код

Открываем этот файл и начинаем непосредственно писать код.

В начале импортируем нужные нам модули:

import requests import os import time from bs4 import BeautifulSoup

os.system("cls")#Очищаем консоль

Хорошо.

Далее нужно выбрать сайт, с которого мы будем брать данные.

Я выбрал сайт Google Weather.

Открываем его и копируем весь текст из строки браузера:

Создаем переменную SITE и вставляем в нее URL:

SITE = 'https://www.google.com/search?sxsrf=ALeKk02B-rwjd_voK5Scd2O1FIP-lLKvUg%3A1586500409376&ei=OROQXsPPFpL8kwX0hIaYBQ&q=google+%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0&oq=google+%D0%BF%D0%BE&gs_lcp=CgZwc3ktYWIQAxgAMgUIABDLATIFCAAQywEyBQgAEMsBMgUIABDLATIFCAAQywEyBQgAEMsBMgUIABDLATIFCAAQywEyBQgAEMsBMgUIABDLAToECAAQRzoECAAQQzoCCAA6BAgjECdKFAgXEhA3LTEzN2cxNTFnMzU3Zzg0Sg0IGBIJNy0xZzFnMWc0UJk0WL1CYJNPaABwAngBgAGgA4gBuRCSAQkwLjUuMS4yLjGYAQCgAQGqAQdnd3Mtd2l6&sclient=psy-ab'

Далее создаем заголовки, если их не передать, будет считаться что заходит бот и наш URL адрес не будет обработан.

Чтобы вставить нужные заголовки мы создаем словарь с ключом User-Agent, а значение можно скопировать из Google просто написав в браузере my user agent.

Создаем словарь headers:

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'} #В значении должен находиться ваш User-Agent

Далее нам нужно получить HTML разметку нашего сайта.

Создаем переменную full_page котороая будет хранить в себе разметку сайта.

full_page = requests.get(SITE, headers=headers)# Получаем HTML разметку сайта #Google Weather # Первое значение переменной full_page это URL сайта, а второе заголовки

Отлично!

С requests мы работать уже закончили, теперь нужно получить нужные теги с их классами и идендификаторами.

Пишем:

soup = BeautifulSoup(full_page.content, 'html.parser')

Для начала узнаем погоду. Для этого переходим на сайт Google Weather и открываем панель
разработчика с помощью сочетания клавиш Ctrl+Shift+I.

Далее жмем на этот инструмент:

А потом нажимаем на текст с погодой:

Теперь в окне разроботчика у нас подсветился нужный тег:

Итак, что мы видим: У нас есть тег span с классом vk_gy vk_sh и идендификатором wob_dc.

Отлично! Значит теперь мы можем узнавать какая сейчас погода!

Для этого создаем словарь в кортеже в котором будет хранится разметка нашей погоды:

weather = soup.findAll("span", {"class": "vk_gy vk_sh", "id": "wob_dc"}) # В этой строке кода мы ищем по всей HTML странице тег span с классом vk_gy vk_sh # и идендификатором wob_dc 

Точно также поступаем с другими элементами:

  1. Открываем панель разработчика (Ctrl+Shift+I).
  2. Далее жмем по инструменту «Выбрать».
  3. Жмем на нужный на элемент.
  4. Ищем нужные нам теги, классы и идендификотеры.

Вот остальной код:

temperature = soup.findAll("span", {"class": "wob_t", "id": "wob_tm"}) precipitation = soup.findAll("span", {"id": "wob_pp"}) hamidite = soup.findAll("span", {"id": "wob_hm"}) wind = soup.findAll("span", {"class": "wob_t", "id": "wob_ws"})

Далее значения этих кортежей нужно занести в переменные ввиде текста:

 wind_var = wind[0].text # Заносим в переменную wind_var текст из HTML разметки wind_lst = [] # Создаем список в котором позже будем сравнивать изменения ветра wind_lst.append(wind_var)# Добавляем в список первый элемент

Поступаем так со всеми кортежами:

hamidite_var = hamidite[0].text hamidite_lst = [] hamidite_lst.append(hamidite_var)  precipitation_var = precipitation[0].text precipitation_lst = [] precipitation_lst.append(precipitation_var)  weather_var = weather[0].text weather_var_lst = [] weather_var_lst.append(weather_var)  temp = tempreture[0].text temp_lst = [] temp_lst.append(temp) 

Далее создаем функцию котороя будет показывать текст Погоды, влажности и т.д, а также все время обновлять эти значения:

 def current_weather(): 	full_page = requests.get(SITE, headers=headers)#Обновляем страницу 	soup = BeautifulSoup(full_page.content, 'html.parser') 	 	wind = soup.findAll("span", {"class": "wob_t", "id": "wob_ws"})#Обновляем значение скорости ветра 	wind_var = wind[0].text 	if wind_var != wind_lst[0]:#Если скорость ветра которая была до этого не равна текущей скорости то очистить список и занести в не новое значение 		os.system("cls")#Очистить экран 		wind_lst.clear()#Очистить список 		wind_lst.append(wind_var)#Добавить в список новое значение 		print("Weather:", weather_var_lst[0])#Вывести текст 		print("Temperature:", temp_lst[0] + "°C") 		print("Precipitaion:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0]) 

То же самое проделываем с отсальными переменными:

         hamidite = soup.findAll("span", {"id": "wob_hm"}) 	hamidite_var = hamidite[0].text 	if hamidite_var != hamidite_lst[0]: 		os.system("cls") 		hamidite_lst.clear() 		Hamidate_lst.append(hamidite_var) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0])  	precipitation = soup.findAll("span", {"id": "wob_pp"}) 	precipitation_var = precipitation[0].text 	if precipitation_var != precipitation_lst[0]: 		os.system("cls") 		precipitation_lst.clear() 		precipitation_lst.append(precipitation_var) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0])  	weather = soup.findAll("span", {"class": "vk_gy vk_sh", "id": "wob_dc"}) 	weather_var = weather[0].text 	if weather_var != weather_var_lst[0]: 		os.system("cls")  		weather_var_lst.clear() 		weather_var_lst.append(weather_var) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0])  	tempreture = soup.findAll("span", {"class": "wob_t", "id": "wob_tm"})  	temp = tempreture[0].text 	temp = int(temp) 	if temp != temp_lst[0]: 		os.system("cls") 		temp_lst.clear() 		temp_lst.append(temp) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0]) 	time.sleep(5)#Ждать 5 секунд что бы снова обновиться

Теперь осталось запихнуть эту функцию в цикл и наслаждаться результатом:

try: 	print("Weather:", weather_var_lst[0]) 	print("Temperature:", str(temp_lst[0]) + "°C") 	print("Precipitation:", precipitation_lst[0]) 	print("Hamidite:", hamidite_lst[0]) 	print("Wind:", wind_lst[0]) 	while True: 		current_weather() except: 	quit()

Если будет выходить ошибка то пользователь ее не увидит так как цикл находится в конструкции try.

Вот весь код:

 import requests import os import time from bs4 import BeautifulSoup  os.system("cls")  SITE = 'https://www.google.com/search?sxsrf=ALeKk02B-rwjd_voK5Scd2O1FIP-lLKvUg%3A1586500409376&ei=OROQXsPPFpL8kwX0hIaYBQ&q=google+%D0%BF%D0%BE%D0%B3%D0%BE%D0%B4%D0%B0&oq=google+%D0%BF%D0%BE&gs_lcp=CgZwc3ktYWIQAxgAMgUIABDLATIFCAAQywEyBQgAEMsBMgUIABDLATIFCAAQywEyBQgAEMsBMgUIABDLATIFCAAQywEyBQgAEMsBMgUIABDLAToECAAQRzoECAAQQzoCCAA6BAgjECdKFAgXEhA3LTEzN2cxNTFnMzU3Zzg0Sg0IGBIJNy0xZzFnMWc0UJk0WL1CYJNPaABwAngBgAGgA4gBuRCSAQkwLjUuMS4yLjGYAQCgAQGqAQdnd3Mtd2l6&sclient=psy-ab' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36'} #В значении должен находиться ваш User-Agent  full_page = requests.get(SITE, headers=headers)# Получаем HTML разметку сайта #Google Weather # Первое значение переменной full_page это URL сайта, а второе заголовки soup = BeautifulSoup(full_page.content, 'html.parser')  weather = soup.findAll("span", {"class": "vk_gy vk_sh", "id": "wob_dc"}) # В этой строке кода мы ищем по всей HTML странице тег span с классом vk_gy vk_sh # и идендификатором wob_dc temperature = soup.findAll("span", {"class": "wob_t", "id": "wob_tm"}) precipitation = soup.findAll("span", {"id": "wob_pp"}) hamidite = soup.findAll("span", {"id": "wob_hm"}) wind = soup.findAll("span", {"class": "wob_t", "id": "wob_ws"})  wind_var = wind[0].text # Заносим в переменную wind_var текст из HTML разметки wind_lst = [] # Создаем список в котором позже будем сравнивать изменения ветра wind_lst.append(wind_var)# Добавляем в список первый элемент  hamidite_var = hamidite[0].text hamidite_lst = [] hamidite_lst.append(hamidite_var)  precipitation_var = precipitation[0].text precipitation_lst = [] precipitation_lst.append(precipitation_var)  weather_var = weather[0].text weather_var_lst = [] weather_var_lst.append(weather_var)  temp = temperature[0].text temp_lst = [] temp_lst.append(temp)  def current_weather(): 	full_page = requests.get(SITE, headers=headers)#Обновляем страницу 	soup = BeautifulSoup(full_page.content, 'html.parser') 	 	wind = soup.findAll("span", {"class": "wob_t", "id": "wob_ws"})#Обновляем значение скорости ветра 	wind_var = wind[0].text 	if wind_var != wind_lst[0]:#Если скорость ветра которая была до этого не равна текущей скорости то очистить список и занести в не новое значение 		os.system("cls")#Очистить экран 		wind_lst.clear()#Очистить список 		wind_lst.append(wind_var)#Добавить в список новое значение 		print("Weather:", weather_var_lst[0])#Вывести текст 		print("Temperature:", temp_lst[0] + "°C") 		print("Precipitaion:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0]) 	hamidite = soup.findAll("span", {"id": "wob_hm"}) 	hamidite_var = hamidite[0].text 	if hamidite_var != hamidite_lst[0]: 		os.system("cls") 		hamidite_lst.clear() 		Hamidate_lst.append(hamidite_var) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0])  	precipitation = soup.findAll("span", {"id": "wob_pp"}) 	precipitation_var = precipitation[0].text 	if precipitation_var != precipitation_lst[0]: 		os.system("cls") 		precipitation_lst.clear() 		precipitation_lst.append(precipitation_var) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0])  	weather = soup.findAll("span", {"class": "vk_gy vk_sh", "id": "wob_dc"}) 	weather_var = weather[0].text 	if weather_var != weather_var_lst[0]: 		os.system("cls")  		weather_var_lst.clear() 		weather_var_lst.append(weather_var) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0])  	tempreture = soup.findAll("span", {"class": "wob_t", "id": "wob_tm"})  	temp = tempreture[0].text 	temp = int(temp) 	if temp != temp_lst[0]: 		os.system("cls") 		temp_lst.clear() 		temp_lst.append(temp) 		print("Weather:", weather_var_lst[0]) 		print("Temperature:", str(temp_lst[0]) + "°C") 		print("Precipitation:", precipitation_lst[0]) 		print("Hamidite:", hamidite_lst[0]) 		print("Wind:", wind_lst[0]) 	time.sleep(5)#Ждать 5 секунд что бы снова обновиться  try: 	print("Weather:", weather_var_lst[0]) 	print("Temperature:", str(temp_lst[0]) + "°C") 	print("Precipitation:", precipitation_lst[0]) 	print("Hamidite:", hamidite_lst[0]) 	print("Wind:", wind_lst[0]) 	while True: 		current_weather() except: 	quit() 

Также можно реализовать функцию записи файл всех значений погоды или скорости ветра, а потом с помощью библиотеки matplotlib сделать диаграмму.

Спасибо за внимание!

ссылка на оригинал статьи https://habr.com/ru/post/496988/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *