Что такое веб-скрейпинг?

Оглавление

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

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

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

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

Некоторые случаи использования веб-скрепинга

Всемирная паутина появилась на свет в 1989 году, а web scraping и crawling вошли в разговор вскоре после этого, в 1993 году.

До появления скраппинга поисковые системы представляли собой компилированные списки ссылок, собранные администратором сайта и оформленные в длинный список ссылок где-нибудь на его сайте. Первый веб-скрепер и краулер, World Wide Web Wanderer, были созданы для отслеживания всех этих индексов и ссылок, чтобы попытаться определить, насколько велик Интернет.

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

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

Потратили слишком много на Amazon в этом месяце? Существуют сайты, которые сообщат вам об этом, причем в большинстве случаев они делают это с помощью веб-скреппинга, чтобы получить доступ к этой специфической информации от вашего имени.

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

Так как же это работает?

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

  1. Программе передается URL.
  2. Программа загружает ответ с URL.
  3. Программа обрабатывает загруженный файл в зависимости от требуемых данных.
  4. Программа начинает работу сначала с нового URL

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

Существует множество широко используемых, хорошо построенных библиотек для чтения и работы с загруженным HTML-ответом. В экосистеме Ruby стандартом для разбора HTML является Nokogiri. Для Python стандартом уже 15 лет является BeautifulSoup. Эти библиотеки предоставляют нам простые способы взаимодействия с HTML из наших собственных программ.

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

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

<table class="products">
  <tr class="product">...</tr>
  <tr class="product">...</tr>
</table>

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

Robots.txt

Хотя это и не является обязательным стандартом, но с самого начала развития веб-скреппинга было принято проверять наличие и содержимое файла robots.txt на каждом сайте перед тем, как начать скрести его содержимое. Этот файл может быть использован для определения правил включения и исключения, которым должны следовать веб-скреперы и краулеры при просмотре сайта. В качестве наглядного примера можно привести файл robots.txtFacebook: этот файл всегда находится по адресу /robots.txt, поэтому скреперы и краулеры всегда могут искать его в одном и том же месте. Кроме того, хорошими примерами являются файл robots.txt на сайте GitHub и файл robots.txt на сайте Twitter.

Пример файла robots.txt, запрещающего скретчинг и краулинг, выглядит следующим образом:
User-agent: *
Disallow: /

Раздел User-agent: * предназначен для всех веб-скреперов и краулеров. В Facebook, как мы видим, раздел User-agent является более явным и содержит разделы для Googlebot, Applebot, и других.

Строка

Disallow: / информирует скреперов и краулеров, которые следят за файлом robots.txt, о том, что им запрещено посещать любые страницы этого сайта. И наоборот, если бы в этой строке было написано Allow: /, то скреперам и краулерам было бы разрешено посещать любые страницы сайта.

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

Если вы работаете с веб-сайтом или платформой, важно знать, что этот файл не всегда уважается всеми веб-краулерами и скреперами. Крупные компании, такие как Google, Facebook и Twitter, соблюдают эти рекомендации при использовании своих краулеров и скреперов, но поскольку robots.txt считается лучшей практикой, а не обязательным стандартом, результаты от разных сторон могут быть разными. Важно также не раскрывать частную информацию, которая не должна стать достоянием общественности, например, панель администратора на сайте /admin или что-то в этом роде.

Простой пример

Для иллюстрации этого мы будем использовать Python плюс библиотеки BeautifulSoup и Requests.

import requests
from bs4 import BeautifulSoup

page = requests.get('https://google.com')
soup = BeautifulSoup(page.text, 'html.parser')

Пройдемся построчно:

page = requests.get('https://google.com')

Здесь используется библиотека requests для выполнения запроса к https://google.com и возврата ответа.

soup = BeautifulSoup(page.text, 'html.parser')

Библиотека requests присваивает текст нашего ответа атрибуту text, который мы используем для придания BeautifulSoup нашего HTML-содержимого. Мы также указываем BeautifulSoup использовать встроенный в Python 3 парсер HTML html.parser.

Теперь, когда BeautifulSoup разобрал наш HTML-текст на объекты, с которыми мы можем взаимодействовать, мы можем начать видеть, как можно извлекать информацию.

paragraphs = soup.find_all('p')

С помощью find_all мы можем указать BeautifulSoup на возврат только HTML-параграфов <p> из документа.

Если бы мы искали в HTML div с определенным идентификатором (#content), мы могли бы сделать это несколькими различными способами:

element = soup.select('#content')
# or
element = soup.find_all('div', id='content')
# or
element = soup.find(id='content')

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

links = soup.find_all('a', href=True)

Приведенный выше фрагмент вернет все элементы <a> из HTML, которые выступают в роли ссылок на другие страницы или сайты. Большинство крупных реализаций веб-скреппинга используют подобную функцию для перехвата локальных ссылок на странице, исходящих ссылок за ее пределами и определения приоритета для дальнейшей обработки ссылок.

Работа с HTML

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

Представьте, что наша HTML-страница содержит следующую таблицу, из которой мы хотим извлечь информацию о продукте:

NAME

CATEGORY

PRICE

Shirt Athletic $19.99
Jacket Outdoor $124.99

BeautifulSoup позволяет достаточно просто разбирать таблицы и другие сложные элементы. Рассмотрим, как можно прочитать строки таблицы на языке Python:

# Find all the HTML tables on the page
tables = soup.find_all('table')

# Loop through all of the tables
for table in tables:
	# Access the table's body
	table_body = table.find('tbody')
	# Grab the rows from the table body
	rows = table_body.find_all('tr')

	# Loop through the rows
	for row in rows:
    	    # Extract each HTML column from the row
    	    columns = row.find_all('td')

    	    # Loop through the columns
    	    for column in columns:
        	  # Print the column value
        	  print(column.text)

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

Обработка данных

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

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

  • Поисковое индексирование: Хотите хранить текстовое содержимое сайтов и легко осуществлять поиск? Для этого хорошо подходят Algolia и Elasticsearch.
  • Анализ текста: Хотите извлечь из текста людей, места, деньги и другие сущности? Возможно, вам подойдут spaCy или Google Natural Language API.
  • Карты и данные о местоположении: Если вы собрали некоторые адреса или ориентиры, вы можете использовать OpenStreetMap или MapBox для воплощения этих данных о местоположении в жизнь.
  • Push-уведомления: Если вы хотите получать текстовое сообщение, когда ваш веб-краулер находит определенный результат, обратитесь к Twilio или Pusher.

Последующие шаги

В этом посте мы познакомились с основами веб-скрепинга и рассмотрели несколько простейших примеров, которые помогли продемонстрировать, как мы можем взаимодействовать с HTML-страницами из собственного кода. Nokogiri из Ruby, BeautifulSoup из Python и Nightmare из JavaScript являются мощными инструментами для начала изучения веб-скрейпинга. Эти библиотеки относительно просты для начала работы, но предлагают мощные интерфейсы для расширения возможностей в более сложных случаях использования.

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

Вернуться на верх