Поиск…


замечания

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

База R не имеет большого количества инструментов, необходимых для этих процессов, поэтому очистка и разбор обычно выполняются с помощью пакетов. Некоторые пакеты наиболее полезны для очистки ( RSelenium , httr , curl , RCurl ), некоторые для синтаксического анализа ( XML , xml2 ) и некоторые для обоих ( rvest ).

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

легальность

Некоторые веб-сайты возражают против того, чтобы их очищали, из-за увеличения нагрузки на сервер или проблем с владением данными. Если сайт запрещает соскабливать в нем Условия использования, скремблирование является незаконным.

Основные скребки с rvest

rvest - это пакет для веб-соскабливания и разбора Хэдли Уикхема, вдохновленный Прекрасным rvest Питона. Он использует привязки libxml2 пакета xml2 для HTML для синтаксического анализа HTML.

Как часть tidyverse, rvest подается по трубопроводу . Оно использует

  • xml2::read_html чтобы очистить HTML-страницу веб-страницы,
  • который затем может быть подмножеством с его html_node и html_nodes с использованием селекторов CSS или XPath и
  • обрабатываются объектами R с такими функциями, как html_text и html_table .

Чтобы очистить таблицу основных этапов со страницы Википедии на R , код будет выглядеть так:

library(rvest)

url <- 'https://en.wikipedia.org/wiki/R_(programming_language)'

        # scrape HTML from website
url %>% read_html() %>% 
    # select HTML tag with class="wikitable"
    html_node(css = '.wikitable') %>% 
    # parse table into data.frame
    html_table() %>%
    # trim for printing
    dplyr::mutate(Description = substr(Description, 1, 70))

##    Release       Date                                                  Description
## 1     0.16            This is the last alpha version developed primarily by Ihaka 
## 2     0.49 1997-04-23 This is the oldest source release which is currently availab
## 3     0.60 1997-12-05 R becomes an official part of the GNU Project. The code is h
## 4   0.65.1 1999-10-07 First versions of update.packages and install.packages funct
## 5      1.0 2000-02-29 Considered by its developers stable enough for production us
## 6      1.4 2001-12-19 S4 methods are introduced and the first version for Mac OS X
## 7      2.0 2004-10-04 Introduced lazy loading, which enables fast loading of data 
## 8      2.1 2005-04-18 Support for UTF-8 encoding, and the beginnings of internatio
## 9     2.11 2010-04-22                          Support for Windows 64 bit systems.
## 10    2.13 2011-04-14 Adding a new compiler function that allows speeding up funct
## 11    2.14 2011-10-31 Added mandatory namespaces for packages. Added a new paralle
## 12    2.15 2012-03-30 New load balancing functions. Improved serialization speed f
## 13     3.0 2013-04-03 Support for numeric index values 231 and larger on 64 bit sy

В то время как это возвращает data.frame, обратите внимание, что, как это типично для очищенных данных, еще предстоит очистка данных: здесь, даты форматирования, вставка NA s и т. Д.

Обратите внимание, что данные в менее последовательно прямоугольном формате могут занять цикл или другое дальнейшее переключение для успешного анализа. Если веб-сайт использует jQuery или другие средства для вставки контента, read_html может оказаться недостаточным для очистки, и может потребоваться более надежный скребок, такой как RSelenium .

Использование rvest при необходимости входа в систему

Я часто сталкиваюсь с проблемой при утилизации веб-страниц, как ввести идентификатор пользователя и пароль для входа на веб-сайт.

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

library(rvest) 

#Address of the login webpage
login<-"https://stackoverflow.com/users/login?ssrc=head&returnurl=http%3a%2f%2fstackoverflow.com%2f"

#create a web session with the desired login address
pgsession<-html_session(login)
pgform<-html_form(pgsession)[[2]]  #in this case the submit is the 2nd form
filled_form<-set_values(pgform, email="*****", password="*****")
submit_form(pgsession, filled_form)

#pre allocate the final results dataframe.
results<-data.frame()  

#loop through all of the pages with the desired info
for (i in 1:5)
{
  #base address of the pages to extract information from
  url<-"http://stackoverflow.com/users/**********?tab=answers&sort=activity&page="
  url<-paste0(url, i)
  page<-jump_to(pgsession, url)

  #collect info on the question votes and question title
  summary<-html_nodes(page, "div .answer-summary")
  question<-matrix(html_text(html_nodes(summary, "div"), trim=TRUE), ncol=2, byrow = TRUE)

  #find date answered, hyperlink and whether it was accepted
  dateans<-html_node(summary, "span") %>% html_attr("title")
  hyperlink<-html_node(summary, "div a") %>% html_attr("href")
  accepted<-html_node(summary, "div") %>% html_attr("class")

  #create temp results then bind to final results 
  rtemp<-cbind(question, dateans, accepted, hyperlink)
  results<-rbind(results, rtemp)
}

#Dataframe Clean-up
names(results)<-c("Votes", "Answer", "Date", "Accepted", "HyperLink")
results$Votes<-as.integer(as.character(results$Votes))
results$Accepted<-ifelse(results$Accepted=="answer-votes default", 0, 1)

Цикл в этом случае ограничен только 5 страницами, это необходимо изменить в соответствии с вашим приложением. Я заменил пользовательские значения на ******, надеюсь, это предоставит вам некоторые рекомендации.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow