Определение наличия (и степени) зависимости академической успеваемости студентов от количества времени, проведенного ими в соцсети 'ВКонтакте'

  • Вид работы:
    Дипломная (ВКР)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    779,91 Кб
  • Опубликовано:
    2017-06-30
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Определение наличия (и степени) зависимости академической успеваемости студентов от количества времени, проведенного ими в соцсети 'ВКонтакте'

Оглавление

Введение

Глава 1. Теоретические предпосылки исследования

.1 Обзор существующих публикаций

.2 Теоретические основы исследования

.2.1 Линейная регрессия

.2.2 Logit-регрессия

.2.3 Коэффициент ранговой корреляции Спирмена

Выводы по первой главе

Глава 2. Инструментальные средства и технологии

.1 Обоснование выбора программного обеспечения

.2 Технические и функциональные требования

.2.1 Технические требования

.2.2 Функциональные требования

.3 Исходные данные

Выводы по второй главе

Глава 3. Реализация

.1 Приложения для получения информации с сайта «ВКонтакте»

.1.1 Описание функционала и интерфейса приложения

.1.2 Описание классов и используемых библиотек

.2 Приложение для получения расписания с сайта ВШЭ

.2.1 Описание функционала и интерфейса приложения

.2.2 Описание используемых библиотек

.3 Подготовка и первичный анализ данных

.4 Статистический анализ данных

.4.1 Тестирование коэффициента ранговой корреляции Спирмена

.4.2 Тестирование logit-регрессии

.4.3 Тестирование линейной регрессии

Выводы по третьей главе

Заключение

Список использованной литературы

Приложения

Введение


В современном мире социальные сети стали достаточно сильно интегрированы в повседневную жизнь человека. Сотни миллионов человек пользуются различными соответствующими сайтами или приложениями каждый день и время, в течение которого человек так или иначе взаимодействует с соцсетями, увеличивается каждый год. На конец 2016 года более чем 1,2 миллиарда людей ежедневного посещают свои страницы на сайте «Facebook». Что же касается отечественных аналогов, то социальная сеть «ВКонтакте» с каждым годом увеличивает число активных аккаунтов и на данный момент насчитывает более 380 миллионов зарегистрированных пользователей, 25% из которых заходят на сайт ежедневно. Особенно примечательно, что около 150 миллионов пользователей «ВКонтакте» еще не достингли возраста 25-ти лет, а значит, являются учащимися школ или высших учебных заведений. Очевидно, что желание молодежи «всегда быть online» может плачевно сказываться на их основной деятельности - обучении в школе или ВУЗе. Таким образом, все вышесказанное обосновывает актуальность выбранной темы исследования.

Объектом исследования данной работы является множество студентов, обучающихся в бакалавриате Высшей Школы Экономики, а предметом исследования - зависимость академической успеваемости студентов бакалавриата ВШЭ от количества времени, которое они проводят в социальной сети «ВКонтакте».

Цель работы - определить наличие (и степень) зависимости академической успеваемости студентов от количества времени, проведенного ими в соцсети «ВКонтакте». Исходя из данной цели, были определены следующие задачи:

Ø  Определить список студентов, которые будут входить в выборку данного исследования.

Ø  Разработать программное обеспечение для автоматизации сбора данных о статусе присутствия выбранных студентов в соцсети «ВКонтакте» с интервалом времени 5 минут.

Ø  Структурировать полученную информацию, исключить выбросы, сопоставить данные об «онлайн» присутствии с данными учебного расписания студента и рейтинга ВШЭ.

Ø  Проанализировать собранные данные, построить логистическую и линейную регрессии.

Для выполнения данного курсового проекта необходимо использовать следующие программные средства:

Ø  MS Visual Studio 2017 для написания кода и тестирования работоспособности программы по сбору данных об «онлайн» активности выбранной группы пользователей.

Ø  PyCharm 2016.3.2 для написания кода и тестирования скрипта для автоматического скачивания расписания и рейтингов с сайта Высшей Школы Экономики

Ø  Microsoft Excel для сопоставления данных, собранных из разных источников, нахождения и исключения выбросов и пропущенных значений и для первоначального анализа данных.

Ø  IBM SPSS Statistics для полноценного анализа данных, построения качественной модели и различных регрессий.

Структура работы имеет следующий вид. В первой главе рассмотрены теоретические предпосылки исследования, проведена краткая информация о ходе и результатах исследований на данную или схожие тематики, описаны существующие методы построения качественных моделей и регрессий. Во второй главе обоснован выбор программного обеспечения, используемого в процессе исследования, выдвинуты технические требования, объяснен формат исходных данных и сами данные. В третьей главе описана программная реализация: логика выполнения первичного анализа данных и построения модели и регрессий. Кроме того, в данной главе приведен контрольный пример и описан интерфейс разработанных приложений.

Глава 1. Теоретические предпосылки исследования

 

1.1 Обзор существующих публикаций


С момента появления социальных сетей исследователи из разных стран пытались определить их влияние на жизнь людей. Особенно часто задавились вопросом о том, как соцсети влияют на подрастающее поколение, то есть на тех, кто больше всего пользуется подобными вебсайтами.

Что касается темы зависимости академической успеваемости от активности использования социальных сетей, то такими вопросами исследователи начали задаваться в начале второго десятилетия двадцать первого века. Например, в исследовании Шварца, Линдси, Хендерсона и Филипса ученые приходят к выводу, что использование социальных сетей может приносить студенту как пользу, так и вред. По их мнению, воздействие, которое соцсети могут оказать на студента полностью зависит от черт его характера. Однако исследователи не отрицают и очевидного положительного влияния соцсетей, например, инициирования учебной активности путем создания единого места общения между студентами и возможностью быстрого доступ к любой информации [1].

Похожей позиции придерживается в своем исследовании и японский социолог Оскоё (Oskouei), которая заявляет, что всемирное распространение социальных сетей и интернета в целом может стать большим преимуществом как для студентов, так и для преподавателей, но только при условии «грамотного» использования и, что использование соцсетей в развлекательных целях не мешает учебным нуждам.

В 2011 году Джейсон Тхэм провел исследование на тему использования социальных сетей студентами колледжа. Тхэм разработал анкету и провел опрос 445-ти специально отобранных учащихся. Опрос был направлен на выявление отношения студентов к социальном сетям и на выявление осознания студентами влияния, которое оказывают на их учебную деятельность подобные сайты и приложения. Результаты исследования показали, что между местом студента в рейтинге (по сути, его академической успеваемостью) и использованием им социальных сетей есть довольно сильная корреляция. Однако какой была эта корреляция - положительной или отрицательной, Тхэм не уточняет [2].

Кроме того, не так давно несколько исследований на схожие темы было проведено в Малайзии. Так, в 2013 году Абдулсалам Алхазми провел исследование с целью определить социальные аспекты использования социальной сети «Facebook» и то, как это может повлиять на успеваемость студентов. Алхазми попросил 105 малазийских и зарубежных учащихся Технологического Университета Малайзии заполнить подробную анкету, которая не ограничивалась только лишь вопросами, касающимися социальных сетей. Когда ответы студентов были получены и тщательно проанализированы, оказалось, что между частотой использования социальных сетей и оценками студентов значительной зависимости нет, но Алхазми смог найти корреляцию между успеваемостью студентов и их прошлым учебным опытом [3].

В 2014 году исследование Алхазми нашло свое продолжение в работе Адама Махамата Хелу. В качестве источника данных Хелу также использовал опросник, анализ результатов которого показал, что большинство студентов считают, что в целом использование социальных сетей имеет положительное влияние на их успехи в обучении, хотя конкретных примеров такого влияния никто из опрошенных привести не смог [4].

Еще одну работу в Малайзии на схожую тему подготовил Марк Салвейшн. Он использовал концептуально новый подход для сбора данных, анализ которых позволил ему утверждать, что студенты все чаще и чаще использует такие социальные как «Facebook» и «Twitter» для того, чтобы продолжать в них обсуждение учебных тем, начатое в классе. Это, несомненно, является примером позитивного влияния социальных сетей на академические успехи учащихся [5].

Подводя итог обзору публикаций на тему влияния социальных сетей на академическую успеваемость студентов высших учебных заведений, стоит отметить, что в большинстве работ, описанных выше, в качестве источника данных так или иначе использовалась анкета, заполняемая студентом самостоятельно. Поэтому, всецело доверять результатам подобных исследований не стоит, так как студенты могли специально или неосознанно исказить реальную ситуацию при заполнении опросников.

1.2 Теоретические основы исследования


В качестве основных методов для выявления наличия зависимости между академической успеваемостью студентов Высшей школы экономики и количеством времени, которое они проводят в социальной сети «ВКонтакте» были использованы:

Ø  Линейная регрессия;

Ø  Логистическая регрессия;

Ø  Ранговая корреляция.

1.2.1 Линейная регрессия

Регрессия (от латинского regressio - обратное движение, отход) в теории вероятностей и математической статистике - математическое выражение, отражающее зависимость одной переменной от других переменных  при условии, что это выражение будет иметь статистическую значимость. В отличие от чисто функциональной зависимости , когда каждому значению независимой переменной x соответствует одно определённое значение величины y, при регрессионной связи одному и тому же значению x могут соответствовать в зависимости от случая различные значения величины y. Впервые этот термин был использован Френсисом Гальтоном в 1886 году в связи с исследованием наследования физических характеристик человека. В качестве одной из характеристик был взят рост человека. При этом было обнаружено, что в целом сыновья высоких отцов оказались более высокими, чем сыновья отцов с низким ростом. Более интересным было то, что разброс в росте сыновей был меньшим, чем разброс в росте отцов. Так проявлялась тенденция возвращения роста сыновей к среднему (regression to mediocrity), то есть «регресс».

Математическое уравнение, которое оценивает линию простой (парной) линейной регрессии имеет вид:

 

где  - независимая переменная;  - зависимая переменная;  - свободный член;  - угловой коэффициент (градиент);

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

Наиболее простым методом определения коэффициентов  и  является метод наименьших квадратов (МНК). Подгонка оценивается, рассматривая остатки, то есть, вертикальное расстояние каждой точки от линии (рис. 1). Линия лучшей подгонки выбирается так, чтобы сумма квадратов остатков была минимальной.

Рис. 1. Демонстрация применения метода наименьших квадратов.

Для линейной регрессии существуют следующие предположения:

Ø  Между  и  существует линейное соотношение: для любых пар  и  данные должны аппроксимировать прямую линию. Если нанести на двумерный график остатки, то мы должны наблюдать случайное рассеяние точек, а не какую-либо систематическую картину.

Ø  Остатки нормально распределены с нулевым средним значением.

Ø  Остатки имеют одну и ту же постоянную дисперсию для всех предсказанных величин . Если нанести остатки против предсказанных величин  от , то должно наблюдаться случайное рассеяние точек. Если график рассеяния остатков увеличивается или уменьшается с увеличением , то это допущение не выполняется.

Если допущения линейности, нормальности и постоянной дисперсии сомнительны, мы можем преобразовать  или  и рассчитать новую линию регрессии, для которой эти допущения удовлетворяются (например, использовать логарифмическое преобразование).

Из-за линейного соотношения  и  ожидается, что  изменяется, по мере того как изменяется . Это называется вариацией, которая обусловлена или объясняется регрессией. Остаточная вариация должна быть как можно меньше. Если это так, то большая часть вариации  будет объясняться регрессией, а точки будут лежать близко к линии регрессии, т.е. линия хорошо соответствует данным. Долю общей дисперсии , которая объясняется регрессией называют коэффициентом детерминации, обычно выражают через процентное соотношение и обозначают . Именно этот коэффициент позволяет оценить качество уравнения регрессии.

1.2.2 Logit-регрессия

Линейная регрессионная модель не всегда способна качественно предсказывать значения зависимой переменной. При использовании линейного уравнения естественным образом не накладываем никаких ограничений на значения зависимой переменной, в то время как подобные ограничения могут существовать и быть крайне существенными. Например, при проектировании оптимальной длины шахты лифта в новом здании необходимо учесть, что эта длина не может превышать высоту здания, чего в случае использования линейной регрессии не происходит. Линейная регрессионная модель может дать результаты, несовместимые с реальностью. Чтобы решить такую проблему необходимо изменить вид уравнения регрессии и подстроить его для решения конкретной задачи.

Регрессионная logit-модель предназначена для решения задач предсказания значения непрерывной зависимой переменной, при условии, что эта зависимая переменная может принимать значения на интервале от 0 до 1. В силу такой специфики, ее часто используют для предсказания вероятности наступления некоторого события в зависимости от значений некоторого числа предикторов.

В logit-регрессионной модели предсказанные значения зависимой переменной не могут быть меньше или равными 0, или больше или равными 1, не зависимо от значений независимых переменных. При этом используется следующее уравнение регрессии:

 

Таким образом, независимо от регрессионных коэффициентов или величин х, предсказанные значения у в этой модели всегда будут лежать в диапазоне от 0 до 1.

При решении задачи линейной регрессии происходил «подгон» к наблюдаемым значениям некоторой гиперповерхности: прямой (в случае простой регрессии) или плоскости (в случае двух независимых переменных). Кроме того, было необходимо соблюдение условий нормальности и некоррелированности ошибок. При переходе же к уравнению logit-регрессии подгоняемая поверхность уже не имеет такой простой вид, а нормальность ошибок уже не является достаточным условием. Это делает невозможным использования методов оценивания, применяемых для линейных задач. Поэтому для решения задач logit-регрессии используется только метод максимального правдоподобия. То есть, процесс оценки регрессионных коэффициентов сводится к максимизации вероятности появления конкретной выборки (при заданных наблюдаемых значениях), что может часто приводить к невысокому проценту корректной классификации.

1.2.3 Коэффициент ранговой корреляции Спирмена

Данный критерий был разработан и предложен для проведения корреляционного анализа в 1904 году Чарльзом Эдвардом Спирменом, английским психологом, профессором Лондонского и Честерфилдского университетов. Коэффициент ранговой корреляции Спирмена - это непараметрический метод, который используется с целью статистического изучения связи между явлениями. В этом случае определяется фактическая степень параллелизма между двумя количественными рядами изучаемых признаков и дается оценка тесноты установленной связи с помощью количественно выраженного коэффициента.

Данный коэффициент используется для выявления и оценки тесноты связи между двумя рядами сопоставляемых количественных показателей. В том случае, если ранги показателей, упорядоченных по степени возрастания или убывания, в большинстве случаев совпадают (большему значению одного показателя соответствует большее значение другого показателя), то делается вывод о наличии прямой корреляционной связи. Если ранги показателей имеют противоположную направленность (большему значению одного показателя соответствует меньшее значение другого), то говорят об обратной связи между показателями.

В связи с тем, что коэффициент является методом непараметрического анализа, проверка на нормальность распределения не требуется. Сопоставляемые показатели могут быть измерены как в непрерывной шкале (например, число эритроцитов в 1 мкл крови), так и в порядковой (например, баллы экспертной оценки от 1 до 5). Однако эффективность и качество оценки методом Спирмена снижается, если разница между различными значениями какой-либо из измеряемых величин достаточно велика, поэтому не стоит использовать данный коэффициент, если имеет место неравномерное распределение значений измеряемой величины.

Коэффициент корреляции Спирмена обладает следующими свойствами:

Ø  Коэффициент корреляции может принимать значения от минус единицы до единицы, причем если коэффициент равен единице - имеет место строго прямая связь, а значении коэффициента «минус единица» - строго обратная связь.

Ø  Если коэффициент корреляции отрицательный, то имеет место обратная связь, если положительный, то - прямая связь.

Ø  Если коэффициент корреляции равен нулю, то связь между величинами практически отсутствует.

Ø  Чем ближе модуль коэффициента корреляции к единице, тем более сильной является связь между измеряемыми величинами.

Чтобы рассчитать коэффициент Спирмена необходимо использовать следующий алгоритм:

.        Сопоставить каждому из признаков их порядковый номер (ранг) по возрастанию или убыванию.

.        Определить разности рангов каждой пары сопоставляемых значений (d).

.        Возвести в квадрат каждую разность и суммировать полученные результаты.

.        Вычислить коэффициент корреляции рангов по формуле:

 

Считая значения коэффициента равные 0,3 и менее - показателями слабой тесноты связи; значения более 0,4, но менее 0,7 - показателями умеренной тесноты связи, а значения 0,7 и более - показателями высокой тесноты связи.

.        Определить статистическую значимость коэффициента при помощи t-критерия, рассчитанного по следующей формуле:

 

Если рассчитанное значение t-критерия меньше табличного при заданном числе степеней свободы, статистическая значимость наблюдаемой взаимосвязи - отсутствует. Если больше, то корреляционная связь считается статистически значимой.

 


Выводы по первой главе


В данной главе было дано определение линейной, и logit- регрессии, а также коэффициента ранговой корреляции Спирмена. Кроме того, были описаны исследования и работы других авторов по схожей тематике.

Глава 2. Инструментальные средства и технологии

 

2.1 Обоснование выбора программного обеспечения


В качестве языка программирования для создания приложения по определению «онлайн» статуса выбранных пользователей социальной сети «ВКонтакте» был выбран язык программирования C#. Этот выбор обоснован тем, что данный язык предоставляет множество полезных функций, таких как: поддержка полиморфизма, перегрузка операторов, свойства, обобщённые типы и методы. Перечисленные особенности языка позволили решить поставленную задачу наиболее оптимально. Интегрированной средой разработки (ИСР) данного приложения выступала программа MS Visual Studio. Это программное обеспечение позволяет разрабатывать графические приложения, поддерживает возможность рефакторинга кода, позволяет создавать схемы классов и поддерживает сторонние плагины. Все это, несомненно, ускорило и упростило разработку приложения.

Для автоматизации сбора информации о расписании и успеваемости студента был использован язык программирования Python и интегрированная среда разработки PyCharm. Для языка Python создано огромное количество дополнительных библиотек, которые направлены на оптимизацию процесса сбора данных со страниц различных веб-ресурсов, а программное обеспечение PyCharm дает возможность мгновенно находить и устанавливать необходимые библиотеки и дополнения. Эти факторы были решающими при выборе языка и ИСР для выполнения задачи сбора информации о студентах.

В качестве ПО для первичного анализа и работы с данными было выбрано приложение Microsoft Excel 2013. Выбор данной программы обоснован тем, что Microsoft Excel 2013 позволяет удобно представлять информацию в табличном виде, а также обладает множеством встроенных функций, с помощью которых возможно быстро и точно определить выбросы и пропущенные значения.

Для выполнения основной части работы, а именно, определения наличия и силы зависимости между академической успеваемостью студентов и времени, проведенном ими в социальной сети «ВКонтакте», было выбрано программное обеспечение IBM SPSS Statistics. Данное ПО обладает всем необходимым функционалом: позволяет анализировать большие объемы данных, строить различные модели и регрессии, а также значительно сокращает время на проверку гипотез с помощью автоматической итерации коэффициентов с заданным шагом.

 

2.2 Технические и функциональные требования

 

2.2.1 Технические требования

Поскольку первым шагом в исследовании является отбор пользователей социальной сети «ВКонтакте», подходящих под определенные параметры (например, пользователь должен являться текущим студентов ВШЭ), то приложение должно обладать функционалом по нахождению пользователей по заданным условиям. Кроме того, приложение должно собирать достаточно подробную информацию о каждом подходящем пользователе: имя, фамилию, пол, факультет и год выпуска. Также данной приложение должно иметь функционал по «опросу» всех подходящих пользователей, сведения о которых должны быть введены в программу посредством чтения из выбранного Excel-файла, на предмет их нахождения «онлайн» с настраиваемым интервалом времени между запросами и возможностью записи полученной информации в Excel- или текстовый файл.

Что касается приложения для сбора данных о расписании и успеваемости студентов, то такое приложение должно получать данные с достаточно большой скоростью (например, расписание одной группы одного факультета не более, чем за 5-7 секунд). Такое требование обусловлено огромным количеством академических групп, существующих в Высшей школе экономики на данный момент. Кроме того, разработанное приложение должно обходить возможную защиту сайта ВШЭ от автоматического сбора данных. Например, с помощью периодической замены IP-адресов или посредством имитации действий человека (паузы между поисками, имитирование нажатие на кнопки и т.д.)

2.2.2 Функциональные требования

Приложение, осуществляющее автоматическое получение информации с сайта социальной сети «ВКонтакте» должно предоставлять пользователю возможность выбирать различные условия поиска пользователей, такие как: страна и город проживания, высшее учебное заведение и год выпуска. В момент «опроса» выбранных пользователей об их «онлайн» статусе, приложение должно позволять пользователю выбрать файл со всеми уникальными идентификаторами пользователей, во избежание их ввода вручную. Кроме того, приложение должно отображать всю информацию о ходе процесса: количество уже скачанных данных, количество оставшихся данных, примерное время завершения работы программы и т.д.

Что касается второго приложения, то разработанная программа для проведения автоматического получения данных с сайта Высшей школы экономики должна позволять пользователю задавать первоначальный url-адрес страницы с сайта, на котором перечислены все факультеты. После получения этого адреса от пользователя программа должна работать автономно, на каждом шаге предоставляя информацию о прогрессе выполнения задачи.

2.3 Исходные данные


В качестве источника исходных данных был выбран сайт социальной сети «ВКонтакте» «VK.com» и сайт Высшей школы экономики «hse.ru».

С помощью приложения для автоматизированного сбора информации и API сайта «VK.com» были получены данные о 7107 студентах, удовлетворяющих критериям запроса. Эти данные характеризуются следующими полями:

Ø  ID пользователя

Ø  Имя пользователя

Ø  Фамилия пользователя

Ø  Пол пользователя

Ø  Название ВУЗа, в котором обучается пользователь

Ø  Название факультета, на котором обучается пользователь

Ø  Год выпуска пользователя из высшего учебного заведения

На втором этапе были собраны данные о пребывании 7107 студентов «онлайн» на сайте соцсети «ВКонтакте». Данные собирались на протяжении 16-ти рабочих дней с 9 часов утра до 18 часов вечера с интервалом в 5 минут. В результате к существующим данным добавилось еще 1728 столбцов (16 дней * 9 часов / 5 минут) в которых для каждого пользователя отмечался один из возможных четырех вариантов активности в конкретный пятиминутный промежуток времени:

Ø  «оффлайн»

Ø  «онлайн с компьютера»

Ø  «онлайн с мобильного браузера»

Ø  «онлайн с мобильного приложения».

На завершающем этапе сбора данных была получена информация с сайта Высшей школы экономики. Данные включали в себя следующие сведения обо всех учащихся ВШЭ:

Ø  Факультет

Ø  Группа

Ø  Кредитно-рейтинговая оценка

Ø  Нормировочный коэффициент

Ø  Максимально возможная кредитно-рейтинговая оценка (сумма всех кредитов * 10)

Ø  Нормированная кредитно-рейтинговая оценка

Ø  Данные о расписании на каждый день третьего модуля.

Выводы по второй главе


В данной главе были даны объяснения относительно выбранной среды разработки, языка программирования, выбранного формата ввода данных и выбора дополнительного ПО. Также были описаны функциональные и технические требования разработанных приложений и формат исходных данных.

Глава 3. Реализация

 

3.1 Приложения для получения информации с сайта «ВКонтакте»


Так как одним из основных источников данных для этой работы является информация о пребывании студентов «онлайн» в социальной сети «ВКонтакте», то в первую очередь было разработано приложение, автоматизирующее получение такой информации.

3.1.1 Описание функционала и интерфейса приложения

Основным функционалом разработанного приложения является возможность проверки «онлайн»-статуса пользователя на протяжении заданного времени и с заданным интервалом. Кроме того, приложение дает возможность находить нужных пользователей. Выборка подходящих пользователей формируется на основе таких параметров как «страна проживания», «город проживания», «ВУЗ» и «тип студентов» (все, когда-либо обучавшиеся в ВУЗе или только те, кто обучаются сейчас). Также необходимо учитывать, что приложение способно найти человека, только если в соответствующих полях на сайте «ВКонтакте» пользователь самостоятельно указал эти данные о себе. То есть, если пользователь предпочел скрыть необходимую информацию или вовсе не заполнять ее, то он не будет включен в автоматически собираемою выборку.

Чтобы начать работу с приложением, необходимо пройти аутентификацию на сайте «ВКонтакте». Этот шаг является обязательным, так как по правилам «ВКонтакте» реализация требуемого функционала невозможна без входа на сайт (Рис. 2).

Рис 2. Аутентификация на сайте «ВКонтакте» через разработанное приложение.

После входа пользователю предоставляется возможность взаимодействия с приложением. Одним из первых шагов является получение выборки пользователей, подходящих под заданные условия. Данное действие достаточно выполнить только в первый раз, а в дальнейшем использовать уже полученную выборку, сохраненную в текстовый или Excel-файл (Рис. 3).

Рис.3. Поиск пользователей, подходящих под заданные параметры.

Когда список подходящих пользователей определен, можно переходить к использованию основной функции приложения - проверке нахождения «онлайн». Для этого необходимо выбрать файл, в котором содержится информация о пользователях, полученная на предыдущем шаге, периодичность проверки «онлайн»-статуса (при выборе времени нужно учитывать количество пользователей в выборке - время, необходимое для проверки всего списка должно быть меньше периодичности), время окончания работы программы и название файла, в который будет сохранен результат (Рис. 4). Результат сохраняется в Excel-файл в следующем виде: столбец «A» содержит ID пользователей, а все последующие столбцы - один из четырех возможных вариантов (offline, desktop, mobile, application) для каждого промежутка времени, который определяется заданным интервалом (Рис. 5).

Рис 4. Сбор данных об «онлайн»-статусе выбранных пользователей.

Рис 5. Фрагмент данных об «онлайн»-статусе пользователей за 06.03.2017

3.1.2 Описание классов и используемых библиотек

В разработанном приложении существует 8 различных классов (рис. 6)

Рис 6. Диаграмма классов.

Классы Country, City, University, Faculty и User необходимы для правильной десериализации информации о пользователе, полученной в виде JSON-ответа от сервера «ВКонтакте». Данные классы не содержат методов и не выполняют никаких действий. Единственная их задача - предоставление информации о структуре JSON-ответа.

Класс MyActions содержит методы, необходимые для выполнения основной функции приложения. Эти методы:

Ø  ConnectToWifi - метод, который реализует возможность повторного подключения к сети Интернет в случае разрыва связи в процессе выполнения программы.

Ø  CreateExcelWorkbook - метод для создания Excel-файла.

Ø  CreateYears - метод для создания списка годов, в зависимости от выбранного параметра «тип студента».

Ø  DeleteCookies - метод для удаления пользовательской информации (логин и пароль для «ВКонтакте») после закрытия программы.

Ø  GetAllCities - метод для получения списка всех городов в выбранной стране.

Ø  GetAllCountries - метод для получения списка всех возможных стран.

Ø  GetAllFaculties - метод для получения списка всех факультетов в выбранном ВУЗе

Ø  GetAllUniversities - метод для получения списка всех ВУЗов в выбранной стране.

Ø  GetCurrentUserInfo - метод для получения информации (имя, фамилия, фотография из профиля) о пользователе, совершившим аутентификацию через приложение.

Ø  GetOnlineStatus - метод для получения «онлайн»-статуса для выбранного пользователя (группы пользователей).

Ø  ReadIDsFromExcel - метод для чтения ID студентов, попавших в выборку, из специального Excel-файла.

Ø  SearchUsers - метод, реализующий логику поиска пользователей «ВКонтакте» на основе введенной информации (страна, город, ВУЗ, «тип студента»).

Ø  WriteOnlineStatusToExcel - метод для записи результатов проверки «онлайн»-статуса в Excel-файл.

Ø  WriteUserInfoToExcel - метод для сохранения информации о пользователях из выборки в Excel-файл.

Ø  WriteUserInfoToText - метод для сохранения информации о пользователях из выборки в текстовый файл.

Класс MainWindow содержит методы для работы с графическим интерфейсом приложения. Данные методы:

Ø  CityComboBox_SelectionChanged, CountryComboBox_SelectionChanged, UniversityComboBox_SelectionChanged - методы, получающие информацию о городах, ВУЗах и факультетах, и добавляющие новые элементы в соответствующие раскрывающиеся списки.

Ø  ChooseFileButton_Click - метод, реализующий логику открытия диалогового окна для выбора файла с ID студентов из выборки.

Ø  FindUsersButton_Click - метод, реализующий запуск поиска пользователей по выбранным критериям.

Ø  LogInButton_Click - метод, реализующий открытие дополнительного окна для авторизации пользователя на сайте «ВКонтакте».

Ø  SaveUsersButton_Click - метод, реализующий логику сохранения информации о найденных пользователях.

Ø  StartCollectingButton_Click - метод, запускающий сбор информации об «онлайн»-статусе пользователей из выборки.

Ø  DispatcherTimerCheckOnlineStatuses_Tick, DispatcherTimerEverySecond_Tick - методы, реализующую логику таймеров и задержки между каждой итерацией сбора «онлайн»-статуса выбранных пользователей.

Ø  SaveExcelCheckBox_Checked, SaveExcelCheckBox_Unchecked, SaveTextCheckBox_Checked, SaveTextCheckBox_Unchecked - методы, реализующие логику выбора формата файла, в котором необходимо сохранить информацию о найденных пользователях.

Ø  Все оставшиеся методы, названия которых начинается с «on» реализуют логику изменения различных элементов интерфейса (текста, «прогресс бара» и других) в зависимости от процесса выполнения остальных методов.

Класс AuthorisationForm необходим для открытия страницы авторизации в предустановленном браузере. Методы, присутствующие в данном классе были сгенерированы автоматически и являются стандартными.

Что касается дополнительно загружаемых библиотек, то в разработанном приложении было использовано 2 библиотеки:

Ø  Библиотека «Microsoft.Office.Interop.Excel» - позволяет приложению взаимодействовать с файлами Excel (открывать файлы, считывать информацию, записывать информацию)

Ø  Библиотека «SimpleWifi» - позволяет автоматизировать управление доступными WiFi-сетями, а также реализовывать подключение к сетям. Функционал, предоставляемый данной библиотекой, используется для автоматического повторного подключения к WIFi-сети в случае, если во время работы приложения произошел сбой и доступ в Интернет был ограничен.

3.2 Приложение для получения расписания с сайта ВШЭ


Очевидно, что помимо информации о пребывании студентов «онлайн» в социальной сети «ВКонтакте» также необходимы данные о расписании каждого студента, попавшего в выборку. Это необходимо для того, чтобы точно определить, какой процент именно учебного времени студент проводит в социальной сети.

На данный момент в Высшей школе экономики существует около 40-ка образовательных программ, на которых студенты разделены по курсам и группам. Поскольку для каждого курса и каждой группы расписание различается, то на одну образовательную программу приходится, в среднем, 30-35 вариантов расписания на каждый день. Поэтому, для автоматизации сбора данных о расписании, было разработано специальное приложения на языке Python.

3.2.1 Описание функционала и интерфейса приложения

Основным функционалом данного приложение является автоматизация получения информации о расписании для каждой учебной группы ВШЭ. Разработанное приложение является «консольным», то есть не имеет визуального интерфейса. Кроме того, пользователь не должен (и по сути не может) производить какую-либо настройку приложения - код программы изначально написан так, чтобы всегда выполнять один и тот же сценарий и выдавать один и тот же результат. Несмотря на то, что приложение не имеет привычного визуального интерфейса, оно может выводить текстовую информацию о ходе получения данных, чтобы пользователь мог видеть текущую стадию и оценивать время, оставшееся до завершения работы программы (рис. 7).

Рис 7. Вывод информации о текущем состоянии получения данных.

Алгоритм работы приложения имеет следующий вид:

)        Приложение получает html-код страницы на сайте ВШЭ, на которой размещены ссылки на все существующие образовательные программы

)        Приложение поочередно открывает страницу каждой образовательной программы и переходит на унифицированную страницу с расписанием выбранной образовательной программы (если такая страница существует)

)        Приложение поочередно выбирает все курсы и учебные группы, чтобы получить полное расписание образовательной программы и сохраняет результат в Excel-файл (рис. 8)

Рис 8. Фрагмент результирующего Excel-файла с данными о расписании.

3.2.2 Описание используемых библиотек

В процессе разработки приложения было использовано 6 дополнительных библиотек:

Ø  Библиотека «bs4 (BeautifulSoup)» - позволяет оптимизировать поиск заданных конструкций внутри html-кода web-страницы. С помощью данной библиотеки была получена вся необходимая текстовая информация со страниц сайта Высшей школы экономики с расписанием занятий.

Ø  Библиотека «openpyxl» - позволяет приложение взаимодействовать с Excel-файлами (открывать их, считывать информацию, записывать информацию). С помощью данной библиотеки был реализован метод сохранения полученной информации о расписании в виде единого Excel-файла.

Ø  Библиотека «selenium» - позволяет имитировать действия пользователя в интернет-браузере. Поскольку на сайте с расписанием присутствует динамически загружаемый контент (информация загружается и изменяется по мере того, как пользователь «прокручивает» страницу или меняет номер группы или курса), то данная библиотека была использована для того, чтобы запрограммировать необходимые действия и автоматизировать процесс «прокрутки» страницы и переключения выбранных групп и курсов.

Ø  Библиотека «urllib (request)» - позволяет получать html-код любой web-страницы.

Ø  Библиотека «os» - позволяет взаимодействовать с операционной системой и использовать различные системные функции. Например, в разработанном приложении данная библиотека использовалась для автоматического нахождения пути к рабочему столу пользователя, запустившего программу. Это было необходимо для сохранения на рабочем столе результирующего файла.

Ø  Библиотека «datetime» - позволяет работать со всевозможными форматами представления времени и даты. Библиотека была использована для форматированного вывода текущего времени при появлении каждого сообщения о ходе выполнения программы, таким образом позволяя прогнозировать оставшееся время до конца работы приложения.

3.3 Подготовка и первичный анализ данных


Кроме информации об «онлайн»-активности выбранных студентов и расписании их занятий, для анализа зависимости академической успеваемости от времени, проведенного «онлайн», также необходимы рейтинги всех студентов, которые можно найти в открытом доступе на сайте Высшей школы экономики. Несмотря на то, что процесс скачивания файлов с рейтингами может занимать сравнительно большое количество времени, было решено собрать эти файлы вручную, так как структура страниц, на которых расположены ссылки на скачивания файлов с рейтингами разнится от факультета к факультету, что делает автоматизацию крайне неэффективной. В результате скачивания и объединения всех рейтингов был получен файл с данными по более чем 11 000 студентам (рис. 9).

Рис 9. Фрагмент результирующего Excel-файла с рейтингами студентов.

Когда все три типа данных («онлайн»-активность, расписание, рейтинги) были полностью собраны, было необходимо объединить их в один файл для дальнейшего статистического анализа.

Для начала нужно было сгруппировать данные о пребывание студентов «онлайн» на сайте «ВКонтакте» и данные о рейтингах. Для этого имена, фамилии и факультеты, полученные из социальной сети, сопоставлялись с данными из официальных рейтингов ВШЭ (рис. 10). Сопоставление, в основном, проходило автоматически, с помощью различных Excel-формул. Очевидно, что ручное сопоставление тоже имело место, однако было сведено к минимуму и применялось лишь выборочно. В итоге, информация была точно сопоставлена по 2 284 студентам, что составляет около 30% от первоначального количества. Несмотря на довольно малый процент «удачных» сопоставлений, этих данных более, чем достаточно для проведения дальнейших исследований.

Рис 10. Фрагмент результата объединения данных об «онлайн»-активности и рейтингах студентов.

Следующим шагом было объединение данных о рейтингах и данных о расписании для каждого из 2 284 студентов. Объединение происходило полностью автоматически, опираясь на временные промежутки, полученные в ходе сбора данных по использованию социальной сети. Для удобства некоторые характеристика расписания (название предмета, номер аудитории, лектор и некоторые другие) были объединены в одну строчку с использование разделителя «|». Итогом этого этапа стала таблица, имеющая следующий вид (рис. 11)

Рис 11. Фрагмент результата объединения данных об «онлайн»-активности и расписании.

На основе двух предыдущих этапов стало возможным определения количества минут, проведенным каждым студентом в социальной сети (в разбивке по 4-ем категориям: Mobile, Application, Desktop и Offline) для каждой пары в течение всех дней, когда проводился мониторинг «онлайн»-активности. В результате автоматического подсчета с помощью стандартных функций и формул Excel, была получена таблица следующего вида (рис. 12).

Рис 12. Фрагмент результата таблицы с временем в разбивке по категориям.

Финальным шагом подготовки данных стала агрегация предыдущей таблицы в более подходящем для анализа формате - количество минут по каждой категории для каждого студента было суммировано и был вычислен процент времени, в течении которого студент находился «онлайн» во время занятий. Кроме того, из финальной выборки были исключены выбросы - студенты с нулевым или низким количеством пар. Скорее всего, такие студенты являются четверокурсниками, освобожденными от занятий на время преддипломной практики (которая на некоторых факультетах происходит еще в третьем модуле). Иной возможной причиной появление таких выбросов может являться наличие ошибок в системе расписания на сайте Высшей школы экономики. В итоге, количество студентов в выборке незначительно сократилось и насчитывало 2 147 студентов (рис. 13).

Рис 13. Фрагмент агрегированной таблицы.

3.4 Статистический анализ данных

 

3.4.1 Тестирование коэффициента ранговой корреляции Спирмена

Первым этапом в анализе данных являлся анализ коэффициента ранговой корреляции Спирмена. Данный коэффициент показывает, насколько сильна связь между двумя переменными и направление этой связи (прямая зависимость или обратная).

Для того, чтобы воспользоваться методом ранговой корреляции Спирмена, сначала необходимо убедиться, что данный метод можно применять. Это необходимо потому, что только при соответствие данных двум предпосылкам, результат корреляционного теста будет достоверен. Эти предпосылки:

Ø  Две переменные должны быть измеримы по порядковой, интервальной или пропорциональной шкале.

Ø  Отношения между переменными должны быть монотонными, то есть, переменные должны либо вместе увеличиваться/уменьшаться, либо находиться в ситуации, когда одна переменная уменьшается, а другая - увеличивается.

В качестве двух переменных для данного анализа будут использоваться переменные «Набранный процент от максимально возможного рейтинга» и «Процент учебного времени, проведенного онлайн». Стоит отметить, что в целом эти переменные уже соответствуют первой предпосылке и действительно измеряются по порядковой шкале. Что же касается второй предпосылки, то ее можно проверить с помощью построения графика рассеивания.

Рис 14. График рассеивания для проверки 2-ой предпосылки теста Спирмена.

Как следует из графика (рис. 14), отношения двух переменных не являются монотонными. Однако, данную ситуацию можно попытаться исправить, проводя анализ не над самими переменными, а над некоторыми их модификациями. Например, можно округлить обе переменные до единиц или десятков процентов и затем заново проверить 2-ую предпосылку, построив новые графики рассеивания.

Рис 15. График рассеивания для преобразованных переменных (округление до единиц).

Рис 16. График рассеивания для преобразованных переменных (округление до десятков).

Из графиков рассеивания для преобразованных переменных (рис. 15, рис. 16) можно заметить, что 2-ая предпосылка о монотонности отношений двух переменных все равно не соблюдается.

После построения трех различных диаграмм рассеивания стало очевидно, что на полной выборке вторая предпосылка, необходимая для проведения анализа с использование коэффициента корреляции Спирмена не подтверждается. Однако в процессе построения графиков возникла гипотеза о том, что переменные «Набранный процент от максимально возможного рейтинга» и «Процент учебного времени, проведенного онлайн» могут иметь монотонные отношения не в рамках всей выборки, а в рамках одного факультета. Так как каждый факультет имеет индивидуальные черты в своей учебной программе, то было вполне вероятным, что некоторые «монотонные особенности» некоторых факультетов «сглаживаются» за счет рассмотрения общей выборки. приложение сайт интерфейс библиотека

Для проверки данной гипотезы, по схожему принципу были построены 20 различных графиков рассеивания отдельно для каждого факультета. К сожалению, лишь факультет график рассеивания для факультета Истории приблизительно напоминал обратную монотонную зависимость (рис. 17), в то время как для всех остальных факультетов гипотеза о возможном наличии монотонной зависимости не подтвердилась. Со всеми графиками рассеивания, построенными отдельно для каждого факультета можно ознакомиться в Приложении №3.

Рис 17. График рассеивания для факультета Истории.

Таким образом, можно заключить, что тест ранговой корреляции Спирмена не подходит для анализа собранных данных.

 

3.4.2 Тестирование logit-регрессии

После тестирования коэффициента корреляции Спирмена, была построена логистическая (logit) регрессия. Этот вид регрессии позволяет предсказывать вероятность, с которой то или иное наблюдение будет отнесено к одной из двух категорий на основе независимых переменных.

Для того, чтобы результат логистической регрессии можно было считать достоверным, исходные данные должны соответствовать следующим критериям:

Ø  Зависимая переменная должна измеряться по дихотомической шкале, то есть, иметь всего два возможных значения;

Ø  Независимые переменные должны измеряться по непрерывной или категориальной шкале;

Ø  Данные в выборке должны быть независимы (не должны коррелировать друг с другом);

Ø  Между любой независимыми переменными, измеряемой по непрерывной шкале и логистическим преобразованием зависимой переменной должны наблюдаться отношения линейности.

Перед началом построения линейной регрессии данные были проверены на соблюдение всех вышеупомянутых формальных требований анализа и прошли эту проверку.

В процессе построения логистической регрессии на основе экспертной оценки «процента учебного времени, проведенного онлайн» и «набранного процента от максимально возможного рейтинга» для каждого студента из выборки, были определены две новые зависимые переменные - «Устойчивость к воздействие социальных сетей» и «Неустойчивость к воздействие социальных сетей». Возможные значения этих переменных включают в себя всего два варианта - «Да» и «Нет».

Для первой логистической регрессии использовалась зависимая переменная «Устойчивость к воздействие социальных сетей» и независимые переменные «Курс», «Пол», «Факультет», «Mobile (минуты)», «Application (минуты)», «Desktop (минуты)» и «Offline (минуты)». Результаты этой регрессии представлены ниже (рис. 18, рис. 19, рис. 20).

Рис 18. Сводка модели (1).

Рис 19. Таблица классификации (1).

Рис 20. Переменные и коэффициенты (1).

Исходя из полученного результата можно заключить, что достоверность модели ( находится в промежутке от 30% (R-квадрат Кокса и Снелла) до 47% (R-квадрат Нэйджелкерка), что является хорошим результатом.

Более того, общая процентная доля наблюдений, отнесенных в верную категорию достигает чуть более 83-ех процентов, что также говорит о достаточной предсказательной силой модели.

Что же касается переменных, то следует отметить, что время, проведенное «онлайн» отрицательно сказывается на возможности отнесения студента в категорию «устойчивых», а время, проведенное вне социальной сети - наоборот, положительно. Также следует отметить, что данная модель склонна относить девушек к «устойчивым» в 1,726 раз чаще, чем студентов мужского пола. Кроме того, можно заметить, вероятность студента быть отнесенным в группу «устойчивых» также довольно сильно разнится в зависимости от факультета.

Вторая логистическая регрессия, нацеленная на то, чтобы определять студентов, «неустойчивых к воздействию социальных сетей» показала себя хуже. Во-первых, её достоверность находится в интервале от 7% (по Коксу и Стеллу) до 22,5% (по Нэйджелкерку), что говорит о достаточно слабой предсказательной силе (рис. 21). Общая процентная доля правильно отнесенных наблюдений очень велика - 95,2 процента, однако, если посмотреть на доли правильно отнесенных наблюдений отдельно для «Да» и «Нет», то можно заметить, что модель не может правильно определять «неустойчивых» и просто склонна относить все наблюдения в категорию «Нет» (рис. 22). Относительно переменных можно заключить, что в данной модели значительно больше незначимых переменных и знаки некоторых коэффициентов при переменных (например, «Пол» и «Desktop (минуты)») достаточно сложно объяснить с логической точки зрения (рис. 23.).

Рис 21. Сводка модели (2).

Рис 22. Таблица классификации (2).

Рис 23. Переменные и коэффициенты (2).

3.4.3 Тестирование линейной регрессии

Последним анализом в данной работе является построение линейной регрессии. Как было описано выше, линейная регрессия позволяет построить формулу, по которой можно с определенной долей уверенности предсказать значение одной переменной на основе других.

Для того, чтобы результаты линейной регрессии можно было считать достоверными, необходимо, чтобы данные составляющие выборку, удовлетворяли следующим условиям:

Ø  Переменные должны измеряться по непрерывной шкале;

Ø  Между переменными в той или иной степени должны наблюдаться отношения линейности;

Ø  В выборке не должны встречаться значительные статистические выбросы;

Ø  Данные в выборке должны быть независимы (не должны коррелировать друг с другом);

Ø  Данные должны быть гомоскедастичны;

Ø  Остатки регрессии должны попадать под нормальное распределение.

Перед началом построения линейной регрессии данные также были проверены на соблюдение всех вышеупомянутых формальных требований анализа и прошли эту проверку.

В качестве зависимой переменной для построения регрессии была выбрана переменная «Набранный процент от максимально возможного рейтинга», а в качестве независимых - следующий переменные:

Ø  «Курс»;

Ø  «Mobile (минуты)»;

Ø  «Application (минуты)»;

Ø  «Desktop (минуты)»;

Ø  «Offline (минуты)».

После построения регрессии с указанными переменными были получены следующие результаты (рис. 24, рис. 25).

Рис 24. Сводка для регрессионной модели (1).

Рис 25. Коэффициенты для регрессионной модели (1).

Анализируя полученные результаты, можно заключить, что данная регрессия хорошо описывает зависимую переменную (это доказывается сравнительно большим значением ), а коэффициенты всех независимых переменных значимы (это доказывается значимостью, меньшей, чем 0,05). Кроме того, по результатам проведения анализа была определена формула, с помощью которой с большой вероятностью можно вычислить успеваемость студента:

 

Однако, как можно заметить, наибольшую роль в формирование набранного процента рейтинга играет курс студента, а не время, проведенное (или не проведенное) им в социальных сетях. Кроме того, стоит отметить, что, исходя из знаков полученных коэффициентов, и взаимодействие с социальными сетями и отказ от их использования позитивно влияют на академическую успеваемость, что несколько не соответствует первичным предположениям и обычной логике.

Кроме регрессии с использованием абсолютного количества минут, проведенных в социальной сети (в разбивке по 4-ем типам) в качестве зависимых переменных, была также построена регрессия с использованием «процента учебного времени, проведенного онлайн». Результаты такой регрессии представлены ниже (рис. 26, рис. 27).

Рис 26. Сводка для регрессионной модели (2).

Рис 27. Коэффициенты для регрессионной модели (2).

Как и в первой регрессии, все независимые переменные оказались значимы, и «Курс» имеет гораздо большее влияние на успеваемость, нежели «процент учебного времени, проведенного онлайн». Формула для данной регрессии такова:

 

В итоге, можно заключить, что первоначальный интуитивно ожидаемый результат не подтвердился. Несмотря на то, что удалось определить формулу, по которой возможно рассчитать успеваемость студента, его активность в социальной сети «ВКонтакте» играет достаточно малую роль в формировании оценки.

Выводы по третьей главе


В данной главе была полностью описана реализация выпускной квалификационной работы, включая описание процесса разработки приложений, подготовки и первичного анализа данных, а также построения регрессий.

Заключение


Подводя итог выполненной работе, стоит отметить, что все поставленные задачи были выполнены:

Ø  Была определена выборка из 7108-ми студентов, которая сократилась более, чем в три раза, в следствии подготовки и первичного анализа данных, однако по-прежнему осталась достаточно репрезентативной;

Ø  Было разработано два приложения (одно - на языке C#, другое - на языке Python) для автоматизации сбора данных;

Ø  Все собранные данные были структурированы, объединены и полностью подготовлены для проведения основных анализов;

Ø  Были построены логистическая и линейная регрессии, а также проверен коэффициент ранговой корреляции Спирмена

Несмотря на то, что в ходе работы гипотеза о том, что время, которое студенты проводят в социальных сетях во время занятий влияет на их академическую успеваемость не была полностью подтверждена, данное исследование имеет ряд преимуществ (например, способ оценки количества времени, проведенного «онлайн») по сравнению с другими работами на схожую тематику.

Полученные результаты и наработки могут быть использованы для проведения дальнейших исследований этой, несомненно важной в современном мире темы, например, в других высших учебных заведениях или школах.

Список использованной литературы


1.      Melissa Zwart, David Lindsay, Michael Henderson, Michael Phillips. Teenagers, Legal Risks and Social Networking Sites, 2011.

2.      Jason Tham. The Sage and Implications of Social Networking Sites: A Survey of College Students, Journal of Interpersonal, Intercultural and Mass Communication, 2011.

3.      Abdulsalam K Alhazmi. Facebook in Higher Education: Students’ Use and Perceptions, Advances in Information Sciences and Service Sciences, 2013.

4.      Adam Mahamat Helou. The Influence of Social Networking Sites on Students’ Academic Performance in Malaysia, International Journal of Electronic Commerce Studies, 2014.

5.      Mark Salvation. The Influence of Social Network Sites (SNS) upon Academic Performance of Malaysian Students, International Journal of Humanities and Social Science, 2014.

6.      Abraham, Ajith. Computational Social Networks, 2012.

7.      Joseph Albahari, Ben Albahari. C# 5.0 in a Nutshell: The Definitive Reference by, 2012.

8.      Carmen Batanero, Manfred Borovcnik. Statistics and Probability in High School, 2016.

9.      Stephen P Borgatti, Martin G. Everett, Jeffrey C. Johnson. Analyzing Social Networks, 2013.

10.    Jamie Chan. C#: Learn C# in One Day and Learn It Well. C# for Beginners with Hands-on Project, 2016.

11.    Samprit Chatterjee, Ali S. Hadi. Regression Analysis by Example, 2012.

12.    Jacob Cohen. Statistical Power Analysis for the Behavioral Sciences (2nd Edition), 1988.

13.    Cyberpunk University. C# Programming: The No-Nonsense Guide: Learn C# Programming Within 12 Hours, 2017.

14.    Andrew Gelman, Jennifer Hill. Data Analysis Using Regression and Multilevel/Hierarchical Models, 2007.

15.    Frank E. Harrell Junior. Regression Modeling Strategies: With Applications to Linear Models, Logistic Regression, and Survival Analysis, 2001.

16.    David W. Hosmer Junior, Stanley Lemeshow, Rodney X. Sturdivant. Applied Logistic Regression, 2013.

17.    iCode Academy. Python: Programming: Your Step by Step Guide to Easily Learn Python in 7 Days, 2016.

18.    Charles Kadushin. Understanding Social Networks: Theories, Concepts, and Findings, 2012.

19.    Eric J. Krieg. Statistics and Data Analysis for Social Science, 2012.

20.    Robert O. Kuehl. Design of Experiments: Statistical Principles of Research Design and Analysis, 2000.

21.    Mark Lutz. Learning Python, 5th Edition, 2013.

22.    Eric Matthes. Python Crash Course: A Hands-On, Project-Based Introduction to Programming, 2016.

23.    Douglas C. Montgomery, Elizabeth A. Peck, G. Geoffrey Vining. Introduction to Linear Regression Analysis, 2012.

24.    Luciano Ramalho. Fluent Python: Clear, Concise, and Effective Programming, 2015.

25.    John Sharp. Microsoft Visual C# 2013 Step by Step (Step by Step Developer), 2013.

26.    John Sharp. Microsoft Visual C# Step by Step (8th Edition) (Developer Reference), 2015.

27.    Richard C. Sprinthall. Basic Statistical Analysis (9th Edition), 2011.

28.    Andrew Stellman, Jennifer Greene. Head First C#: A Learner's Guide to Real-World Programming with C#, XAML, and .NET, 2014.

29.    Al Sweigart. Automate the Boring Stuff with Python: Practical Programming for Total Beginners, 2015.

30.    Andrew Troelsen. Pro C# 5.0 and the .NET 4.5 Framework (Expert's Voice in .NET), 2012.

31.    Andrew Troelsen, Philip Japikse. C# 6.0 and the .NET 4.6 Framework, 2015.

32.    The Code Academy. Python Programming: An In-Depth Guide into The Essentials of Python Programming, 2017.

33.    Stanley Wasserman, Katherine Faust. Social Network Analysis: Methods and Applications (Structural Analysis in the Social Sciences), 1999.

34.    R.B. Whitaker. The C# Player's Guide (3rd Edition), 2012.

Приложение 1

Код приложения для получения информации с сайта «ВКонтакте»

Класс User.csSystem.Windows.Media;Grades_Analysis

{

public class User

{

#region Свойства для API

public string id { get; set; }

public string first_name { get; set; }

public string last_name { get; set; }

public string photo_100 { get; set; }

public string university { get; set; }

public string university_name { get; set; }

public string faculty { get; set; }

public string faculty_name { get; set; }

public string graduation { get; set; }

public string online { get; set; }

public string online_mobile { get; set; }

public string online_app { get; set; }

public string sex { get; set; }

#endregion

#region Дополнительные свойства

public ImageSource Photo { get; set; }

public string Token { get; set; }

public string UserID { get; set; }

public string Scope { get; set; }

}

}

Класс University.csGrades_Analysis

{University

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс Faculty.csGrades_Analysis

{

class Faculty

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс Country.csGrades_Analysis

{

class Country

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс City.csGrades_Analysis

{

class City

{

public string id { get; set; }

public string title { get; set; }

}

}

Класс MyActions.csNewtonsoft.Json;System;System.Collections.Generic;System.IO;System.Linq;xNet;Microsoft.Office.Interop.Excel;System.Windows.Media.Imaging;System.Runtime.InteropServices;System.Threading;SimpleWifi;Grades_Analysis

{

class MyActions

{

#region Методы работы с API ВКонтакте

public User GetCurrentUserInfo(string url, string scope)

{

#region Объявление переменных и присвоение значений

string token = url.Split(new char[] { '=', '&' }, StringSplitOptions.RemoveEmptyEntries)[1];

string userID = url.Split(new char[] { '=', '&' }, StringSplitOptions.RemoveEmptyEntries)[5];

string additionalField = "photo_100";

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

#endregion

#region Создание запроса

request.AddUrlParam("user_ids", userID);

request.AddUrlParam("fields", additionalField);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "users.get").ToString();

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

User currUser = JsonConvert.DeserializeObject<User>(requestResult);

currUser.Photo = new BitmapImage(new Uri(currUser.photo_100, UriKind.RelativeOrAbsolute));

currUser.Token = token;

currUser.UserID = userID;

currUser.Scope = scope;

#endregion

return currUser;

}

public List<Country> GetAllCounties(string token)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<Country> allCountries = new List<Country>();

#endregion

#region Создание запроса

request.AddUrlParam("need_all", 1);

request.AddUrlParam("count", 1000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getCountries").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";.Add(JsonConvert.DeserializeObject<Country>(splitResults[i]));

}

allCountries = allCountries.OrderBy(t => t.title).ToList();

}

#endregion

return allCountries;

}

public List<City> GetAllCities(string token, string countryID)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<City> allCities = new List<City>();

#endregion

#region Создание запроса

request.AddUrlParam("country_id", countryID);

request.AddUrlParam("need_all", 0);

request.AddUrlParam("count", 1000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getCities").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

allCities.Add(JsonConvert.DeserializeObject<City>(splitResults[i]));

}

allCities = allCities.OrderBy(t => t.title).ToList();

}

#endregion

return allCities;

}

public List<University> GetAllUniversities(string token, string countryID, string cityID)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<University> allUniversities = new List<University>();

#endregion

#region Создание запроса

request.AddUrlParam("country_id", countryID);

request.AddUrlParam("city_id", cityID);

request.AddUrlParam("count", 10000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getUniversities").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";.Add(JsonConvert.DeserializeObject<University>(splitResults[i]));

}

allUniversities = allUniversities.OrderBy(t => t.title).ToList();

}

#endregion

return allUniversities;

}

public List<Faculty> GetAllFaculties(string token, string universityID)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<Faculty> allFaculties = new List<Faculty>();

#endregion

#region Создание запроса

request.AddUrlParam("university_id", universityID);

request.AddUrlParam("count", 10000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "database.getFaculties").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";

allFaculties.Add(JsonConvert.DeserializeObject<Faculty>(splitResults[i]));

}

allFaculties = allFaculties.OrderBy(t => t.title).ToList();

}

#endregion

return allFaculties;

}

public List<User> SearchUsers(string token, string universityID, string universityName, string facultyID, string facultyName, string graduationYear, string additionalField)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

HttpRequest request = new HttpRequest();

List<User> foundUsersPerFaculty = new List<User>();

#endregion

#region Создание запроса

request.AddUrlParam("fields", additionalField);

request.AddUrlParam("university", universityID);

request.AddUrlParam("university_faculty", facultyID);

request.AddUrlParam("university_year", graduationYear);

request.AddUrlParam("count", 1000);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

string requestResult = request.Get(_ApiURL + "users.search").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < splitResults.Length; i++)

{

if (splitResults[i][0] != '{')

splitResults[i] = "{" + splitResults[i];

if (splitResults[i][splitResults[i].Length - 1] != '}')

splitResults[i] += "}";.Add(JsonConvert.DeserializeObject<User>(splitResults[i]));[foundUsersPerFaculty.Count - 1].university = universityID;[foundUsersPerFaculty.Count - 1].university_name = universityName;[foundUsersPerFaculty.Count - 1].faculty = facultyID;[foundUsersPerFaculty.Count - 1].faculty_name = facultyName;[foundUsersPerFaculty.Count - 1].graduation = graduationYear;

}

}

#endregion

return foundUsersPerFaculty;

}

public List<User> GetOnlineStatus(string token, List<User> allUsers, Action<long, long> onOneOlineStatusChecked, System.Action onAllOlineStatusesChecked)

{

#region Объявление переменных и присвоение значений

const string _ApiURL = "https://api.vk.com/method/";

List<User> allOnlineStatuses = new List<User>();

string oneHundredIDs = "";

string additionalField = "online";

#endregion

#region Цикл по каждым 100 пользователям

for (int i = 0; i < allUsers.Count; i++)

{

oneHundredIDs = oneHundredIDs + allUsers[i].id + ",";

if ((i + 1) % 100 == 0 || (i + 1) == allUsers.Count)

{

oneHundredIDs = oneHundredIDs.Remove(oneHundredIDs.Length - 1);

#region Создание запроса

HttpRequest request = new HttpRequest();

request.AddUrlParam("user_ids", oneHundredIDs);

request.AddUrlParam("fields", additionalField);

request.AddUrlParam("access_token", token);

request.AddUrlParam("v", "5.8");

#endregion

#region Получение информации от сервера ВКонтакте

try

{

string requestResult = null;

while (requestResult == null)

requestResult = request.Get(_ApiURL + "users.get").ToString();

if (requestResult.IndexOf(":[{") != -1)

{

int substringStart = requestResult.IndexOf(":[{") + 2;

int substringLenght = requestResult.IndexOf("}]") - substringStart + 1;

requestResult = requestResult.Substring(substringStart, substringLenght);

string[] splitResults = requestResult.Split(new string[] { "},{" }, StringSplitOptions.RemoveEmptyEntries);

for (int j = 0; j < splitResults.Length; j++)

{

if (splitResults[j][0] != '{')

splitResults[j] = "{" + splitResults[j];

if (splitResults[j][splitResults[j].Length - 1] != '}')

splitResults[j] += "}";.Add(JsonConvert.DeserializeObject<User>(splitResults[j]));(((int)(i / 100) * 100) + (j + 1), allUsers.Count);

}

}

}

catch (xNet.HttpException ex)

{

if (ex.Status == HttpExceptionStatus.ConnectFailure)

ConectToWifi();

i -= 100;

File.AppendAllText("Log File.txt", DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToLongTimeString() + ": "+ ex.Message + Environment.NewLine);

}

#endregion

oneHundredIDs = "";

Thread.Sleep(500);

}

}

#endregion

onAllOlineStatusesChecked();

return allOnlineStatuses;

}

#endregion

#region Методы работы с данными

public string WriteUserInfoToExcel(List<User> allUsersFromUniversity, Action<long, long> onExcelOneStringWritten)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = (_Workbook)(excelApp.Workbooks.Add(Type.Missing));

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

string fileName = "Excel Data (" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ")";

fileName = fileName.Replace(':', '.');

#endregion

#region Запись заголовков

worksheet.Cells[1, 1] = "ID ВКонтакте";

worksheet.Cells[1, 2] = "Имя";

worksheet.Cells[1, 3] = "Фамилия";

worksheet.Cells[1, 4] = "Пол";

worksheet.Cells[1, 5] = "ID Университета";

worksheet.Cells[1, 6] = "Название Университета";

worksheet.Cells[1, 7] = "ID Факультета";

worksheet.Cells[1, 8] = "Название Факультета";

worksheet.Cells[1, 9] = "Год выпуска";

#endregion

#region Запись данных

for (int i = 0; i < allUsersFromUniversity.Count; i++)

{

try

{

worksheet.Cells[i + 2, 1] = "'" + allUsersFromUniversity[i].id;

worksheet.Cells[i + 2, 2] = allUsersFromUniversity[i].first_name;

worksheet.Cells[i + 2, 3] = allUsersFromUniversity[i].last_name;

if (allUsersFromUniversity[i].sex == "1")

worksheet.Cells[i + 2, 4] = "Ж";

else if (allUsersFromUniversity[i].sex == "2")

worksheet.Cells[i + 2, 4] = "М";

else

worksheet.Cells[i + 2, 4] = "Не указано";

worksheet.Cells[i + 2, 5] = "'" + allUsersFromUniversity[i].university;

worksheet.Cells[i + 2, 6] = allUsersFromUniversity[i].university_name;

worksheet.Cells[i + 2, 7] = "'" + allUsersFromUniversity[i].faculty;

worksheet.Cells[i + 2, 8] = allUsersFromUniversity[i].faculty_name;

worksheet.Cells[i + 2, 9] = "'" + allUsersFromUniversity[i].graduation;

onExcelOneStringWritten(i + 1, allUsersFromUniversity.Count);

}

catch { continue; }

}

#endregion

#region Сохранение и закрытие файла

workbook.SaveAs(AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx");

fileName = AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx";

workbook.Close();

excelApp.Quit();

Marshal.ReleaseComObject(worksheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excelApp);

#endregion

return fileName;

}

public string WriteUserInfoToText(List<User> allUsersFromUniversity, Action<long, long> onExcelOneStringWritten)

{

#region Объявление переменных и присвоение значений

string fileName = "Text Data (" + DateTime.Now.ToShortDateString() + " " + DateTime.Now.ToShortTimeString() + ")";

fileName = fileName.Replace(':', '.');

FileStream fs = new FileStream(fileName + ".txt", FileMode.Create);

StreamWriter sw = new StreamWriter(fs);

#endregion

#region Запись заголовков

sw.WriteLine("ID ВКонтакте|Имя|Фамилия|ID Университета|Название Университета|ID Факультета|Название Факультета|Год выпуска");

#endregion

#region Запись данных

foreach (User user in allUsersFromUniversity)

{

sw.WriteLine(user.id + "|" + user.first_name + "|" + user.last_name + "|" + user.university + "|" + user.university_name + "|" + user.faculty + "|" + user.faculty_name + "|" + user.graduation);

onExcelOneStringWritten(allUsersFromUniversity.IndexOf(user) + 1, allUsersFromUniversity.Count);

}

#endregion

#region Сохранение и закрытие файла

sw.Close();

fs.Close();

fileName = Path.GetFullPath(fileName + ".txt");

#endregion

return fileName;

}

public List<User> ReadIDsFromExcel(string path, long columnNumber, Action<long, long> onTextOneRowRead)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = excelApp.Workbooks.Open(path);

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

long lastRow = worksheet.Cells[worksheet.Rows.Count, columnNumber].End(Microsoft.Office.Interop.Excel.XlDirection.xlUp).Row;

List<User> allUsers = new List<User>();

#endregion

#region Чтение данных

for (int i = 2; i <= lastRow; i++)

{

allUsers.Add(new User() { id = worksheet.Cells[i, 1].Value2 });

onTextOneRowRead(lastRow - 1, i);

}

#endregion

#region Закрытие файла

workbook.Close();

excelApp.Quit();

#endregion

return allUsers;

}

public void WriteOnlineStatusToExcel(List<User> allOnlineStatuses, string fileName, DateTime startTime, bool firstTime, Action<long, long> onOneOnlineStatusWritten, System.Action onAllOnlineStatusesWritten)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = (_Workbook)(excelApp.Workbooks.Open(AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx"));

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

long lastColumn = worksheet.Cells[1, worksheet.Columns.Count].End(Microsoft.Office.Interop.Excel.XlDirection.xlToLeft).Column;

#endregion

#region Запись заголовков

if (firstTime)

worksheet.Cells[1, 1] = "ID ВКонтакте";

worksheet.Cells[1, lastColumn + 1] = startTime.ToShortDateString() + " " + startTime.ToShortTimeString();

#endregion

#region Запись данных

for (int i = 0; i < allOnlineStatuses.Count; i++)

{

if (firstTime)

worksheet.Cells[i + 2, 1] = "'" + allOnlineStatuses[i].id;

if (allOnlineStatuses[i].online == "0")

worksheet.Cells[i + 2, lastColumn + 1] = "Offline";

else if (allOnlineStatuses[i].online == "1" && allOnlineStatuses[i].online_app == null && allOnlineStatuses[i].online_mobile == null)

worksheet.Cells[i + 2, lastColumn + 1] = "Desktop";

else if (allOnlineStatuses[i].online == "1" && allOnlineStatuses[i].online_mobile != null && allOnlineStatuses[i].online_app == null)

worksheet.Cells[i + 2, lastColumn + 1] = "Mobile";

else if (allOnlineStatuses[i].online == "1" && allOnlineStatuses[i].online_app != null)

worksheet.Cells[i + 2, lastColumn + 1] = "Application";

else

worksheet.Cells[i + 2, lastColumn + 1] = allOnlineStatuses[i].online;

onOneOnlineStatusWritten(i + 1, allOnlineStatuses.Count);

}

#endregion

#region Сохранение и закрытие файла

workbook.Save();

workbook.Close();

excelApp.Quit();

Marshal.ReleaseComObject(worksheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excelApp);

GC.Collect();

#endregion

onAllOnlineStatusesWritten();

}

public void CreateExcelWorkbook(string fileName)

{

#region Объявление переменных и присвоение значений

Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();

_Workbook workbook = (_Workbook)(excelApp.Workbooks.Add(Type.Missing));

_Worksheet worksheet = (_Worksheet)workbook.ActiveSheet;

#endregion

#region Сохранение и закрытие файла

workbook.SaveAs(AppDomain.CurrentDomain.BaseDirectory + fileName + ".xlsx");

workbook.Close();

excelApp.Quit();

Marshal.ReleaseComObject(worksheet);

Marshal.ReleaseComObject(workbook);

Marshal.ReleaseComObject(excelApp);

GC.Collect();

#endregion

}

#endregion

#region Остальные методы

public List<string> CreateYears(bool currentStudents)

{

List<string> years = new List<string>();

if (currentStudents)

for (int i = DateTime.Now.Year; i < DateTime.Now.Year + 4; i++)

years.Add(i.ToString());

else

for (int i = 1990; i < DateTime.Now.Year + 7; i++)

years.Add(i.ToString());

return years;

}

public void DeleteCookies()

{

string[] theCookies = System.IO.Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.Cookies));

foreach (string currentFile in theCookies)

try { System.IO.File.Delete(currentFile); }

catch { continue; }

}

public void ConectToWifi()

{

Wifi wifi = new Wifi();

IEnumerable<AccessPoint> accessPoints = wifi.GetAccessPoints().OrderByDescending(ap => ap.SignalStrength);

foreach (AccessPoint ap in accessPoints)

if (ap.Name.ToLower() == "netgear")

{

AuthRequest authRequest = new AuthRequest(ap);

ap.Connect(authRequest, false);

break;

}

}

#endregion

}

}

Класс MainWindow.xaml.csSystem;System.Collections.Generic;System.Linq;System.Threading;System.Threading.Tasks;System.Windows;System.Windows.Controls;System.Windows.Forms;Grades_Analysis

{

public partial class MainWindow : Window

{

public MainWindow()

{

InitializeComponent();

findUsersGroupBox.IsEnabled = false;

cityComboBox.IsEnabled = false;

universityComboBox.IsEnabled = false;

findUsersButton.IsEnabled = false;

saveExcelCheckBox.IsEnabled = false;

saveTextCheckBox.IsEnabled = false;

saveUsersButton.IsEnabled = false;

settingsGroupBox.IsEnabled = false;

intervalComboBox.IsEnabled = false;

intervalComboBox.SelectedIndex = 0;

FinishHourComboBox.IsEnabled = false;

FinishHourComboBox.SelectedIndex = DateTime.Now.Hour + 1;

FinishMinuteComboBox.IsEnabled = false;

FinishMinuteComboBox.SelectedIndex = 0;

fileNameSaveTextBox.IsEnabled = false;

fileNameSaveTextBox.Text = "Online Statistics_" + DateTime.Now.ToShortDateString();

startCollectingButton.IsEnabled = false;

checkOnlineStatusGroupBox.IsEnabled = false;

overallProgressTextBlock.Text = "Собрано данных за " + DateTime.Now.ToShortDateString() + ": 0 из N/A. Следующая итерация через: N/A";

}

#region Объявление глобальных переменных

MyActions myAction = new MyActions();

User currUser;

List<User> allUsersFromUniversity = new List<User>();

int iterationsDone = 0;

int totalIterations = 0;

System.Windows.Threading.DispatcherTimer dispatcherTimerEverySecond;

System.Windows.Threading.DispatcherTimer dispatcherTimerCheckOnlineStatuses;

TimeSpan timeLeft;

#endregion

#region Методы нажатия на кнопки

private void LogInButton_Click(object sender, RoutedEventArgs e)

{

#region Объявление переменных и присвоение значений

AuthorisationForm authForm = new AuthorisationForm();

authForm.ShowDialog();

currUser = authForm.CurrUser;

#endregion

#region Авторизация в Вконтакте

if (currUser != null)

{

nameLabel.Content = "Имя пользователя: " + currUser.first_name + " " + currUser.last_name;

IDLabel.Content = "ID пользователя: " + currUser.UserID;

scopeLabel.Content = "Права доступа: " + currUser.Scope;

profilePictureImage.Source = currUser.Photo;

LogInButton.IsEnabled = false;

findUsersGroupBox.IsEnabled = true;

currentlyStudyingRadioButton.IsChecked = true;

countryComboBox.ItemsSource = myAction.GetAllCounties(currUser.Token);

countryComboBox.DisplayMemberPath = "title";

disclaimerTextBlock.Text = "Вход в ВКонтакте выполнен. Теперь вы можете пользоваться всем функционалом приложения.";

settingsGroupBox.IsEnabled = true;

chooseFileButton.IsEnabled = true;

}

#endregion

}

private void findUsersButton_Click(object sender, RoutedEventArgs e)

{

#region Изменение доступности элементов

settingsGroupBox.IsEnabled = false;

saveExcelCheckBox.IsEnabled = false;

saveTextCheckBox.IsEnabled = false;

saveUsersButton.IsEnabled = false;

findUsersButton.IsEnabled = false;

countryComboBox.IsEnabled = false;

cityComboBox.IsEnabled = false;

universityComboBox.IsEnabled = false;

allStudentsRadioButton.IsEnabled = false;

currentlyStudyingRadioButton.IsEnabled = false;

#endregion

#region Multi-метод

Task.Factory.StartNew(() =>

{

List<Faculty> faculties = myAction.GetAllFaculties(currUser.Token, ((University)universityComboBox.Dispatcher.Invoke(() => universityComboBox.SelectedItem)).id);

List<string> years = myAction.CreateYears(currentlyStudyingRadioButton.Dispatcher.Invoke(() => currentlyStudyingRadioButton.IsChecked.Value));

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = 0);

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Maximum = faculties.Count * years.Count);

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Найдено факультетов: " + faculties.Count + ". Проверено факультетов: 0 из " + faculties.Count + ".");

foreach (Faculty faculty in faculties)

{

foreach (string year in years)

{

foreach (User oneUser in myAction.SearchUsers(currUser.Token, ((University)universityComboBox.Dispatcher.Invoke(() => universityComboBox.SelectedItem)).id, ((University)universityComboBox.Dispatcher.Invoke(() => universityComboBox.SelectedItem)).title, faculty.id, faculty.title, year, "sex"))

{

allUsersFromUniversity.Add(oneUser);

}

onOneYearFacultyChecked();

Thread.Sleep(500);

}

onOneFacultyChecked(faculties.IndexOf(faculty) + 1, faculties.Count);

}

onAllFacultiesChecked(faculties.Count, allUsersFromUniversity.Count);

});

#endregion

}

private void saveUsersButton_Click(object sender, RoutedEventArgs e)

{

#region Объявление переменных и присвоение значений

string excelPath = "";

string textPath = "";

#endregion

#region Измение характеристик ProgressBar'ов

findUsersProgressBar.Value = 0;

findUsersProgressBar.Maximum = allUsersFromUniversity.Count;

#endregion

#region Изменение доступности элементов

saveExcelCheckBox.IsEnabled = false;

saveTextCheckBox.IsEnabled = false;

saveUsersButton.IsEnabled = false;

findUsersButton.IsEnabled = false;

countryComboBox.IsEnabled = false;

cityComboBox.IsEnabled = false;

universityComboBox.IsEnabled = false;

allStudentsRadioButton.IsEnabled = false;

currentlyStudyingRadioButton.IsEnabled = false;

#endregion

#region Multi-метод

Task.Factory.StartNew(() =>

{

if (saveExcelCheckBox.Dispatcher.Invoke(() => saveExcelCheckBox.IsChecked.Value))

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в Excel-файл. Записано файлов: 0 из " + allUsersFromUniversity.Count + ".");

excelPath = myAction.WriteUserInfoToExcel(allUsersFromUniversity, onExcelOneStringWritten);

}

if (saveTextCheckBox.Dispatcher.Invoke(() => saveTextCheckBox.IsChecked.Value))

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в текстовый файл. Записано файлов: 0 из " + allUsersFromUniversity.Count + ".");

textPath = myAction.WriteUserInfoToText(allUsersFromUniversity, onTextOneStringWritten);

}

onFileFullyWritten(excelPath, textPath);

});

#endregion

}

private void chooseFileButton_Click(object sender, RoutedEventArgs e)

{

chooseFileButton.IsEnabled = false;

#region Объявление переменных и присвоение значений

string fileName;

var chooseFileDialog = new OpenFileDialog();

chooseFileDialog.DefaultExt = ".xlsx";

chooseFileDialog.Filter = "Excel Files|*.xlsx;.xls";

chooseFileDialog.InitialDirectory = System.Windows.Forms.Application.StartupPath;

#endregion

#region Диалог выбора файла

var result = chooseFileDialog.ShowDialog();

if (result == System.Windows.Forms.DialogResult.OK)

{

fileName = chooseFileDialog.FileName;

fileNameTextBox.Text = fileName.Split('\\').Last();

findUsersGroupBox.IsEnabled = false;

#region Multi-метод

Task.Factory.StartNew(() =>

{= myAction.ReadIDsFromExcel(fileName, 1, onExcelOneRowRead);.Dispatcher.Invoke(() => intervalComboBox.IsEnabled = true);.Dispatcher.Invoke(() => FinishHourComboBox.IsEnabled = true);.Dispatcher.Invoke(() => FinishMinuteComboBox.IsEnabled = true);.Dispatcher.Invoke(() => fileNameSaveTextBox.IsEnabled = true);.Dispatcher.Invoke(() => startCollectingButton.IsEnabled = true);

});

#endregion

}

#endregion

}

private void startCollectingButton_Click(object sender, RoutedEventArgs e)

{

#region Объявление переменных и присвоение значений

DateTime startTime = new DateTime(((DateTime.Now.Ticks + TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - 1) / TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks) * TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks);

int minutesNow = int.Parse(DateTime.Now.ToShortTimeString().Split(':')[0]) * 60 + int.Parse(DateTime.Now.ToShortTimeString().Split(':')[1]);

int minutesStop = int.Parse(FinishHourComboBox.Text) * 60 + int.Parse(FinishMinuteComboBox.Text);

totalIterations = (minutesStop - minutesNow) / int.Parse(intervalComboBox.Text);

timeLeft = new TimeSpan(0, int.Parse(intervalComboBox.Text), 0);

#endregion

#region Создание счетчиков

dispatcherTimerEverySecond = new System.Windows.Threading.DispatcherTimer();

dispatcherTimerEverySecond.Tick += dispatcherTimerEverySecond_Tick;

dispatcherTimerEverySecond.Interval = new TimeSpan(0, 0, 1);

dispatcherTimerCheckOnlineStatuses = new System.Windows.Threading.DispatcherTimer();

dispatcherTimerCheckOnlineStatuses.Tick += dispatcherTimerCheckOnlineStatuses_Tick;

dispatcherTimerCheckOnlineStatuses.Interval = new TimeSpan(0, int.Parse(intervalComboBox.Text), 0);

#endregion

#region Измение характеристик ProgressBar'ов

overallProgressProgressBar.Maximum = totalIterations;

eachIterationProgressBar.Maximum = allUsersFromUniversity.Count;

eachIterationProgressBar.Value = 0;

#endregion

settingsGroupBox.IsEnabled = false;

myAction.CreateExcelWorkbook(fileNameSaveTextBox.Text);

#region Multi-метод

Task.Factory.StartNew(() =>

{

allUsersFromUniversity = myAction.GetOnlineStatus(currUser.Token, allUsersFromUniversity, onOneOlineStatusChecked, onAllOlineStatusesChecked);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Maximum = allUsersFromUniversity.Count);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = 0);

myAction.WriteOnlineStatusToExcel(allUsersFromUniversity, fileNameSaveTextBox.Dispatcher.Invoke(() => fileNameSaveTextBox.Text), startTime, true, onOneOnlineStatusWritten, onAllOnlineStatusesWritten);

iterationsDone += 1;

overallProgressProgressBar.Dispatcher.Invoke(() => overallProgressProgressBar.Value = iterationsDone);

if (totalIterations == iterationsDone)

onOnlineStatusesCheckFinished();

});

#endregion

dispatcherTimerEverySecond.Start();

dispatcherTimerCheckOnlineStatuses.Start();

}

#endregion

private void countryComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (countryComboBox.SelectedValue != null)

{

cityComboBox.ItemsSource = myAction.GetAllCities(currUser.Token, ((Country)countryComboBox.SelectedItem).id);

cityComboBox.DisplayMemberPath = "title";

cityComboBox.IsEnabled = true;

universityComboBox.ItemsSource = null;

progressBarTextBlock.Text = "Найдено факультетов: N/A.";

}

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null && universityComboBox.SelectedValue != null)

findUsersButton.IsEnabled = true;

else

findUsersButton.IsEnabled = false;

}

private void cityComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null)

{

universityComboBox.ItemsSource = myAction.GetAllUniversities(currUser.Token, ((Country)countryComboBox.SelectedItem).id, ((City)cityComboBox.SelectedItem).id);

universityComboBox.DisplayMemberPath = "title";

universityComboBox.IsEnabled = true;

progressBarTextBlock.Text = "Найдено факультетов: N/A.";

}

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null && universityComboBox.SelectedValue != null)

findUsersButton.IsEnabled = true;

else

findUsersButton.IsEnabled = false;

}

private void universityComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)

{

if (countryComboBox.SelectedValue != null && cityComboBox.SelectedValue != null && universityComboBox.SelectedValue != null)

{

List<Faculty> faculties = myAction.GetAllFaculties(currUser.Token, ((University)universityComboBox.SelectedItem).id);

progressBarTextBlock.Text = "Найдено факультетов: " + faculties.Count + ".";

findUsersButton.IsEnabled = true;

}

}

#endregion

#region Методы изменения Checkbox'ов

private void saveExcelCheckBox_Checked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

private void saveTextCheckBox_Checked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

private void saveExcelCheckBox_Unchecked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

private void saveTextCheckBox_Unchecked(object sender, RoutedEventArgs e)

{

if (saveExcelCheckBox.IsChecked.Value || saveTextCheckBox.IsChecked.Value)

saveUsersButton.IsEnabled = true;

else

saveUsersButton.IsEnabled = false;

}

#endregion

#region Методы для динамического обновления элементов (для мультизадачности)

public void onOneYearFacultyChecked()

{

double currentValue = findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value);

for (double i = currentValue; i <= currentValue + 1; i += 0.0005)

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = i);

}

public void onOneFacultyChecked(int checkedFaculties, int allFaculties)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Найдено факультетов: " + allFaculties + ". Проверено факультетов: " + checkedFaculties + " из " + allFaculties + ".");

}

public void onAllFacultiesChecked(int allFaculties, long allFoundUsers)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Проверены все факультеты выбранного ВУЗа. Найдено пользователей: " + allFoundUsers + ".");

saveExcelCheckBox.Dispatcher.Invoke(() => saveExcelCheckBox.IsEnabled = true);

saveTextCheckBox.Dispatcher.Invoke(() => saveTextCheckBox.IsEnabled = true);

findUsersButton.Dispatcher.Invoke(() => findUsersButton.IsEnabled = true);

countryComboBox.Dispatcher.Invoke(() => countryComboBox.IsEnabled = true);

cityComboBox.Dispatcher.Invoke(() => cityComboBox.IsEnabled = true);

universityComboBox.Dispatcher.Invoke(() => universityComboBox.IsEnabled = true);

allStudentsRadioButton.Dispatcher.Invoke(() => allStudentsRadioButton.IsEnabled = true);

currentlyStudyingRadioButton.Dispatcher.Invoke(() => currentlyStudyingRadioButton.IsEnabled = true);

}

public void onExcelOneStringWritten(long counter, long allStrings)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в Excel-файл. Записано файлов: " + counter + " из " + allStrings + ".");

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = counter);

}

public void onTextOneStringWritten(long counter, long allStrings)

{

progressBarTextBlock.Dispatcher.Invoke(() => progressBarTextBlock.Text = "Производится запись в текстовый файл. Записано файлов: " + counter + " из " + allStrings + ".");

findUsersProgressBar.Dispatcher.Invoke(() => findUsersProgressBar.Value = counter);

}

public void onFileFullyWritten(string excelPath, string textPath)

{

saveExcelCheckBox.Dispatcher.Invoke(() => saveExcelCheckBox.IsEnabled = true);

saveTextCheckBox.Dispatcher.Invoke(() => saveTextCheckBox.IsEnabled = true);

findUsersButton.Dispatcher.Invoke(() => findUsersButton.IsEnabled = true);

countryComboBox.Dispatcher.Invoke(() => countryComboBox.IsEnabled = true);

cityComboBox.Dispatcher.Invoke(() => cityComboBox.IsEnabled = true);

universityComboBox.Dispatcher.Invoke(() => universityComboBox.IsEnabled = true);

allStudentsRadioButton.Dispatcher.Invoke(() => allStudentsRadioButton.IsEnabled = true);

currentlyStudyingRadioButton.Dispatcher.Invoke(() => currentlyStudyingRadioButton.IsEnabled = true);

saveUsersButton.Dispatcher.Invoke(() => saveUsersButton.IsEnabled = true);

settingsGroupBox.Dispatcher.Invoke(() => settingsGroupBox.IsEnabled = true);

System.Windows.MessageBox.Show("Данные были записаны в файл(ы):" + Environment.NewLine + excelPath + Environment.NewLine + textPath, "Данные записаны");

}

public void onExcelOneRowRead(long allRows, long counter)

{

loadIDsProgressBar.Dispatcher.Invoke(() => loadIDsProgressBar.Maximum = allRows);

loadIDsProgressBar.Dispatcher.Invoke(() => loadIDsProgressBar.Value = counter);

}

public void onOneOlineStatusChecked(long counter, long allUsers)

{

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Проверено пользователей: " + counter + " из " + allUsers);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = counter);

}

public void onAllOlineStatusesChecked()

{

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Все пользователи проверены. Подготовка к записи");

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Maximum = 10);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.IsIndeterminate = true);

}

public void onOneOnlineStatusWritten(long counter, long allUsers)

{

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.IsIndeterminate = false);

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Записано данных в Excel: " + counter + " из " + allUsers);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = counter);

}

public void onAllOnlineStatusesWritten()

{

eachInerationTextBlock.Dispatcher.Invoke(() => eachInerationTextBlock.Text = "Все данные записаны в Excel");

}

public void onOnlineStatusesCheckFinished()

{

dispatcherTimerCheckOnlineStatuses.Stop();

dispatcherTimerEverySecond.Stop();

overallProgressTextBlock.Dispatcher.Invoke(() => overallProgressTextBlock.Text = "Все данные за " + DateTime.Now.ToShortDateString() + " собраны.");

settingsGroupBox.Dispatcher.Invoke(() => settingsGroupBox.IsEnabled = false);

checkOnlineStatusGroupBox.Dispatcher.Invoke(() => checkOnlineStatusGroupBox.IsEnabled = false);

}

#endregion

#region Остальные методы

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)

{

myAction.DeleteCookies();

}void dispatcherTimerEverySecond_Tick(object sender, EventArgs e)

{

timeLeft = timeLeft.Subtract(new TimeSpan(0, 0, 1));

overallProgressTextBlock.Text = "Собрано данных за " + DateTime.Now.ToShortDateString() + ": " + iterationsDone + " из " + totalIterations + ". Следующая итерация через: " + timeLeft.Minutes.ToString("00") + ":" + timeLeft.Seconds.ToString("00");

if (timeLeft == new TimeSpan(0,0,0))

timeLeft = new TimeSpan(0, int.Parse(intervalComboBox.Text), 0);

}

private void dispatcherTimerCheckOnlineStatuses_Tick(object sender, EventArgs e)

{

#region Объявление переменных и присвоение значений

DateTime startTime = new DateTime(((DateTime.Now.Ticks + TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - 1) / TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks) * TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks - TimeSpan.FromMinutes(int.Parse(intervalComboBox.Text)).Ticks);

eachIterationProgressBar.Maximum = allUsersFromUniversity.Count;

eachIterationProgressBar.Value = 0;

#endregion

#region Multi-метод

Task.Factory.StartNew(() =>

{

allUsersFromUniversity = myAction.GetOnlineStatus(currUser.Token, allUsersFromUniversity, onOneOlineStatusChecked, onAllOlineStatusesChecked);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Maximum = allUsersFromUniversity.Count);

eachIterationProgressBar.Dispatcher.Invoke(() => eachIterationProgressBar.Value = 0);

myAction.WriteOnlineStatusToExcel(allUsersFromUniversity, fileNameSaveTextBox.Dispatcher.Invoke(() => fileNameSaveTextBox.Text), startTime, true, onOneOnlineStatusWritten, onAllOnlineStatusesWritten);

iterationsDone += 1;

overallProgressProgressBar.Dispatcher.Invoke(() => overallProgressProgressBar.Value = iterationsDone);

if (totalIterations == iterationsDone)

onOnlineStatusesCheckFinished();

});

#endregion

}

#endregion

}

}

Приложение 2

Код приложения для получения расписания с сайта ВШЭ

from bs4 import BeautifulSoup

from openpyxl import Workbook

import os

from datetime import datetime

from selenium import webdriver

from urllib import request

#region Объявление переменных

faculties = []= []= os.path.expanduser('~') + '/Desktop/'

wb = Workbook()= wb.active

#endregion

driver = webdriver.Firefox()

#region Сбор списка факультетов

print(datetime.now().strftime('%H:%M:%S') + '. Собираю список факультетов')

driver.get('https://ba.hse.ru/')

soup = BeautifulSoup(driver.page_source, 'html.parser')

for faculty in soup.find('div', class_='msk events').find_all('p', class_='text'):

facultyName = faculty.find('a').text.strip()

facultyLink = faculty.find('a')['href']

faculties.append({

'facultyName': facultyName,

'facultyLink': facultyLink

})

#endregion

#region Сбор расписания

for faculty in faculties:

try:

driver.get(faculty['facultyLink'] + 'timetable')

soup = BeautifulSoup(driver.page_source, 'html.parser')

courses = soup.find('div', class_='main').find('div', class_='extra-left').find_all('p', class_='with-indent')[-1].find('select').find_all('option')

for course in courses:

courseNumber = course.text.split(' ')[0]

courseGroups = []

#region Сбор ID всех групп на курсу

for group in course['data-groups'].strip().split('\n'):

if len(group.strip()) > 1:

courseGroups.append({

'groupName': group.strip().split(',')[0].split('"')[1],

'groupID': group.strip().split(',')[1].split('"')[1]

})

#endregion

#region Сбор расписания для группы

for group in courseGroups:

print(datetime.now().strftime('%H:%M:%S') + '. Скачиваю расписание. Факультет: ' + faculty['facultyName'] + ' (' + str(faculties.index(faculty) + 1) + '/' + str(len(faculties)) + '). Курс: '+ str(courseNumber) + ' (' + str(courses.index(course) + 1) + '/' + str(len(courses)) + '). Группа: ' + group['groupName'] + ' (' + str(courseGroups.index(group) + 1) + '/' + str(len(courseGroups)) + ')')

link = faculty['facultyLink'] + 'timetable' + '?fromdate=2017.01.10&todate=2017.04.02&groupoid=' + group['groupID'] + '&receiverType=3&timetable-courses='+ courseNumber + '&timetable-groups=' + group['groupID'] + '&timetable-view-switcher=list'

driver.get(link)

soup = BeautifulSoup(driver.page_source, 'html.parser')

for day in soup.find_all('div', class_='tt-list__item'):

#region Сбор расписания для группы

try:

date = day.find('div', class_='extra-left').find('h4', class_='tt__title').text.strip()

for lesson in day.find_all('div', class_='pair'):

beginLesson = lesson.find('div', class_='pair__time').text.strip()

auditorium = 'Нет пар'

building = 'Нет пар'

discipline = 'Нет пар'

endLesson = 'Нет пар'

kindOfWork = 'Нет пар'

stream = 'Нет пар'

subGroup = 'Нет пар'

lecturer = 'Нет пар'

try:

for property in lesson.find('div', class_='pair__body').find('div', class_='pair__inner').find('div', class_='pair__lesson')['data-lesson-source'][1:-1].split(',"'):

if property.split(':')[0].replace('"', '') == 'auditorium':

auditorium = property.split(':')[1].replace('"', '')

if property.split(':')[0].replace('"', '') == 'beginLesson':

beginLesson = property.split(':')[1].replace('"', '') + ':' + property.split(':')[2].replace('"', '')

if property.split(':')[0].replace('"', '') == 'building':

building = property.split(':')[1].replace('"', '')

if property.split(':')[0].replace('"', '') == 'discipline':

discipline = property.split(':')[1].replace('"', '')

if property.split(':')[0].replace('"', '') == 'endLesson':

endLesson = property.split(':')[1].replace('"', '') + ':' + property.split(':')[2].replace('"', '')

if property.split(':')[0].replace('"', '') == 'kindOfWork':

kindOfWork = property.split(':')[1].replace('"', '')

if property.split(':')[0].replace('"', '') == 'subGroup':

subGroup = property.split(':')[1].replace('"', '')

if property.split(':')[0].replace('"', '') == 'lecturer':

lecturer = property.split(':')[1].replace('"', '')

except:

pass

allLessons.append({

'facultyName': faculty['facultyName'],

'courseNumber': courseNumber,

'groupName': group['groupName'],

'date': date,

'building': building,

'auditorium': auditorium,

'discipline': discipline,

'kindOfWork': kindOfWork,

'beginLesson': beginLesson,

'endLesson': endLesson,

'subGroup': subGroup,

'lecturer': lecturer,

'link': link

})

#endregion

#region Except, если у группы нет расписания

except:

date = 'Расписания в системе нет'

building = 'Расписания в системе нет'

auditorium = 'Расписания в системе нет'

discipline = 'Расписания в системе нет'

kindOfWork = 'Расписания в системе нет'

beginLesson = 'Расписания в системе нет'

endLesson = 'Расписания в системе нет'

stream = 'Расписания в системе нет'

subGroup = 'Расписания в системе нет'

lecturer = 'Расписания в системе нет'

allLessons.append({

'facultyName': faculty['facultyName'],

'courseNumber': courseNumber,

'groupName': group['groupName'],

'date': date,

'building': building,

'auditorium': auditorium,

'discipline': discipline,

'kindOfWork': kindOfWork,

'beginLesson': beginLesson,

'endLesson': endLesson,

'subGroup': subGroup,

'lecturer': lecturer,

'link': link

})

#endregion

pass

#endregion

pass

#region Except, если у факультета нет расписания

except:

courseNumber = 'У факультета нет расписания'

group = 'У факультета нет расписания'

date = 'У факультета нет расписания'

building = 'У факультета нет расписания'

auditorium = 'У факультета нет расписания'

discipline = 'У факультета нет расписания'

kindOfWork = 'У факультета нет расписания'

beginLesson = 'У факультета нет расписания'

endLesson = 'У факультета нет расписания'

stream = 'У факультета нет расписания'

subGroup = 'У факультета нет расписания'

link = 'У факультета нет расписания'

lecturer = 'У факультета нет расписания'

allLessons.append({

'facultyName': faculty['facultyName'],

'courseNumber': courseNumber,

'groupName': group,

'date': date,

'building': building,

'auditorium': auditorium,

'discipline': discipline,

'kindOfWork': kindOfWork,

'beginLesson': beginLesson,

'endLesson': endLesson,

'subGroup': subGroup,

'lecturer': lecturer,

'link': link

})

#endregion

pass

#endregion

driver.quit()

#region Запись данных в текстовый файл

for lesson in allLessons:

file.write(lesson['facultyName'] + '|' + lesson['courseNumber'] + '|' + lesson['groupName'] + '|' + lesson['date'] +

'|' + lesson['building'] + '|' + lesson['auditorium'] + '|' + lesson['discipline'] + '|' + lesson['lecturer'] +

'|' +lesson['kindOfWork'] + '|' + lesson['beginLesson'] + '|' + lesson['endLesson'] + '|' + lesson['subGroup'] +

'|' + lesson['link'] + '\n')

print(datetime.now().strftime('%H:%M:%S') + '. Завершено!')

#endregion

 

Приложение 3

Графики рассеивания

График рассеивания для факультета Бизнес-Информатики.

График рассеивания для факультета Востоковедения.

График рассеивания для факультета Государственного и муниципального управления.

График рассеивания для факультета Журналистики.

График рассеивания для факультета Логистики и управления цепями поставок.

График рассеивания для факультета Медиакоммуникаций.

График рассеивания для факультета Истории.

График рассеивания для факультета Международных отношений.

График рассеивания для факультета Мировой экономики.

График рассеивания для факультета Политологии.

График рассеивания для факультета Прикладной математики и информатики.

График рассеивания для факультета Прикладной инженерии.

График рассеивания для факультета Психологии.

График рассеивания для факультета Рекламы и связей с общественностью.

График рассеивания для факультета Социологии.

График рассеивания для факультета Филологии.

График рассеивания для факультета Философии.

График рассеивания для факультета Экономики.

График рассеивания для факультета Экономики и статистики.

График рассеивания для факультета Юриспруденции.

Похожие работы на - Определение наличия (и степени) зависимости академической успеваемости студентов от количества времени, проведенного ими в соцсети 'ВКонтакте'

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!