webprogr.ru Новости

RSS

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...

{{toodo.preview}}

...
{{toodo.name}}

{{toodo.preview}}

далее..

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

смотреть..

toodo.name

{{toodo.preview}}

{{toodo.name}}

{{toodo.preview}}

перейти...


Последние новости

Лабораторная работа I для дисциплины Технологии работы с открытыми данными

 Лабораторные работы  (подготовка материалов исходных) «Технологии работы с открытыми данными»
Методическая основа и принципы построения лабораторных

 Общая организация работы
Для всех четырех лабораторных рекомендуется единая структура каталога:
lab_X/
├── README.md
├── lab_X.ipynb
├── src/
│ └── ...
├── data/
│ ├── raw/
│ └── processed/
├── results/
│ └── ...
└── requirements.txt
Основная работа выполняется на Python. Для отдельных заданий дополнительно используются curl, SQL и, в одной лабораторной, любой доступный BI-инструмент.

Рекомендуемый программный стек:
Python 3.x
Jupyter Notebook / JupyterLab
requests
pandas
selenium
beautifulsoup4
lxml
scrapy
matplotlib
wikipedia-api
pywikibot
fastapi
uvicorn

SQLite используется через стандартный модуль Python sqlite3, поэтому отдельный сервер базы данных студентам не требуется. Модуль csv стандартной библиотеки поддерживает чтение и запись табличных CSV-данных, а json и xml.etree.ElementTree позволяют работать соответственно с JSON и XML.
  
 
 
 Лабораторная работа 1 «Форматы данных, REST API и динамические веб-страницы»


Соответствие программе: тема «Основные форматы данных. REST API. Запросы на динамический сайт»: CSV, XML, JSON, эмуляция браузера, обращение к REST API своего бэкэнда, Requests, Selenium. 

Цель работы
Научиться получать и преобразовывать данные в форматах CSV, JSON и XML, взаимодействовать с REST API средствами Python, выполнять основные HTTP-операции и извлекать данные с динамической веб-страницы средствами Selenium.
После выполнения студент должен уметь объяснить различие между форматом данных, HTTP-запросом, REST API и DOM динамической страницы, а также показать, что один и тот же набор данных может быть получен несколькими способами.
Подготовка к лабораторной работе и сбор данных
Студент собирает файлы со следующей структурой:
lab_1_start/
├── data/
│ ├── items.csv
│ ├── items.json
│ └── items.xml
└── backend/
└── ...
Во всех трех файлах используются одинаковые логические поля:
Поле Смысл Требуемый тип
id идентификатор объекта integer
name наименование string
category категория string
value числовой показатель float
updated_at дата обновления datetime
active признак активности boolean

Рекомендуется специально включить в данные несколько учебных проблем: пустые значения, повторяющиеся id, различное написание категории, число в строковом представлении и разные варианты даты.

 Локальный учебный backend должен реализовать следующий контракт:
GET /api/items
GET /api/items/{id}
POST /api/items
PUT /api/items/{id}
PATCH /api/items/{id}
DELETE /api/items/{id}
GET /dynamic

Страница /dynamic должна получать данные JavaScript-запросом после загрузки страницы и, например, иметь кнопку «Загрузить данные» или фильтр категории. Это позволит явно показать студенту ситуацию, в которой HTML, полученный обычным requests.get(), еще не содержит итоговую таблицу.

   Задание студенту
Ваша задача - сгенерировать и разработать программу, которая получает один набор объектов из трех файлов, REST API и динамической веб-страницы, приводит результаты к единой структуре и проверяет их согласованность.
Выполните последовательно следующие действия.


Этап A. Работа с форматами данных.
Прочитайте items.csv, items.json и items.xml. CSV необходимо прочитать как минимум одним способом через pandas, JSON — с разбором структуры Python, XML — через xml.etree.ElementTree.
Для каждого источника выведите:
количество записей;
список столбцов;
типы данных;
количество пропущенных значений;
количество повторяющихся id.
Напишите функцию:
def normalize_items(df):
...
которая приводит набор к единой схеме: преобразует id, value, updated_at, active, нормализует текстовые категории и удаляет полные дубликаты.
Объедините три файла в один DataFrame.
Проверьте уникальность id. Если одинаковый идентификатор встречается в нескольких источниках, явно опишите выбранное правило разрешения конфликта.
Сохраните нормализованный результат как:
data/processed/items_normalized.csv
data/processed/items_normalized.json
data/processed/items_normalized.xml
Python-документация отдельно обращает внимание на то, что CSV из разных систем может отличаться разделителями и правилами кавычек, поэтому при работе следует не считать любой CSV полностью однозначным форматом. 


  Этап B. REST API через Requests.
Запустите предоставленный локальный backend и средствами Python выполните:
GET
POST
PUT
PATCH
DELETE
Студент не должен просто показать пять вызовов. Для каждого запроса необходимо вывести и сохранить:
HTTP-метод
URL
параметры запроса или тело
status_code
Content-Type
время выполнения
ответ сервера
Requests предоставляет прямые методы для GET, POST, PUT и DELETE, умеет передавать query-параметры через params, JSON-тело через json, пользовательские заголовки через headers; успешность HTTP-ответа следует проверять отдельно от возможности распарсить JSON. 
Обязательное требование к коду:
response = requests.get(
url,
params=params,
timeout=10
)
response.raise_for_status()
То есть каждый сетевой запрос должен иметь timeout, а ошибки HTTP не должны молча игнорироваться. Документация Requests прямо рекомендует задавать timeout для практически всего production-кода и указывает, что без него ожидание ответа по умолчанию не ограничено. 
Студент должен создать:
одну новую запись методом POST;
полностью изменить ее методом PUT;
изменить только одно поле методом PATCH;
получить измененную запись методом GET;
удалить ее методом DELETE;
убедиться повторным GET, что ресурс удален.


  Этап C. Обработка ошибок.
Реализуйте обработку как минимум трех ситуаций:
несуществующий id;
ошибка соединения;
превышение timeout.

Программа не должна завершаться необработанным traceback. Ошибка должна попасть в лог вместе с URL и ее типом. Requests предоставляет единое семейство исключений RequestException, включая ConnectionError, Timeout и HTTP-ошибки. 


Этап D. Selenium и динамическая страница.
Откройте /dynamic с помощью Selenium WebDriver.
Необходимо:
запустить браузер из Python;
перейти на динамическую страницу;
дождаться появления элемента управления;
нажать кнопку загрузки;
дождаться появления строк таблицы;
применить фильтр по категории;
собрать данные из отображаемой таблицы;
преобразовать их в DataFrame;
сохранить selenium_items.csv.

Для ожидания необходимо использовать WebDriverWait/явное ожидание, а не набор произвольных time.sleep(5). Selenium описывает explicit wait как ожидание конкретного условия и отдельно предупреждает, что смешивание implicit и explicit waits способно приводить к непредсказуемым временам ожидания.
Selenium здесь нужен именно потому, что WebDriver управляет реальным браузером и может взаимодействовать с DOM уже после исполнения JavaScript. 


Этап E. Сравнение способов получения данных.
Сформируйте таблицу:
Способ Количество записей Уникальных id Время Есть ошибки
CSV/XML/JSON        
REST API        
Selenium        

Ответьте в отчете: почему для получения структурированных данных предпочтительнее использовать официальный API, если он существует, вместо браузерной автоматизации?

Что студент должен сдать
lab_1.ipynb
src/formats.py
src/api_client.py
src/selenium_client.py
data/processed/items_normalized.csv
data/processed/items_normalized.json
data/processed/items_normalized.xml
results/api_log.csv
results/selenium_items.csv
README.md
В README.md должны быть команды установки зависимостей и запуска программы.

Критерии приемки
Работа не принимается как полностью выполненная, если студент только прочитал файлы или только сделал GET-запрос.
Для максимальной оценки должны одновременно работать четыре компонента:
форматы → нормализация → полный REST CRUD → Selenium → сравнение результатов.
На защите студент должен уметь без запуска Google объяснить различия PUT и PATCH, назначение status_code, Content-Type, timeout, raise_for_status(), отличие JSON от Python dict и причины, по которым requests.get(page).text может отличаться от данных, отображаемых браузером.

 

Рейтинг@Mail.ru