CoderCastrov logo
CoderCastrov
R

Парсинг веб-страниц с использованием R

Парсинг веб-страниц с использованием R
просмотров
5 мин чтение
#R
Table Of Content

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

О данных

На сайте The Numbers находится полный список фильмов с информацией о датах выпуска, бюджете производства и доходе. Цифры прибыли и убытков являются очень грубыми оценками на основе доходов от кассовых сборов внутри страны и за рубежом, а также от продажи видео внутри страны, экстраполированными для оценки мирового дохода студии после вычета розничных затрат.


The Numbers - Бюджеты фильмов, Самые дорогие фильмы, Самые прибыльные фильмы, Самые убыточные...

Примечание: Числа бюджетов фильмов могут быть сложными для поиска и ненадежными. Киностудии часто пытаются скрыть информацию...

www.the-numbers.com

Примечание: Данные о фильмах представлены в табличном формате.

Следуйте следующим шагам:

* Откройте R Studio. Затем в новом файле:

Установка пакетов

Установите необходимые пакеты.

* xml2: Xml2 - это оболочка для обширной библиотеки C libxml2, которая упрощает работу с XML и HTML в R.

* rvest: rvest помогает скрапить информацию со веб-страниц.

* tibble: Пакет tibble предоставляет утилиты для работы с tibbles, где "tibble" - это разговорное название класса S3 tbl_df. Класс tbl_df - это особый случай базового data.frame.

Перед началом работы

Как программировать на Python и R в одном блокноте Jupyter

Вы должны понимать, что R и Python хранят переменные в разных структурах. Поэтому, если мы хотим использовать оба языка, нам нужен пакет, который будет служить переводчиком, то есть "преобразует" список Python в R-вектор, чтобы работать с ним, например.

Учебник по reticulate: как использовать Python в R - Ander Fernández

Python и R - два основных языка программирования для работы с данными. Оба являются замечательными и универсальными...

anderfernandez.com

Для этого мы будем использовать пакет rpy. Этот пакет создает интерфейс Python для работы с R. Другой вариант - использовать пакет reticulate, который, по сути, является обратным: интерфейсом R для Python, в случае, если вы предпочитаете программировать в RStudio, я оставляю вам этот пост, где я объясняю это ;) Установка пакета rpy

Первое, что вам нужно сделать, это установить пакет rpy.

# Установите модуль, который позволяет работать с r и python одновременно
# ! pip install rpy2

После установки загрузите библиотеку

%load_ext rpy2.ipython

Приступим.

Показать информацию о сессии.

%%R
sessionInfo()R version 4.0.2 (2020-06-22)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.1 LTS

Matrix products: default
BLAS/LAPACK: /home/oscar/anaconda3/lib/libmkl_rt.so

locale:
 [1] LC_CTYPE=es_ES.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=es_ES.UTF-8        LC_COLLATE=es_ES.UTF-8    
 [5] LC_MONETARY=es_ES.UTF-8    LC_MESSAGES=es_ES.UTF-8   
 [7] LC_PAPER=es_ES.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] tools     stats     graphics  grDevices utils     datasets  methods  
[8] base     

loaded via a namespace (and not attached):
[1] compiler_4.0.2

Начало работы

Установите пакет из CRAN следующим образом:

%%R 
library(xml2)
library(rvest)   ##очень важно
library(tibble)
library(magrittr)* Сохранение URL первой страницы таблицы с данными о примерно 100 фильмах в переменную base_url:%%R
base_url <- "https://www.the-numbers.com/movie/budgets/all"

The Numbers - Бюджеты фильмов

Примечание: Числа бюджета для фильмов могут быть как сложно найти, так и ненадежными. Киностудии и режиссеры часто пытаются сохранить...

www.the-numbers.com

* Парсинг HTML-контента из сохраненного URL:%%R
base_webpage <- read_html(base_url)* Теперь, как вы можете видеть здесь, после all/101 есть. Аналогично, есть еще много страниц с 100 фильмами каждая в таблице, все с разными URL.

Итак, мы должны сохранить 100 URL-адресов для 100 страниц для 10 000 фильмов?

Конечно нет! У нас есть определенные стили форматирования строк. Вы можете посетить документацию здесь.


4 Форматирование в стиле C | Обработка строк с помощью R

Эта книга стремится предоставить панорамный обзор широкого спектра операций с строками, которые можно выполнить с помощью...

www.gastonsanchez.com

Таким образом, для строк мы используем %s.

%%R
new_urls<- "https://www.the-numbers.com/movie/budgets/all/%s"* Создание фрейма данных первых 100 фильмов:
    *html_table(): преобразует таблицы HTML в фреймы данных.
%%R
table_base <- rvest::html_table(base_webpage)[[1]] %>% 
  tibble::as_tibble(.name_repair = "unique") # восстановление повторяющихся столбцовR[write to console]: Новые имена:
* `` -> ...1* Создание фрейма данных следующего набора фильмов:
%%R
# создание двух пустых фреймов данных
table_new <-data.frame()
df <- data.frame()

# итератор
i<-101

# он выполняет цикл 5501 раз, чтобы извлечь, сохранить и объединить около 5000 уже извлеченных фильмов.
while (i<5502) {
  new_webpage<- read_html(sprintf(new_urls,i))
  table_new <- rvest::html_table(new_webpage)[[1]] %>% 
    tibble::as_tibble(.name_repair = "unique") # восстановление повторяющихся столбцов
  df<- rbind(df,table_new)
  i=i+100
}





* Объединение table_base и df:%%R
df_movies <- merge(table_base,df, all = T)* Давайте посмотрим, как выглядит наш фрейм данных точно:%%R
head(df_movies)...1  ReleaseDate                              Movie ProductionBudget
1     1 Apr 23, 2019                  Avengers: Endgame     $400,000,000
2 1,000 Apr 28, 2000 The Flintstones in Viva Rock Vegas      $58,000,000
3 1,001  Apr 4, 2008                       Leatherheads      $58,000,000
4 1,002 Mar 22, 2017                               Life      $58,000,000
5 1,003 Dec 18, 2009    Did You Hear About the Morgans?      $58,000,000
6 1,004 Dec 12, 2008         Che, Part 1: The Argentine      $58,000,000
  DomesticGross WorldwideGross
1  $858,373,000 $2,797,800,564
2   $35,231,365    $59,431,365
3   $31,373,938    $41,348,628
4   $30,234,022   $100,929,666
5   $29,580,087    $80,480,566
6    $1,802,521    $31,627,370

Вуаля! Мы выполнили нашу задачу.

* Теперь, если вы хотите, вы можете создать файл CSV этого фрейма данных для его физического сохранения на вашей системе с помощью:%%R
write.csv(df_movies,"moviesData_tutorial.csv")
%%R
summary(df_movies)...1           ReleaseDate           Movie           ProductionBudget  
 Length:5600        Length:5600        Length:5600        Length:5600       
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
 DomesticGross      WorldwideGross    
 Length:5600        Length:5600       
 Class :character   Class :character  
 Mode  :character   Mode  :character
%%R
str(df_movies)'data.frame':	5600 obs. of  6 variables:
 $ ...1            : chr  "1" "1,000" "1,001" "1,002" ...
 $ ReleaseDate     : chr  "Apr 23, 2019" "Apr 28, 2000" "Apr 4, 2008" "Mar 22, 2017" ...
 $ Movie           : chr  "Avengers: Endgame" "The Flintstones in Viva Rock Vegas" "Leatherheads" "Life" ...
 $ ProductionBudget: chr  "$400,000,000" "$58,000,000" "$58,000,000" "$58,000,000" ...
 $ DomesticGross   : chr  "$858,373,000" "$35,231,365" "$31,373,938" "$30,234,022" ...
 $ WorldwideGross  : chr  "$2,797,800,564" "$59,431,365" "$41,348,628" "$100,929,666" ...
%%R
dim(df_movies)[1] 5600    6
%%R
colnames(df_movies)[1] "...1"             "ReleaseDate"      "Movie"            "ProductionBudget"
[5] "DomesticGross"    "WorldwideGross"

Заключение

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


Надеюсь, это поможет вам развиваться в вашей тренировке.

Независимо от того, из каких книг, блогов, курсов или видео вы учитесь, когда дело доходит до реализации, все может выглядеть "вне программы".

Лучший способ учиться - это делать! Лучший способ учиться - это преподавать то, что вы узнали!

Никогда не сдавайся!

Увидимся в Linkedin!

Оскар Рохо Мартин - изучение науки о данных в Университете Деусто - Сан-Себастьян, Баскская страна, Испания | LinkedIn


Ссылки:

* [https://www.r-bloggers.com/tutorial-web-scraping-of-multiple-pages-using-r/](https://www.r-bloggers.com/tutorial-web-scraping-of-multiple-pages-using-r/)