Что такое веб-скрейпинг?
Оглавление
- Введение в веб-скрейпинг
- Некоторые примеры использования веб-скрейпинга
- Как это работает
- Robots.txt
- Простой пример
- Работа с HTML
- Обработка данных
- Дальнейшие шаги
Введение в веб-скрейпинг
Проще говоря, веб-скрепинг - это один из инструментов, используемых разработчиками для сбора и анализа информации из Интернета.
Некоторые сайты и платформы предлагают интерфейсы прикладного программирования (API), которые мы можем использовать для структурированного доступа к информации, но другие могут этого не делать. Если API, безусловно, становятся стандартным способом взаимодействия с популярными платформами, то при работе с большинством сайтов в Интернете мы не всегда имеем такую возможность.
Вместо того чтобы считывать данные из стандартных ответов API, нам придется искать их самостоятельно, читая страницы и ленты сайта.
Некоторые случаи использования веб-скрепинга
Всемирная паутина появилась на свет в 1989 году, а web scraping и crawling вошли в разговор вскоре после этого, в 1993 году.
До появления скраппинга поисковые системы представляли собой компилированные списки ссылок, собранные администратором сайта и оформленные в длинный список ссылок где-нибудь на его сайте. Первый веб-скрепер и краулер, World Wide Web Wanderer, были созданы для отслеживания всех этих индексов и ссылок, чтобы попытаться определить, насколько велик Интернет.
Вскоре после этого разработчики начали использовать краулеры и скреперы для создания поисковых систем на основе краулеров, не требующих участия человека. Эти краулеры просто переходили по ссылкам, которые встречались на каждой странице, и сохраняли информацию о ней. Поскольку Интернет - это совместная работа, краулер мог бы легко и бесконечно переходить по встроенным ссылкам на сайтах на другие платформы, и этот процесс продолжался бы бесконечно.
В настоящее время веб-скреппинг имеет место практически в каждой отрасли. В новостных редакциях веб-скреперы используются для сбора информации и тенденций с тысяч различных интернет-платформ в режиме реального времени.
Потратили слишком много на Amazon в этом месяце? Существуют сайты, которые сообщат вам об этом, причем в большинстве случаев они делают это с помощью веб-скреппинга, чтобы получить доступ к этой специфической информации от вашего имени.
Компании, занимающиеся машинным обучением и искусственным интеллектом, просматривают миллиарды сообщений в социальных сетях, чтобы лучше узнать, как мы общаемся в Интернете.
Так как же это работает?
Процесс, который разработчик строит для веб-скрепинга, очень похож на процесс, который пользователь выполняет с помощью браузера:
- Программе передается URL.
- Программа загружает ответ с URL.
- Программа обрабатывает загруженный файл в зависимости от требуемых данных.
- Программа начинает работу сначала с нового 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 на всех посещаемых вами сайтах, изучать его структуру и понимать, как перемещаться по его элементам с помощью веб-скрепера.
Вернуться на верх