Автор: Джо Уилсон, энтузиаст науки о данных и машинного обучения.

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

Хорошо, допустим, вы хотите купить товар на веб-сайте. Вы ввели название предмета и бац, вам будут предложены другие предметы. Возьмем другой сценарий: вы смотрели фильм на Netflix, и бац, вам предлагаются другие фильмы на основе фильма, который вы ранее смотрели. Звучит знакомо? Это не магия! Предложения сделаны с использованием системы рекомендаций машинного обучения, работающей в бэкэнде веб-сайта, который вы просматриваете, или Netflix, к которому вы обращаетесь.

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

Прежде чем идти дальше, позвольте объяснить несколько вещей:

Система рекомендаций используется для прогнозирования продуктов, которые могут заинтересовать пользователя (клиента), на основе явных и неявных данных, полученных от пользователя. Явные данные предоставляются пользователями (например, оценка продукта). Но проблема со сбором явных данных заключается в том, что не многие клиенты оценивают продукт после его использования (как часто вы оцениваете фильм на Netflix или продукт после заказа на Amazon?). Неявные данные собираются на основе наблюдения за поведением пользователей, например, затраченным временем на просмотр определенного элемента или добавление элемента в закладки. Цель сбора неявных данных — сделать вывод на основе наблюдаемого поведения пользователя и предсказать рейтинг, который пользователь присвоит элементу.

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

Это руководство (Часть 1) посвящено веб-скрапингу для сбора данных, давайте сразу к этому. Во второй части руководства мы подробно рассмотрим различные виды рекомендательных систем, включая концепции, применяемые при создании рекомендательной системы на основе машинного обучения.

Данные, используемые для всего руководства, были собраны с веб-сайта Whiskey Exchange. На сайте Whisky Exchange (см. рисунок ниже) есть сорта виски. Для этого урока данные взяты с 6 страниц японского виски с www.thewhiskeyexchange.com.

Из японского раздела веб-сайта извлечено 6 функций:

  1. Название виски
  2. Цена
  3. Бренд
  4. Рейтинг
  5. О (Описание)
  6. Отзыв клиента

Данные были взяты с веб-сайта, записаны и сохранены в файл с разделителями-запятыми (CSV) с использованием кодов Python в Jupyter Notebook. Изучение того, как записывать данные в CSV-файл на python, является важной вещью, которую нужно знать, особенно для задач веб-скрейпинга. См. приведенные ниже коды для извлечения данных и их сохранения в файл CSV.

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

# Импорт ключевых библиотек
из bs4 import BeautifulSoup
import request
import pandas as pd
import csv
import matplotlib.pyplot as plt
%matplotlib inline

Теперь, когда библиотеки загружены, пришло время написать коды Python для очистки данных с www.whiskeyexchange.com и записи данных в файл CSV.

baseurl = «https://www.thewhiskyexchange.com'

headers = {‘User-Agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 11_5) AppleWebKit/537.36 (KHTML, например Gecko) Chrome/92.0.4515.107 Safari/537.36’}

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

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

  1. Если вы используете мышь, щелкните правой кнопкой мыши страницу, для которой вы хотите собрать данные, и прокрутите вниз, чтобы проверить.
  2. Обратите особое внимание на такие вещи, как «href», «div», «class» и т. д. (обратите внимание на них и в предоставленных кодах). Есть много ресурсов, подробно объясняющих, что означает каждая из этих вещей.
  3. Вы должны увидеть что-то вроде изображения ниже (при проверке веб-страницы). Вы можете применить эту концепцию на любом веб-сайте, который вам интересен.

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

productlinks = []
t={}
data=[]
c=0

См. остальные полные коды для задачи парсинга веб-страниц:

для x в диапазоне (1,6):
k = request.get('https://www.thewhiskyexchange.com/c/35/japanese-whisky?pg={}&psize=24&sort=pasc' .format(x)).text
soap=BeautifulSoup(k,'html.parser')
csv_file = open('JapaneseWhisky_9.csv', 'w')
csv_writer = csv .writer(csv_file)
csv_writer.writerow(['название','цена','бренд','рейтинг','о','отзыв'])
productlist = суп.найти_все(“ li», {класс: продукт-сетка__элемент})

для продукта в списке продуктов:
link = product.find("a",{"class":"product-card"}).get('href')
productlinks.append(baseurl + ссылка)

для ссылки в productlinks:
f = request.get(link,headers=headers).text
soap=BeautifulSoup(f,’html.parser’)

попробуйте:
price=soup.find("p",{"class":"product-action__price"}).text.replace('\n',"")
за исключением:
цена = 'нет цены'

попробуйте:
about=soup.find("div",{"class":"product main__description"}).text.replace('\n',"")
за исключением:
about='нет цены'

try:
rating = суп.найти("div",{"класс":"обзор-обзор"}).text.replace('\n',"")
кроме:
рейтинг='нет рейтинга'

попробуйте:
name=soup.find("h1",{"класс":"product-main__name"}).text.replace('\n',"")
за исключением:
name='no name'

try:
review = soap.find("p", {"class":"review-list__copy"}).text.replace('\ n', "")
кроме:
review='no review'
try:
brand = soap.find("ul",{"class":"product- main__meta”}).text.replace('\n'”,””)
кроме:
brand='no brand'

виски = {"название":название",цена":цена",бренд":марка",рейтинг":рейтинг",о нас":о нас",обзор":обзор"}

data.append(виски)
c=c+1
print(“завершено”,c)
csv_writer.writerow([название, цена, бренд, рейтинг, о, отзыв])

csv_file.close()

Есть две основные (хотя каждая строка кода что-то делает) вещи, которые произошли в приведенных выше кодах.

  1. Данные, удаленные с веб-сайта, хранятся в файле под названием «данные».
  2. Данные, удаленные с веб-сайта, хранятся в файле CSV на вашем локальном устройстве (если вы запустите код) с пометкой «JapaneseWhisky_9.csv».

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

df = pd.DataFrame(данные)

Вы также можете загрузить файл CSV (JapaneseWhisky_9.csv) во фрейм данных pandas, используя следующую строку кода:

df = pd.read_csv('JapaneseWhisky_9.csv')

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

дф.голова(15)

Вы должны увидеть что-то похожее на картинку ниже.

Вот как вы собираете данные с веб-сайта. Часть 2 руководства будет посвящена выполнению некоторого исследовательского анализа данных (EDA), применению некоторых концепций обработки естественного языка (NLP) перед созданием фактической системы рекомендаций. Я надеюсь, что это было полезно, особенно для тех, кто совершенно не знаком с веб-скрапингом.