Python Запрос и анализ данных с сайта
Я в этом вопросе абсолютный новичок. Задание, кажется, простое для тех, кто в этом разбирается, но я никак подойти к решению не могу, рецепты из интернета приводят мой пайчарм к ошибкам, в общем, задания:
Написать программу, которая на основании запроса с сайта http://www.cbr.ru/scripts/XML_daily.asp определит курс гонконгского доллара к российскому рублю.
Написать программу, которая на основании запроса к https://openweathermap.org выведет среднюю и максимальную температуру(morn) температура в вашем городе (в запросе можно указать широту и долготу инд города) за предстоящие 5 дней(вкл сегодняшний) в градусах Цельсия. Подобный запрос потребует регистрации на данном ресурсе с использованием бесплатного плана (free).
Может сможете подсказать в какую сторону рыть и что читать.
Ответы (3 шт):
Сразу скажу, сделал без pandas.
Сначала первая задача:
Написать программу, которая на основании запроса с сайта http://www.cbr.ru/scripts/XML_daily.asp определит курс гонконгского доллара к российскому рублю.
Сайт даёт ответ в формате xml, значит lxml нам в руки, и вперёд!
import requests # pip install requests
from lxml import etree # pip install lxml
xml_response = etree.fromstring(requests.get("http://www.cbr.ru/scripts/XML_daily.asp").text.encode("1251"))
curs = xml_response.find("Valute[@ID='R01200']/Value").text
print(f"Один Гонконгский доллар равен {curs} рублей")
Получаем ответ от сайта, и декодируем текст в байты, по кодировке Windows-1251. Зачем? Сайт возвращает xml в данной кодировке, и lxml отказывается работать с ним напрямую, нужно переводить в байты.
Далее получаем этот блок по ID:
<Valute ID="R01200">
<NumCode>344</NumCode>
<CharCode>HKD</CharCode>
<Nominal>1</Nominal>
<Name>Гонконгский доллар</Name>
<Value>10,1304</Value>
</Valute>
и из него - значение поля Value.
Вот и всё, получаем в виде текста и можно выводить на консоль!
Вторая задача:
Написать программу, которая на основании запроса к https://openweathermap.org выведет среднюю и максимальную температуру(
morn) в вашем городе за предстоящие 5 дней(включая сегодняшний) в градусах Цельсия.
Вы мне так и не ответили, можно ли использовать API, поэтому я сделал с его использованием (так гораздо проще).
Регистрируетесь на сайте, получаете свой api ключ. Я использовал One Call API, можете почитать документацию
Быстро объясню, как пользоваться:
- Оправляем запрос API:
https://api.openweathermap.org/data/2.5/onecall?lat={latitude}&lon={longitude}&exclude=minutely,hourly,alerts&appid={API_KEY}&units=metric
latitude- широта,longitude- долготаAPI key- ваш api ключ.exclude- данные, которые нужно исключить из запроса. (подробнее в документации)
(в представленном выше запросе мы получаем погоду в Москве на сегодняшний, и ещё 7 дней вперёд, в метрической системе. Исключаем минутный и часовой прогнозы, и предупреждения спецслужб.)
Парсим полученный
JSON(получаем из него температуру для текущего и четырёх последующих дней).Считаем и выводим результат
import requests
import json
API_KEY = "You API key"
longitude = 37.6156 # долгота
latitude = 55.7522 # широта
temperature_arr = []
api_response = requests.get(f"https://api.openweathermap.org/data/2.5/onecall?lat={latitude}&lon={longitude}&exclude=minutely,hourly,alerts&appid={API_KEY}&units=metric").text
json_response = json.loads(api_response)
for i in range(5):
temperature_arr.append(json_response["daily"][i]["temp"]["morn"])
print("Средняя температура за пять дней равна", sum(temperature_arr) / 5,
"\nМаксимальная температура за пять дней равна", max(temperature_arr))
В качестве места для получения данных о погоде я выбрал Москву.
С помощью модуля JSON парсим ответ (температура за утро (вы сказали брать из поля morn) находится по пути daily/day_index/temp/morn).
Также в этом JSON есть погода на текущий день (current), но гораздо удобнее использовать по индексам (в данном случае).
В конце просто считаем среднее арифметическое и максимум, выводим на консоль.
Вот и всё!
Надеюсь, вам поможет и вы разберётесь, а не просто скопипасите :)
Еще вот так сделал первую задачу - немного попроще.
import requests
r = requests.get('http://www.cbr.ru/scripts/XML_daily.asp').text.split("</Valute>")
NAME = 'Гонконгский доллар'
for n in r:
if n.count(NAME):
nominal = (int(n[n.find('<Nominal>') + len('<Nominal>'):n.find('</Nominal>')]))
value = (float(n[n.find('<Value>') + len('<Value>'):n.find('</Value>')].replace(',', '.')))
print(f"{nominal} {NAME} равен {value} рублей")
Я вот так решила с помощью модуля urllib.request
import urllib.request
from xml.dom import minidom
source = urllib.request.urlopen("http://www.cbr.ru/scripts/XML_daily.asp ")
xmldoc = minidom.parse(source)
list_ids = ['R01200']
valutes = xmldoc.getElementsByTagName("Valute")
for valute in valutes:
id = valute.getAttribute("ID")
value = valute.getElementsByTagName("Value")[0]
char_code = valute.getElementsByTagName("CharCode")[0]
if id in list_ids:
print(f"char code:{char_code.firstChild.data}, money exchange:{value.firstChild.data} ")
quit()