
Содержание статьи
от AMR

Когда-то веб-сборка была сложной задачей, требовавшей опыта анализа дерева XML и HTTP-запросов. Но с такими современными библиотеками копирования, как beautifulsoup (для Python) и rvest (для R), веб-скрапинг стал игрушкой для любого новичка.
Эта публикация должна объяснить, насколько просто использовать R, очень хороший язык программирования, для выполнения анализа и визуализации данных. Предыдущая задача очень проста. Создайте веб-скребок, который собирает содержимое одной из самых популярных страниц в Интернете (по крайней мере, среди кодеров): Главная страница новостей хакеров.
Установка и загрузка пакета
Пакет R, который мы собираемся использовать rvest.
rvest
можно установить из CRAN и скачать в R, как показано ниже:
library(rvest)
read_html()
функция rvest
можно использовать для извлечения HTML-содержимого URL-адреса, заданного в качестве аргумента для функции read_html.
content <- read_html('https://news.ycombinator.com/')
для read_html()
Чтобы работать без проблем, пожалуйста, убедитесь, что вы не за пределом экрана организации. Если да, настройте свой RStudio с помощью прокси-сервера для обхода брандмауэра, иначе вы можете столкнуться с a connection timed out error
.
Ниже приведен снимок экрана макета первой страницы HN (с выделенными ключевыми элементами):

Теперь HTML-содержимое главной страницы Hacker News загружено в объект R содержимоедавайте вытащим данные, которые нам нужны – начиная с заголовка.
Есть один особо важный аспект успешного выполнения любого веб-сбора. Это означает идентифицировать правильный CSS селектор или значение XPath для элементов HTML, значения которых должны быть скопированы. Самый простой способ получить правильное значение элемента – это использовать the inspect tool
в инструментах разработчика любого браузера
Вот снимок экрана значения CSS селектора. Он подсвечивается с помощью Chrome Inspect Tool, если навести курсор на название ссылки на главной странице Hacker News.

title <- content %>% html_nodes('a.storylink') %>% html_text()title [1] "Magic Leap One" [2] "Show HN: Terminal – native micro-GUIs for shell scripts and command line apps" [3] "Tokio internals: Understanding Rust's async I/O framework" [4] "Funding Yourself as a Free Software Developer" [5] "US Federal Ban on Making Lethal Viruses Is Lifted" [6] "Pass-Thru Income Deduction" [7] "Orson Welles' first attempt at movie-making" [8] "D’s Newfangled Name Mangling" [9] "Apple Plans Combined iPhone, iPad, and Mac Apps to Create One User Experience" [10] "LiteDB – A .NET NoSQL Document Store in a Single Data File" [11] "Taking a break from Adblock Plus development" [12] "SpaceX’s Falcon Heavy rocket sets up at Cape Canaveral ahead of launch" [13] "This is not a new year’s resolution" [14] "Artists and writers whose works enter the public domain in 2018" [15] "Open Beta of Texpad 1.8, macOS LaTeX editor with integrated real-time typesetting"[16] "The triumph and near-tragedy of the first Moon landing" [17] "Retrotechnology – PC desktop screenshots from 1983-2005" [18] "Google Maps' Moat" [19] "Regex Parser in C Using Continuation Passing" [20] "AT&T giving $1000 bonus to all its employees because of tax reform" [21] "How a PR Agency Stole Our Kickstarter Money" [22] "Google Hangouts now on Firefox without plugins via WebRTC" [23] "Ubuntu 17.10 corrupting BIOS of many Lenovo laptop models" [24] "I Know What You Download on BitTorrent" [25] "Carrie Fisher’s Private Philosophy Coach" [26] "Show HN: Library of API collections for Postman" [27] "Uber is officially a cab firm, says European court" [28] "The end of the Iceweasel Age (2016)" [29] "Google will turn on native ad-blocking in Chrome on February 15" [30] "Bitcoin Cash deals frozen as insider trading is probed"
Пакет rvest поддерживает оператор канала %>%. Таким образом, объект R, содержащий содержимое страницы HTML (прочитан с помощью read_html), может передаваться по каналу with html_node
s(), который принимает селектор CSS или XPath в качестве аргумента. Затем он может извлечь соответствующее XML-дерево (или значение узла HTML), текстовое значение которого можно извлечь with html_tex
функция t().
Прелесть rvest заключается в том, что он отвлекает всю операцию анализа XML под капотом таких функций, как html_nodes() и html_text(). Таким образом, нам легче достичь нашей цели скрапинга с минимальным количеством кода.
Как и в случае Title, значение селектора CSS других необходимых элементов веб-страницы можно определить с помощью инструмента Chrome Inspect. Их можно передать в качестве аргумента функции html_nodes(), а соответствующие значения можно получить и сохранить в объектах R.
link_domain <- content %>% html_nodes('span.sitestr') %>% html_text()score <- content %>% html_nodes('span.score') %>% html_text()age <- content %>% html_nodes('span.age') %>% html_text()
Со страницы удалена вся важная информация. Теперь кадр данных R можно создать с извлеченными элементами, чтобы поместить извлеченные данные в структурированный формат.
df <- data.frame(title = title, link_domain = link_domain, score = score, age = age)
Ниже приведен снимок окончательного кадра данных в средстве просмотра RStudio:

Таким образом, всего за 7 строк кода мы успешно создали Hacker News Frontpage Scraper в R.
R — отличный язык для анализа и визуализации данных. Использованный здесь код доступен на моем github.