перейти к содержанию

Полное практическое руководство по парсингу веб-страниц в R с помощью rvest

Интернет является крупнейшим источником данных в мире. Такие компании, как 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 предоставляет весьма эффективное решение для парсинга.

Применение веб-скрапинга для создания монитора конкурентных цен

Давайте применим то, что мы узнали, для создания инструмента мониторинга цен. Это будет:

  • Собирать списки товаров с сайтов электронной коммерции
  • Извлеките ключевые данные, такие как цена, рейтинги, количество отзывов.
  • Создайте консолидированное представление о конкурентах

Мы можем запускать это периодически, чтобы отслеживать движение цен и конкурентную среду.

Скрипт будет:

  1. Используйте rvest, чтобы очистить страницы результатов поиска по ключевому слову продукта.
  2. Извлеките соответствующие поля в фрейм данных.
  3. Объедините результаты со всех сайтов в основной фрейм данных.
  4. Рассчитайте минимальную, максимальную и среднюю цену.

Вот фрагмент кода:

# 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 он становится еще более мощным.

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

Присоединяйтесь к беседе

Ваш электронный адрес не будет опубликован. Обязательные поля помечены * *