Интернет является крупнейшим источником данных в мире. Такие компании, как Google, Facebook и Amazon, построили многомиллиардный бизнес, собирая и анализируя веб-данные. Имея более 4.5 миллиардов проиндексированных веб-страниц, сеть содержит бесконечное количество общедоступных данных по всем мыслимым темам. Веб-скрапинг позволяет извлекать эти наборы данных в структурированный формат для дальнейшего анализа.
В этом подробном руководстве вы узнаете, как использовать R и rvest для извлечения ключевых данных с веб-страниц в анализируемые фреймы данных.
Растущая важность данных, извлеченных из Интернета
За последнее десятилетие парсинг веб-страниц получил массовое распространение. Вот некоторые статистические данные, которые демонстрируют его рост:
- По данным Parsehub, 76% организаций полагаются на данные, полученные из Интернета, для бизнес-аналитики.
- По прогнозам Mordor Intelligence, рынок веб-скрапинга будет расти более чем на 20% в год и достигнет 4 миллиардов долларов США к 2026 году.
- По данным Parsehub, 36% компаний используют веб-данные для мониторинга цен, 29% для исследования рынка и 23% для привлечения потенциальных клиентов.
Причин такого роста несколько:
- Экспоненциальный рост веб-страниц: Согласно данным Internet Live Stats, сегодня существует более 1.7 миллиарда веб-сайтов. Объем информации в Интернете растет в геометрической прогрессии.
- Потребность в неструктурированных наборах данных: Большая часть данных в сети представляет собой неструктурированный текст, изображения, видео и другие мультимедийные форматы. Эти данные имеют огромную аналитическую ценность, если их правильно извлечь и обработать.
- Статистика в реальном времени: Интернет предоставляет актуальные данные. Статические наборы данных быстро устаревают. Веб-скрапинг обеспечивает доступ к данным в реальном времени.
- Обзор объектов на 360 градусов: Объединив данные с нескольких сайтов, парсинг веб-страниц может создать комплексное представление о продуктах, компаниях, отраслях и многом другом.
Давайте посмотрим на несколько примеров того, как организации используют данные, полученные из Интернета:
Кейсы | Источники данных |
---|---|
Оптимизация ценообразования | Списаны цены на продукцию конкурентов с сайтов электронной коммерции. |
Рынок калибровочный | Собирайте новости отрасли, пресс-релизы, списки вакансий на отраслевых сайтах. |
Лидогенерация | Извлекайте информацию о деловых контактах из каталогов и сайтов компаний. |
SEO мониторинг | Отслеживайте позиции ключевых слов в результатах Google |
Социальный мониторинг СМИ | Анализируйте упоминания брендов, тенденции из Twitter, Reddit, Facebook. |
Исследования товаров | Очистите обзоры и рейтинги Amazon для анализа настроений |
Эти данные помогают выявить идеи для создания конкурентных преимуществ. Потенциальные варианты использования безграничны.
Теперь, когда мы поняли, почему веб-данные так ценны, давайте посмотрим, как извлечь их с помощью R и rvest.
Обзор библиотек веб-скрапинга в R
В то время как Python доминирует в парсинге веб-страниц, R также предоставляет надежные возможности благодаря своей сильной экосистеме пакетов для анализа данных:
Rvest – Самый популярный пакет веб-скрапинга R, вдохновленный Python BeautifulSoup. Предоставляет простые API-интерфейсы очистки.
RSселениум – Автоматизация браузера для очистки сложных сайтов JavaScript.
XML2 – Анализатор XML низкого уровня, используемый внутри компании rvest.
httr – Предоставляет удобный интерфейс R для создания HTTP-запросов и обработки прокси.
Rcrawler – Фреймворк для написания рабочих процессов парсинга более высокого уровня.
Соскребание – Вспомогательные функции для очистки и структурирования очищенных данных.
Для большинства случаев использования rvest и RSelenium будет достаточно. Давайте сначала рассмотрим rvest для парсинга статических страниц.
Начало работы с rvest
rvest предоставляет простой селектор CSS и интерфейсы XPath для очистки HTML и XML. Давайте рассмотрим практический пример.
Сначала нам нужно установить rvest и httr:
install.packages("rvest")
install.packages("httr")
Теперь загрузим библиотеки:
library(rvest)
library(httr)
Отправка GET-запросов
Чтобы получить страницу, мы используем read_html()
функция:
url <- "http://webcode.me"
page <- read_html(url)
Это отправляет запрос GET на URL-адрес и возвращает html_document
объект, содержащий проанализированный HTML-код.
Чтобы использовать прокси, установите его в httr:
# Set proxy
set_config(use_proxy(url="http://192.168.0.1:8080"))
page <- read_html(url)
rvest не имеет встроенной обработки тайм-аутов. Для таймаутов используйте httr GET()
функция, которая принимает timeout()
Параметр:
page <- GET(url, timeout(10)) %>% read_html()
Извлечение HTML-элементов
Для извлечения элементов используйте команду html_elements()
функция. Передайте ему селекторы CSS или выражения XPath:
# CSS Selector
titles <- page %>%
html_elements(css = ".post h2")
# XPath
author <- page %>%
html_elements(xpath="//span[@class=‘author‘]")
Извлеките атрибуты с помощью html_attr()
и текст с html_text()
:
# Extract href attribute
link <- links[1]
href <- link %>% html_attr("href")
# Extract text
text <- link %>% html_text()
Для табличных данных используйте html_table()
:
tables <- page %>%
html_elements(css = "table")
df <- tables[[1]] %>%
html_table()
Это обеспечивает быстрый способ преобразования таблиц HTML в анализируемые фреймы данных.
Обработка сайтов с разбивкой на страницы
Для сайтов, которые используют нумерацию страниц или кнопки «Загрузить больше», извлеките URL-адреса из элементов навигации и пройдите по ним:
# Get list of links
urls <- page %>%
html_elements(css="ul.pagination li a") %>%
html_attr("href")
# Iterate over URLs
results <- map(urls, function(url) {
pg <- read_html(url)
# Extract data
titles <- pg %>%
html_elements(css="h2") %>%
html_text()
return(titles)
}) %>% flatten()
Это позволяет парсить такие сайты, как Википедия, с несколькими страницами контента.
Работа с API
Многие сайты предоставляют данные через API JSON, которые можно очистить.
Давайте возьмем данные о продукте из примера API:
# Read API response
api_url <- "https://example.com/products"
prod_data <- jsonlite::fromJSON(api_url)
# Extract fields
prices <- prod_data$prices
product_ids <- prod_data$product_ids
Пакет jsonlite помогает анализировать JSON в списки R и фреймы данных.
Парсинг JavaScript-сайтов с помощью RSelenium
Для сайтов, созданных на JavaScript, RSelenium предоставляет платформу автоматизации браузера на основе Selenium.
Давайте посмотрим, как получить данные с динамического сайта JavaScript.
Сначала установите RSelenium:
install.packages("RSelenium")
Теперь запустите экземпляр браузера:
# Launch headless browser
library(RSelenium)
driver <- rsDriver(browser = "chrome", headless = TRUE)
remDr <- driver[["client"]]
# Navigate
remDr$navigate("https://dynamicpage.com")
При этом запускается экземпляр браузера Chrome, управляемый Selenium. Набор headless = TRUE
чтобы скрыть окно браузера.
Как и в случае с rvest, для поиска элементов мы используем CSS-селекторы и xpath:
# CSS
titles <- remDr$findElements("css", "h2.title")
# XPath
ratings <- remDr$findElements("xpath", "//span[@class=‘rating‘]")
Извлеките атрибуты и текст соответственно:
# Get text
title_text <- titles[[1]]$getElementText()
# Get attribute
author <- articles[[1]]$getElementAttribute("data-author")
Наконец, как только данные будут извлечены, экспортируйте их:
# Construct data frame
pages_df <- data.frame(
title = title_text,
rating = rating_text
)
# Export to CSV
write.csv(pages_df, "data.csv")
Это позволяет парсить сложные сайты, созданные с помощью таких фреймворков, как Angular, React и Vue.js.
Советы по эффективному парсингу веб-страниц
Вот несколько советов, как эффективно парсить и избегать проблем:
- Добавить задержки – Не отправляйте запросы слишком быстро, чтобы избежать блокировки. Добавьте задержки в 5-10 секунд между страницами.
- Рандомизировать пользовательские агенты – Меняйте строки пользовательского агента, чтобы запросы выглядели более органично.
- Проверьте robots.txt – Избегайте очистки страниц, заблокированных в файле robots.txt сайта.
- Используйте прокси – Прокси делают ваш трафик более распределенным. Полезно для больших проектов парсинга.
- Очистка в часы с низким трафиком – Задействуйте серверы в непиковые часы, чтобы минимизировать воздействие.
- Распределить парсинг – Распределяйте рабочую нагрузку на несколько экземпляров для крупных проектов.
- Кэшировать запросы – Используйте кэширование, чтобы избежать повторных запросов неизмененных данных.
Использование лучших практик гарантирует, что парсинг будет проходить гладко и без помех.
Сравнение rvest с BeautifulSoup Python
Чем rvest отличается от BeautifulSoup, ведущей библиотеки веб-скрапинга Python?
Функциональность системы – Оба предоставляют схожие API-интерфейсы извлечения на основе селектора CSS. У rvest есть XPath, а у BeautifulSoup есть собственные методы, такие как find_all()
.
Простота в использовании – API BeautifulSoup проще и лучше документирован. rvest требует дополнительных знаний в области программирования на R.
Перфоманс – В тестах BeautifulSoup анализирует большие HTML-документы на 10–15 % быстрее.
Языковая пригодность – Для существующих пользователей R rvest покажется очень знакомым. Разработчики Python могут предпочесть BeautifulSoup.
Подводя итог, BeautifulSoup может иметь небольшое преимущество при парсинге веб-страниц благодаря своей зрелости и специально созданному API. Но для аналитиков, уже владеющих R, rvest предоставляет весьма эффективное решение для парсинга.
Применение веб-скрапинга для создания монитора конкурентных цен
Давайте применим то, что мы узнали, для создания инструмента мониторинга цен. Это будет:
- Собирать списки товаров с сайтов электронной коммерции
- Извлеките ключевые данные, такие как цена, рейтинги, количество отзывов.
- Создайте консолидированное представление о конкурентах
Мы можем запускать это периодически, чтобы отслеживать движение цен и конкурентную среду.
Скрипт будет:
- Используйте rvest, чтобы очистить страницы результатов поиска по ключевому слову продукта.
- Извлеките соответствующие поля в фрейм данных.
- Объедините результаты со всех сайтов в основной фрейм данных.
- Рассчитайте минимальную, максимальную и среднюю цену.
Вот фрагмент кода:
# Search URLs
urls <- c(
"http://amazon.com/s?k=laptop",
"http://walmart.com/search?q=laptop",
...
)
# Extract data
results <- map(urls, function(url) {
page <- read_html(url)
titles <- page %>%
html_elements(css = "h2") %>%
html_text()
prices <- page %>%
html_elements(css = ".price") %>%
html_text()
df <- data.frame(title, price)
return(df)
})
# Combine all results
master_df <- bind_rows(results)
# Calculate stats
print(paste("Min Price:", min(master_df$price)))
print(paste("Max Price:", max(master_df$price)))
print(paste("Avg Price:", mean(master_df$price)))
Это дает нам консолидированное представление о конкурентной среде для ценообразования и анализа продукции. Мы можем еще больше обогатить его, добавив рейтинги, обзоры и другие поля.
Весь процесс от сбора данных до анализа выполнялся с использованием R без необходимости экспорта в другие инструменты. Это демонстрирует комплексную мощь парсинга веб-страниц с использованием rvest и экосистемы tidyverse R.
Заключение
Из этого руководства вы узнали:
- Почему парсинг веб-страниц бесценен – В сети собрано бесконечное количество общедоступных данных для анализа.
- Как использовать rvest для парсинга статических страниц – rvest предоставляет простой API с использованием селекторов CSS и XPath.
- Методы работы с сайтами JavaScript с помощью RSelenium – RSelenium автоматизирует настоящий браузер с помощью Selenium.
- Как создавать наборы данных для анализа – Используйте фреймы данных для сопоставления извлеченных полей.
- Лучшие практики для надежного парсинга – Избегайте блокировок, рандомизируя пользовательские агенты, добавляя задержки и используя прокси.
Парсинг веб-страниц раскрывает огромный потенциал веб-данных. В сочетании с мощными аналитическими возможностями R он становится еще более мощным.
В этом руководстве представлены инструменты, позволяющие начать создавать наборы данных для конкретной предметной области, адаптированные к вашим потребностям, путем извлечения данных с веб-сайтов, соответствующих вашему сценарию использования. Возможности безграничны!