Автор оригинала: FreeCodeCapm Team.
Vaibhav Gupta
В этом руководстве я буду использовать Python, чтобы соскрести данные из Google Summer of Code (GSOC) архив о участвующих организациях с 2009 года.
Моя мотивация за этим проектом
Хотя я прокрутил огромный список организаций, которые участвовали в GSOC’18, я понял, что изучение организации – это повторяющаяся задача – выберите один, исследуйте свои проекты, убедитесь, что если он участвовал в предыдущих годах или нет. Но есть 200+ организаций, и продвигается через них все займет много времени. Итак, будучи ленивым человеком, я решил использовать Python, чтобы облегчить мою работу
Требования
- Python (я буду использовать python3.6, потому что f-струны потрясающие?)
- Пипенв (для виртуальной среды)
- Запросы (для получения веб-страницы)
- Красивый суп 4 (для извлечения данных с веб-страниц)
Создание нашего скрипта
Это веб-страницы, которые мы собираемся соскребать:
- На 2009-2015 годы: Ссылка на сайт
- За 2015-2018 годы: Ссылка на сайт
Часть кодирования
Шаг 1: Настройка виртуальной среды и установка зависимостей
Виртуальский Может использоваться для создания виртуальной среды, но я бы порекомендовал использовать Пипенв потому что Он минимизирует работу и поддерживает Pipfile и Pipfile.lock Отказ
Сделайте новую папку и введите следующую серию команд в терминале:
pip install pipenv
Затем создайте виртуальную среду и установите все зависимости только с одной командой (Pipenv Rocks?):
pipenv install requests beautifulsoup4 --three
Вышеуказанная команда выполнит следующие задачи:
- Создайте виртуальную среду (для Python3).
- Установить Запросы и б eautifulsoup4.
- Создать
Pipfile
иPipfile.lock
в той же папке.
Теперь активируйте виртуальную среду:
pipenv shell
Обратите внимание на название папки до $
После активации, как это:
(gsoc19) $
Шаг 2: Скрепление данных на 2009-2015 годы
Откройте любой код кода и сделайте новый файл Python (я назову его 2009-2015.py
). Веб-страница содержит ссылки для списка организаций каждого года. Во-первых, напишите утилиту в отдельном файле Utils.py
который получит насильюю веб-страницы и поднимет Исключение
Если есть ошибка подключения.
Теперь получите ссылку веб-страницы, которая содержит список организаций на каждый год.
Для этого создайте функцию get_year_with_link
Отказ Перед записью функции нам нужно немного осмотреть эту веб-страницу. Щелкните правой кнопкой мыши любой год и нажмите на Проверять Отказ
Обратите внимание, что есть <
ul> tag, и внутри него, ther ER
E
CONTA
ins t; Тег с классом MDL-List__IT EM-первичный контент, внутри которого является наша ссылка и год. Кроме того, обратите внимание, что этот шаблон такой же для каждого года. Мы хотим схватить эти данные.Задачи, выполняемые этой функцией, находятся в этом порядке:
- Получить
Main_page
Поднимите исключение, если есть ошибка подключения. - Если код ответа является
200 ОК
Разбейте избранную веб-страницу с красивыми. И если код ответа – что-то еще, выйдите из программы. - Найти все
<
Li> Теги сКласс MDL-List__ ITem MDL-List__ITem - на
E-line и хранить возвращенные Liул в ye
ARS_LI. - Инициализировать пустую
jady_dict
Словарь. - Начните итерацию по
годы_ли
список. - Получить текст год (2009, 2010, 2011, …), удалить все
\ N
и храните его вГод
Отказ - Получите относительную ссылку каждого года (//archive/gsoc/2015,/archive/gsoc/2016, …) и храните его в
Relatent_Link
Отказ - Конвертировать
Relatent_Link
в полную ссылку, сочетая ее сHome_page
Ссылка и храните его вfull_link
Отказ - Добавьте эти данные в
ж/dict
Словарь с годом как ключ иfull_link
как его ценность. - Повторите это на все годы.
Это даст нам словарь с годами в качестве клавиш и их ссылки в качестве значений в этом формате:
{ ... '2009': 'https://www.google-melange.com/archive/gsoc/2009', '2010': 'https://www.google-melange.com/archive/gsoc/2010', ...}
Теперь мы хотим посетить эти ссылки и получить имя каждой организации со своими ссылками с этих страниц. Щелкните правой кнопкой мыши любое имя ORG и нажмите Проверять Отказ
Обратите внимание, что есть <
ul> метка с Класс MD
l-list, whic H HA
S
С классом MDL-List__ ITem MDL-List__ite
М – одна строка. Внутри каждого TH
ERE тег, который имеет ссылку и имя организации. Мы хотим схватить это. Для этого давайте создадим Другая функция get_organizatio
NS_LIST_WITH_LINKS, которые принимают ссылки на веб-страницы, которые содержат список организаций для каждого года (wh ichic мы выскабливаем
get_year_with_link).Задачи, выполняемые этой функцией, находятся в этом порядке:
- Получите страницу списка ORG, ( https://www.google-melange.com/archive/gsoc/2015 , https://www.google-melange.com/archive/gsoc/201 6, ….) Поднимите исключение, если есть ошибка соединения.
- Если код ответа является
200 ОК
Разбейте избранную веб-страницу с красивыми. И если код ответа – что-то еще, выйдите из программы. - Найти все
<
Li> Теги сКласс MDL-List__ ITem MDL-List__ITem - на
E-line и хранить возвращенные LiST в O
RGS_LI. - Инициализировать пустую
orgs_dict
Словарь. - Начните итерацию по
orgs_li
список. - Получите имя ORG, удалите все
\ N
и храните его вorg_name
Отказ - Получите относительную ссылку каждого ORG (/Archive/GSOC/2015/ORGS/N52/Archive/GSOC/2015/ORGS/Beagleboard, …) И храните его в
Relatent_Link
Отказ - Конвертировать
Relatent_Link
в полную ссылку, сочетая ее сHome_page
Ссылка и храните его вfull_link
Отказ - Добавьте эти данные в
orgs_dict
сorg_name
как ключ иfull_link
как его ценность. - Повторите это для всех организаций на определенный год.
Это даст нам словарь с именами организаций как ключи и их ссылки в качестве ценностей, как это:
{ ... 'ASCEND': 'https://www.google-melange.com/archive/gsoc/2015/orgs/ascend',
'Apache Software Foundation': 'https://www.google-melange.com/archive/gsoc/2015/orgs/apache', ...}
Перемещение вперед, мы хотим посетить эти ссылки и получить название, описание и связь каждого проекта каждого ORG для каждого года (?). Щелкните правой кнопкой мыши на заголовке любого проекта и нажмите I охватывать.
Опять же, та же рисунок. Есть <
ul> метка с Класс MD
l-list, который содержит S-й
E
С классом MDL-List__ ITem MDL-List__ite
м – две линии, внутри которой Там
Whi
CH содержит тег , содержащий наш проект название.
Кроме того, есть n Теги с
Класс MDL-List__ITEM-подпункта, содержащий описание проекта Отказ Для этого создайте
Функция get_org_projects_info, чтобы выполнить эту задачу.Задачи, выполняемые этой функцией, находятся в этом порядке:
- Получите страницу описания ORG, ( https://www.google-melange.com/archive/gsoc/2015/orgs/archive/gsoc/2015/orgs://www.google-melange.com/archive/gsoc/2015/orgs/apache , ….), Поднимите исключение, если есть ошибка подключения. Если код ответа является 200 ОК
- Разбейте избранную веб-страницу с красивыми. И если код ответа – что-то еще, выйдите из программы.
Найти все
< - Li> Теги с классом повыше
AL в MDL-List__ITem MDL-List__ITem - TW
O-Line и хранить возвращенные LiST в Proje
cts_li.Инициализировать пустую
projects_info - список.
Начните итерацию по
projects_li - список.
Инициализировать пустой словарь
proj_info - в каждой петле.
Получите заголовок проекта, удалите все
\ N - и храните его в
proj_title
ОтказПолучите относительную ссылку каждого проекта (
https://www.google-melange.com/archive/gsoc/2015/orgs/apache/projects/djkevincr.html - , ….) И храните его в proj_relative_link Отказ
Конвертировать
proj_relative_link - в полную ссылку, сочетая ее с
Home_page
Ссылка и храните его вproj_full_link
ОтказХраните название проекта, описание и ссылку в
proj_info - Словарь и добавить этот словарь на
projects_info
список.
Это даст нам список, содержащий словари с данными проекта.
[ ... { 'title': 'Project Title 1', 'description': 'Project Description 1', 'link': 'http://project-1-link.com/', }, { 'title': 'Project Title 2', 'description': 'Project Description 2', 'link': 'http://project-2-link.com/', } ...]
Шаг 3: Реализация основной функции
Давайте сначала посмотрим код:
Задачи, выполняемые этой функцией, находятся в этом порядке:
- Мы хотим иметь
Final_dict
словарь, чтобы мы могли сохранить его как.json
файл. - Тогда мы называем нашу функцию
get_year_with_link ()
, который вернет словарь с годами в качестве клавиш и ссылки на список организаций как ценности и хранить его вjug_with_link
Отказ - Мы переиграем над словаре
jug_with_link
Отказ - За каждый год мы называем функцию
get_organizations_list_with_links ()
С помощью ссылки для него в качестве параметра, которая вернет словарь с именем организаций в качестве клавиш и ссылки на веб-страницу, содержащую информацию о них в качестве значений. Мы храним возвращаемая стоимость вFinal_dict
, сГод
как ключи. - Затем мы переживаем каждый огрупп каждый год.
- Для каждого ORG мы называем функцию
get_org_projects_info ()
Со ссылкой на ORG в качестве параметра, который вернет список словарей, содержащих информацию о каждой проекте. - Мы храним эти данные в
Final_dict
Отказ - После окончания цикла у нас будет
Final_dict
Словарь следующим образом:
{ "2009": { "Org 1": [ { "title": "Project - 1", "description": "Project-1-Description", "link": "http://project-1-link.com/" }, { "title": "Project - 2", "description": "Project-2-Description", "link": "http://project-2-link.com/" } ], "Org 2": [ { "title": "Project - 1", "description": "Project-1-Description", "link": "http://project-1-link.com/" }, { "title": "Project - 2", "description": "Project-2-Description", "link": "http://project-2-link.com/" } ] }, "2010": { ... }}
9. Тогда мы сохраним его как JSON
файл с json.dumps
.? ?
Следующие шаги
Данные за 2016-2018 годы могут быть соскрешены аналогичным образом. А затем Python (или любой подходящий язык) можно использовать для анализа данных. Или веб-приложение может быть сделано. На самом деле, я уже сделал мою версию WebApp, используя Джанго , Django Rest Framework и Rectjs Отказ Вот ссылка на то же самое: https://gsoc-data-analyzer.netlify.com/
Улучшения
Время работы скрипта может быть улучшено с помощью многопотативного. В настоящее время он выбирает одну ссылку одновременно, его можно сделать, чтобы привлечь несколько ссылок одновременно.
Обо мне
Всем привет.
Я Вайбхав Гупта студенческий студент в Индийский институт информационных технологий, Лакхнау Отказ Я люблю python и js.
Смотри мой портфель Или найди меня на Facebook , LinkedIn или Github Отказ