Если данные - это новая нефть, то веб-скребок - это новый гидроразрыв.

Вступление

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

Эта цепочка поставок начинается с получения данных из заданного источника. На сегодняшний день самым крупным источником данных для получения данных будет Интернет. По последним подсчетам, общий размер Интернета в 2020 году составил «40 зеттабайт . Куча нулей!

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



Получение всех необходимых инструментов

Есть много способов сбора данных с веб-сайтов, но в этой статье мы будем использовать Python. Python - очень популярный язык программирования, в котором доступно множество библиотек, которые могут быть очень полезны для просмотра веб-страниц. В этой статье используются следующие библиотеки: BeautifulSoup, запросы, json и re.

Единственная библиотека, которая, вероятно, не включена в вашу среду Python по умолчанию, - это BeautifulSoup. Если вы хотите добавить эту библиотеку в свою среду, просто используйте установщик пакетов Python (он же pip). Если вы используете PyCharm (или любую другую IDE), следуйте их инструкциям по установке пакетов.

pip install beautifulsoup4

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

from bs4 import BeautifulSoup
import requests, json, re
url = "https://medium.com/analytics-vidhya/do-you-need-to-know-math-for-machine-learning-d51f0206f7e4"
page = requests.get(url)
soup = BeautifulSoup(page.content, 'html.parser')

Получение данных

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

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

То же самое и для статей среднего размера. После некоторой работы и поиска я обнаружил, что носитель сохраняет свои данные в строке json в верхней части кода между html-тегами <script data-rh="true" type="application/ld+json"> и </script>.

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

def get_json(soup):
    index_1 = soup.find('<script data-rh="true" type="application/ld+json">')
    index_2 = soup.find('</script>', index_1)
    json_string = soup[index_1 + 50:index_2]
    return json.loads(json_string)
soup = str(soup) # required to use string functions
json = get_json(soup)
for item, value in json.items():
    print(item, value, sep=' = ', end='\n\n')

Это выводит все метаданные, которые среда предоставляет в этом json (а это много!).

@context = http://schema.org

@type = NewsArticle

image = ['https://i2.wp.com/miro.medium.com/max/1200/1*IHv0J-i2WvawIxU9MEAe8Q.png']

url = https://medium.com/analytics-vidhya/do-you-need-to-know-math-for-machine-learning-d51f0206f7e4

dateCreated = 2021-04-06T15:25:58.210Z

datePublished = 2021-04-06T15:25:58.210Z

dateModified = 2021-04-06T18:36:25.041Z

headline = Do You Need to Know Math for Machine Learning? - Analytics Vidhya - Medium

name = Do You Need to Know Math for Machine Learning? - Analytics Vidhya - Medium

description = Machine learning has become a popular field in the tech industry. Nowadays almost the exclusive majority of computer science related studies have a machine learning course in their curriculum. Most…

identifier = d51f0206f7e4

keywords = ['Lite:true', 'Tag:Machine Learning', 'Tag:Computer Science', 'Tag:Programming', 'Tag:Python', 'Tag:Math', 'Publication:analytics-vidhya', 'Elevated:false', 'LockedPostSource:LOCKED_POST_SOURCE_UGC', 'LayerCake:3']

author = {'@type': 'Person', 'name': 'Timo Kats', 'url': 'https://timokats.medium.com'}

creator = ['Timo Kats']

publisher = {'@type': 'Organization', 'name': 'Analytics Vidhya', 'url': 'https://medium.com/analytics-vidhya', 'logo': {'@type': 'ImageObject', 'width': 208, 'height': 60, 'url': 'https://i2.wp.com/miro.medium.com/max/416/1*66g0UGKgu4oopIC0ahQuXw.png'}}

mainEntityOfPage = https://medium.com/analytics-vidhya/do-you-need-to-know-math-for-machine-learning-d51f0206f7e4

isAccessibleForFree = False

Форматирование данных

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

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

selected_fields = ['identifier', 'datePublished', 'name', 'creator', 'publisher']
data = {}
for field in selected_fields:
    if field == 'creator':
        data[field] = json[field][0]
    elif field == 'publisher':
        data[field] = json[field]['name']
    else:
        data[field] = json[field]

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

csv = open('medium_article.csv', 'a', encoding='utf-8')
for key in data.keys():
    csv.write(key + ',')
csv.write('\n')
for value in data.values():
    csv.write(value + ',')

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

Заключительные слова

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