В этом выпуске мы поговорим о библиотеке request, работой с API и запустим локальный сервер
В прошлый раз мы, чтобы получить данные из кода, копировали HTML-элемент вручную в среду разработки. Сегодня мы попробуем сделать это с помощью модуля request. Он не встроенный, его нужно установить отдельно, как и BeautifulSoup
[code]import requests
zapros = requests.get(«https://digital2.ru»)
code = zapros.text
print(zapros)
print(code)
Результат:
Работа с API
Application Programming Interface (API) — интерфейс, созданный специально для того, чтобы машине (компьютеру) было проще считать нужную информацию с сайта. Т.е. можно спарсить код, где вставляется погода с помощью регулярных выражений или BeautifulSoup. но лучше (и правильней) сделать это с помощью API
С помощью API удобно получать именно данные, а не какой-либо участок кода с ними. В API меньше кода — всё собрано в одном месте. Нет нужды парсить это регулярными выражениями. И API всегда будет работать, даже если источник поменял на сайте HTML-код.
Сейчас мы отправим запрос на вызов API сайта https://openweathermap.org/ и получим результат в виде JSON (текстовый формат обмена данными, основанный на JavaScript). Не забывайте импортировать модуль json при этом
[code]import requests
import json
link = «http://samples.openweathermap.org/data/2.5/weather?q=London,uk&appid=b6907d289e10d714a6e88b30761fae22»
response = requests.get(link) # отправляем запрос на получение кода страницы
text = response.text # в переменной текст у нас код страницы (обычный текст)
# получаем код в виде объекта (словаря)
data = json.loads(text)
# чтобы получить значение погоды необходимо использовать подсловарь main
print (data [«main»] [«temp»])
[/code]
Результат (здесь температура указана в кельвинах)
Как запустить свой сервер?
Поднять свой локальный сервер можно с помощью библиотеки flask. Её тоже нужно отдельно устанавливать — она не встроенная.
[code]
from flask import Flask
application = Flask (__name__) # здесь мы задаем имя нашего файла
@application.route («/») # указываем путь, где будут создаваться страницы. В качестве аргумента у нас /
# создаем функцию, которая генерирует нам страницу
def index ():
return «Санек, проставляйся»
# Запускаем сайт только тогда, когда запускаем этот файл
if __name__ == «__main__»:
application.run ()
Результат — сервер запущен:
Аргументы в web-запросах
Веб-запрос может содержать в себе один или несколько аргументов. С помощью Python мы можем анализировать и работать с этими данными. Например, узнать, как «проставится» друг на свой день рождения
Создаем простую html-страницу с формой запроса:
[code]<!DOCTYPE html>
<html lang=»en»>
<head>
<meta charset=»UTF-8″>
<title>Чекаем бухлишко</title>
</head>
<body>
<form>
<input type = «text» name = «whisky» placeholder=»Че бухаем, поцоны»>
<button>Чекаем</button>
</form>
</body>
</html>
Важное замечание: при использовании библиотеки flask, html-файлы нужно создавать в подкаталоге templates, иначе будет ошибка jinja2.exceptions.TemplateNotFound: home.html
Далее запустим сервер и откроем index.html. Попытаемся что-либо ввести. Мы увидим, что сайт передает наш ответ в аргументе Key
Если мы вводим неправильный ответ, то увидим:
Если мы угадали, то
Как выглядит проверка, средствами скрипта на питон. Давайте напишем его:
[code]import requests
link = «http://127.0.0.1:5000/answer?key=» # копируем ссылку с аргументом.
answers = [‘Vodka’, ‘Beer’, ‘Lawsons’] # создадим список потенциальных ответов
for n in answers: # перебираем все варианты из списка
checklink = link + str(n) #добавляем элемент к нашему линку, чтобы было answer?key=n
response = requests.get(checklink).text #получаем текст этой страницы, записываем ей в переменную response
if response == «Не Не, не будем это пить»:
print(«Не, это не оно»)
else:
print(«Угадал»)
Результат:
Свой Aviasales
Aviasales — один из лучших агрегаторов авиабилетов, сделанный нашими соотечественниками. Помимо прекрасного сервиса, aviasales предоставляет доступ к своим API, а это значит мы можем сделать свой сервис по поиску цен на различные направления
Конкретно нас интересует API календаря цен. Прочитать про него можно здесь. В документации мы получим пример запроса API и применим его на практике. Запрос без аргументов выглядит так: http://min-prices.aviasales.ru/calendar_preload
[code]data = json.loads(requests.get(link).text)
# Выводим на экран только элементы массива
prices = (data [«best_prices»]) # все значения лучшей цены.
bestofthebest = sorted(prices, key=lambda k: k[‘value’]) # сортировка по самому дешевому билету
datasorted = [bestofthebest[0]] # самый дешевый — первый элемент массива
returndate = min(datasorted, key=itemgetter(‘return_date’))[‘return_date’]
print(prices) #все лучше цены
print(bestofthebest) # самый дешевый
print(returndate) # когда возвращаемся, если берем самый дешевый билет
Результат:
Как мы видим, в результате мы получаем данные формата json с лучшей ценой на конкретные направления (в нашем случае это — Москва-Сыктывкар)
