ДЗ №12
Дедлайн: 21:00 понедельник 22.12.2014.
Требования к оформлению, новое выделено курсивом (и, как обычно, сказываются на оценке только в диапазоне 7~10 баллов):
- Файл с программой должен называться именно так, как указано в задании
- Во всех программах должны быть содержательные имена переменных
- Во всех программах не должно быть строк длиннее 75 символов, а если такие строки возникли, части таких строк нужно выносить в отдельные переменные или функции.
- Функции должны сопровождаться docstring
Если функция обрабатывает данные, к ней должен прилагаться пример doctest.
- Тело любой функции должно иметь длину не более 10 строк
- Программа не должна содержать (в разумных пределах) дублирования кода
- Вне функций должно быть не больше 10 строк кода, кроме объявления констант.
В пределах программы порядок строк кода должен быть такой: импорты, константы, объявления функций и классов, блок кода в if __name__ == "__main__"
Краткое содержание занятия:
- пример про urllib+json + как подсмотреть, как браузер делает запросы
Создайте в репозитории папку hw12
(10 баллов) Создайте в папке hw12 программу search_suggestions.py, которая спрашивает с помощью input() у пользователя поисковый запрос и выводит на экран (по одному на строку) поисковые подсказки, которые выдаёт какая-нибудь поисковая система в ответ на такой запрос (всплывающие подсказки в поисковой строке).
Выберите поисковую систему, кроме duckduckgo (для которой пример разбирался в классе). Это не обязательно должна быть поисковая система. Годятся яндугль-карты, яндугль-словари, маркет, и вообще любая штука, которая высвечивает такие подсказки. Впишите в табличку, какую поисковую систему вы выбрали. Будет интереснее, если все выберут разные поисковые формы.
- Зайдите на заглавную страницу поисковой системы. Наберите в поиске часть запроса. Откройте дебаггер (обычно F12), переключитесь в режим networking (включите его, если он выключен), очистите окно дебаггера (обычно это кнопочка с перечёркнутым нулём)
- Наберите одну букву в поисковой строке. При этом в дебаггере должен появиться ровно один запрос.
- Скопируйте из запроса: адрес (в хроме это вкладка headers) и ответ (в хроме это вкладка response)
Воспользовавшись urllib.parse.unquote выясните, где в адресе запроса находится начало поискового запроса.
Скорее всего, ответ будет либо в формате json или в формате вызов функции с одним или несколькими аргументами в формате json. С помощью слайсов, регулярных выражений и прочих примитивных операций приведите содержимое ответа к такому виду, чтобы json.loads смог распарсить его. (Подсказва: если ответ пришёл в виде функции с несколькими аргументами, то проще всего преобразовать его в список аргументов функции).
- Найдите, где в получившихся данных находится нужный ответ.
- Напишите функцию-парсер для результата, которая преобразует его из строкового вида в конечный ответ: список поисковых подсказок.
- Проверьте работоспособность этой функции, и, если она работает нормально, сделайте из этого для неё пример в docstring.
Напишите функцию, которая с помощью urllib.parse.quote и str.format создаёт запрос, подобный тому, который вы делали, и с помощью urllib.request.urlopen получает его результат.
- Напишите головную функцию программы, которая будет получать от пользователя входную строку, вызывать по очереди эти две функции, и печатать построчно результат.
Напишите блок if __name__ == "__main__", в котором вызовите docttest.testmod() и головную функцию.