An open API service indexing awesome lists of open source software.

https://github.com/darinochka/parser_courses_ru

Parser courses from coursera, openedu, stepik.
https://github.com/darinochka/parser_courses_ru

coursera openedu parser stepik

Last synced: 8 months ago
JSON representation

Parser courses from coursera, openedu, stepik.

Awesome Lists containing this project

README

          

# UPD: добавлен фильтр по популярности
Критерии:
- *coursera* оценка >= 3.5
- *stepik* количество обучающихся > 1000
- *openedu* фильтр отсутствует, потому что сайт не имеет данных об оценке и количестве учащихся

# Парсинг данных
## Конфиг
Конфиг config.toml находится в папке проекта и имеет
```saving_path``` - путь для сохранения информации о курсах (.json)
```languages``` - языки, которые возможны в названиях курсов, для того чтобы определить конкретный язык.
```cabinet_api_token``` - токен личного кабинета для того чтобы достать проекты каждого студента
## Данные data
### %platform_name%_courses.json
Информация о курсах собирается в .json с разных платформ в следующем формате:
```json
{
"count_pages": 0,
"courses": [
{
"title": str,
"url": str,
"author": str,
"score": int,
"number of students": str
}
]
}
```
Где ```count_pages``` количество страниц, которое было обработано на текущем образовательном портале (```count_pages``` в некоторых файлах может быть заменен на ```count_courses```, что буквально означает количество обработанных курсов), а ```courses``` содержит обработанные курсы с названием, ссылкой и автором.
**Примечание**
- данные курсов с Coursera содержат полную информацию о курсах (на 24.03.22 score заменен на assesment, но в модулях это уже изменено, необходимо просто заново спарсить)
- данные курсов с OpenEdu содержат только title, author, url
- данные курсов с Stepik содержат title, url, assesment, number_of_students

### classroom.csv, projects.csv, students_data.csv
- ```classroom.csv``` - классрум-курсы студентов
- ```projects.csv``` - проекты студентов
- ```students_data.csv``` - все вместе
- ```stud_data_tokenize``` - токенизированные названия проектов и курсов студентов

### abbrev.csv
Файл с аббревиатурами в виде:
abbrev,original
Используется в файле ```preprocessing.py``` в функции **replace_abbr**, чтобы заменять аббревиатуры в названиях курсов. Например, "ИВТ" -> "Информатика и вычислительная техника". Нужно для улучшения обучения модели.

## students
```parser_students.py``` - достает с classroom-курсы и проекты студентов с баз данных. Подробнее можно прочитать о функциях в самом файле.
```preprocessing.py``` - обрабатывает данные студентов. Чистит, удаляет лишнее, добавляет столбики с токенизированными названиями. Создает новый файл **stud_data_tokenize.csv** в data.

## coursera, openedu, stepik
Во всех директориях присутствует файл "parser_main.py", который выполняет следующее:
### parser_main
Проверяет наличие файла, куда будут записываться курсы и пуст ли он. Исходя из проверки вызываются необходимые функции.
## Coursera
### parser_pages
Данный код предназначен для сбора названий курсов, ссылок на них и авторов курса со страницы https://www.coursera.org/directory/courses. Сперва проверяется существование файла
coursera_courses.json в директории ```config['saving_path']```. Далее если такой файл существует и он не пустой, проверяется переменная ```count[courses|pages]```. Следущим этапом вызывается функция ```parser_new_courses```. Функция выполняет 2 задачи: если на последней странице добавились новые курсы, то записывает их в файл. Если увеличилось число страниц с курсами, то парсит их. Если файл пустой, то заново парсит все страницы.
#### Случай когда на странице каталога появились новые курсы.
В данном случае нам нужно парсить только определенную страницу, а именно последнюю. Из файла "coursera_courses.json" берем ```count_pages```, которая была последней, когда мы парсили последний раз. После чего берем из этого же файла название последнего курса и переходим на последнюю страницу. Сверяем название последнего курса с теми, которые есть на странице и когда находим такое же название, берем все курсы после найденого и записываем их в файл, это и есть новые добавленные недавно курсы.
#### Случай когда появились новые страницы
В данном случае, надо найти последнюю страницу в каталоге и спарсить данные начиная с конца старой страницы, которая записана в файле "coursera_courses.json" (```count_pages```) и до новой найденной страницы. Данные так же записываются в файл , а новая(полследняя) страница записывается вместо старой в переменную ```count_pages```.
### parser_coursera
Этот файл содержит основные функции для парсинга:
- ```get_count_pages``` возвращает число страниц в текущий момент времени
- ```get_soup_courses``` возвращает soup курсов на определенной странице
- ```write_courses``` записывает курсы из soup в файл
## Stepik
С API-страниц https://stepik.org/api/courses? берем названия всех курсов, сслыки на них, а также язык (не все языки указаны там корректно) для отбора только русскоязычных курсов. В разделе meta каждой страницы есть bool-параметр has_next, проход по страницам осуществляется циклом while по этой переменной. В цикле запоминается номер текущей страницы каталога (для наглядности, записываем последнюю страницу ```last_page``` в json файл stepik_courses). Если появились новые курсы, то происходит повторный (регулярный) "до-парсинг" начинается с последней спаршенной страницы (достается из stepik_courses ```last_page```): производится проверка на появление новых курсов непосредственно на этой странице: поиск последнего курса из файла на странице и дозапись все оставшихся (разумеетсяя, с проверкой на язык, так что, если добавились только, к примеру, курсы на Испанском, эта часть программы отработает "вхолостую"), затем проверяется наличие следующих страниц (проверка has_next) и, если добавились новые страницы — сбор данных с них.
### parser_stepik
Этот файл содержит основные функции для парсинга:
- ```get_last_page``` - возвращает последнюю страницу в файле
- ```upd_last_page``` - обновляет последнюю страницу с курсами (если на этой странице появились новые курсы)
- ```pars_new_pages``` - парсит новые страницы начиная с той, которая дана в функции
- ```first_pars``` - парсит все страницы с самого начала и записывает в файл
## Openedu
Весь каталог курсов расположен на одной странице https://openedu.ru/course/. Для того чтобы забрать все необходимые нам данные: получаем код страницы, находим необходимые нам строки с названиями, ссылками и авторами, и с помощью встроенных функций работы со строками записываем все данные в файл "openedu_courses.json", а так же количество курсов записываем в файл как "count_courses" . В случае, если появились новые курсы, то получаем код страницы, находим число курсов на странице, сравниваем с прошлым числом курсов из файла "count_courses_openedu.txt", если новове число больше то запускаем работу программы, так как операции получения кода страницы и операции со строками незатратны, если же новое число такое же как старое, то не запускаем программу, так как все курсы у нас уже есть.
Сайт специализируется на курсах с русским языком, так что проверка на язык не предусмотрена.
### pars_openedu
Этот файл содержит основные функции для парсинга:
- ```parser_courses``` - парсит страницы и возвращает dict курсов