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

Рождение проекта ИИ

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

Кроме того, чтобы подчеркнуть важность данных, Эндрю Нг недавно провел конкурс под названием Конкурс ИИ, ориентированный на данные, целью которого является повышение точности исключительно за счет предоставления более качественных данных. Уделив достаточно внимания данным, давайте посмотрим, как мы можем создать собственный набор данных с помощью этих 5 простых шагов.

Веб-скрейпинг

Метод, который мы будем использовать для сбора данных, называется Web-Scraping.

Данные легко доступны на нескольких веб-сайтах, но не в загружаемом формате. Мы можем легко видеть данные, но не можем их использовать.

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

Web-Scraping — это метод автоматизации этого процесса сбора данных с помощью простого кода на Python. Благодаря этому мы сможем собирать данные с любого веб-сайта и сохранять их в формате CSV, который в дальнейшем можно использовать для обучения модели или анализа данных, и все это за несколько минут.

Тематическое исследование

Самый простой способ научиться — это понять на примерах, для этого мы возьмем тематическое исследование онлайн-преподавателей, таких как Coursera, Udemy, Sololearn и т. д. В нашем случае мы будем загружать данные из Class Central. Это поисковая система и веб-сайт обзоров бесплатных онлайн-курсов.

Мы будем использовать Selenium (для очистки файлов HTML и XML) и BeautifulSoup (для извлечения информации из этих файлов HTML).

Требования к программному обеспечению:

  1. Панды
  2. КрасивыйСуп
  3. Селен
  4. Нампи
  5. Матплотлиб
#Run the following lines of code to install above libraries.
---------------------------------------------------------------
!pip install pandas
!pip install beautifulsoup4
!pip install -U selenium
!pip install webdriver_manager --user
!pip install matplotlib
!pip install numpy

Как только эти библиотеки будут готовы, мы перейдем к извлечению HTML-кода с нашего веб-сайта с помощью Selenium, а bs4 поможет нам извлечь информацию из собранного HTML-кода.

Шаг 1. Сбор данных HTML

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.classcentral.com/subject/data-science')
content = driver.page_source
soup = BeautifulSoup(content)

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

Шаг 2. Отфильтруйте данные по необходимости

Создайте пустые списки, как показано ниже, для хранения информации о каждой категории.

title = []
provider = []
duration = []
rating = []
n_reviews = []
start_date = []

Чтобы получить информацию с любого веб-сайта с помощью BS4, нам нужно найти идентификаторы и имена классов каждого тега div/span/anchor. Для этого нажмите Ctrl + Shift + I или щелкните правой кнопкой мыши и выберите Проверить элемент.

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

«tlist» содержит весь HTML-код с фрагментами с выбранным выше именем класса. Мы используем BS4, чтобы удалить все пробелы и теги из этого списка, чтобы сохранить название курса.

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

Название курса

## Fetching all the titles of the given course
tlist = soup.findAll("span", attrs = {"class" : "text-1 weight-semi line-tight"})
title = []
for t in tlist:
    temp = BeautifulSoup(str(t),"lxml").text.replace('\n','')
    title.append(temp.strip())

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

Поставщик курса

## Fetching course provider
plist = soup.findAll("a", attrs = {"class" : "color-charcoal italic"})
provider = []
for p in plist:
    temp = BeautifulSoup(str(p),"lxml").text.replace('\n','')
    provider.append(temp.strip())

Продолжительность курса

## Fetching course duration
duration_list = soup.findAll("span", attrs = {"class" : "inline-block medium-up-hidden small-down-text-2 text-3 large-up-margin-left-xxsmall"})
duration = []
for d in duration_list:
    temp = BeautifulSoup(str(d),"lxml").text.replace('\n','').split()
    ftemp = ' '.join(temp)
    duration.append(ftemp)

Рейтинг курса

## Fetching course rating
rlist = soup.findAll("span", attrs = {"class" : "text-4 color-charcoal block"})
rating = []
for r in rlist:
    temp = BeautifulSoup(str(r),"lxml").text.replace('\n','')
    rating.append(temp.strip())

Количество отзывов на курс

## Fetching number of reviews per course
nrlist = soup.findAll("span", attrs = {"class" : "large-down-hidden block line-tight text-4 color-gray"})
n_reviews = []
for nr in nrlist:
    temp = BeautifulSoup(str(nr),"lxml").text
    if n_reviews is not None:
        n_reviews.append(temp.replace('\n','').strip().replace(" Reviews",""))
    else:
        n_reviews.append('-1')

Шаг 3: - Очистка набора данных

Теперь, когда все списки готовы, нам нужно взглянуть на один жизненно важный аспект предварительной обработки данных: в данных будет много значений NA/Null или мусорных значений, которые нам нужно отфильтровать.

В нашем случае, если мы напечатаем длину каждого из списков, мы обнаружим в них нерегулярность. В списках Rating и Num_Of_Reviews будет 49 записей, тогда как в остальных — 50. Со списками разной длины мы не можем подготовить фрейм данных.

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

## On checking the website you will find an error in the below course where some details are missing
for i in range(len(title)):
    if title[i] == 'Capstone Exam in Statistics and Data Science':
        print(str(i) + "th element is producing an error")
error = "Capstone Exam in Statistics and Data Science"
title.remove(error)

Мы получаем, что 40-й индекс относится к экзамену Capstone, мы также вытащим их из других списков.

Шаг 4. Подготовка фрейма данных

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

##Prepare a dataframe of the final collected data 
df = pd.DataFrame({'course' : title,
                   'NumOfReviews' : n_reviews, 'Rating' : rating,
                   'Duration' : duration, 'Provider' : provider})

Те, что слева, — это имена столбцов, а справа — список, представляющий столбец.

Чтобы использовать этот фрейм данных в будущем, нам нужно загрузить его и сохранить в виде CSV-файла. Используйте простую функцию to_csv для загрузки файла CSV.

df.to_csv('CourseAnalysis.csv')

Шаг 5. Анализ данных

Давайте выполним несколько простых аналитических операций с созданным нами фреймом данных.

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

df = pd.read_csv('CourseAnalysis.csv')
df.drop(['Unnamed: 0'],axis = 1,inplace = True)
df.head()

Как видите, продолжительность состоит из двух частей: часов и недель. Нам нужно поработать над этой колонкой.

Чтобы лучше представить данные, мы разделим этот столбец на два разных столбца: Часы и Недели. Мы выполняем разбиение с помощью ‘,’.

df[['Hours','Weeks']] = df.Duration.str.split(",",expand = True)
df.drop(['Duration','Weeks'],axis = 1,inplace = True)

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

df['Hours'] = df['Hours'].map(lambda x : x.strip('hours worth of material'))
df['Hours'] = df['Hours'].map(lambda x : x.strip('hours a week'))
df['Hours'] = df['Hours'].map(lambda x : x.strip('week long'))
df['Hours'] = df['Hours'].map(lambda x : x.strip('weeks long'))

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

  1. Найдите провайдера курсов с максимальным рейтингом

Группируем все рейтинги по названиям курсов и находим их сумму, для лучшего понимания построим график.

##Grouping the data frame
df2 = df[['Rating','Provider']]
df2 = df2.groupby('Provider').sum().reset_index()
##Plot the graph
plt.bar(df2['Provider'],df2['Rating'],color = 'Orange')
plt.xticks(rotation = 45)
plt.show()

У Coursera максимальные рейтинги среди всех, за которыми следует edX

2. Курс с максимальным количеством отзывов

Как и в приведенном выше случае, мы сгруппируем по количеству оценок и построим график для того же.

df3 = df[['NumOfReviews','Provider']]
df3 = df3.groupby('Provider').sum().reset_index()
plt.bar(df3['Provider'],df3['NumOfReviews'],color = 'Green')
plt.xticks(rotation = 45)
plt.show()
#COURSERA HAS THE HIGHEST REVIEWS OF ALL, FOLLOWED BY edX

Coursera также имеет самые высокие отзывы и рейтинги.

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

Заключение

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

Надеюсь, вам было весело учиться!…

Спасибо !…