r在网页抓取中找不到网站的页面数

时间:2019-11-03 17:51:19

标签: html r web-scraping

我想从网站上获取一些页面。我尝试像在tutorial上那样做。我使用了此功能:

get_last_page <- function(html){

  pages_data <- html %>% 
                  # The '.' indicates the class
                  html_nodes('.pagination-page') %>% 
                  # Extract the raw text as a list
                  html_text()                   

  # The second to last of the buttons is the one
  pages_data[(length(pages_data)-1)] %>%            
    # Take the raw string
    unname() %>%                                     
    # Convert to number
    as.numeric()                                     
}
first_page <- read_html(url)
(latest_page_number <- get_last_page(first_page))

对于网站

url <-'http://www.trustpilot.com/review/www.amazon.com'

它工作正常。当我尝试使用

url <-'https://energybase.ru/en/oil-gas-field/index'

我得到了整数(0)。

我改变

html_nodes('.pagination-page') 

html_nodes('.html_nodes('data-page')') 

失败了。 如何更改代码以使其正常工作?

2 个答案:

答案 0 :(得分:3)

我认为您在这里必须对此有所不同。

energybase.ru URL的组织方式与TrustPilot URL完全不同。

出于此处的目的,我们对最后一页具有其自己的节点.last的事实感兴趣。从那里,您只需要提取data-page属性的值并将其增加1。

library("rvest") 
library("magrittr")

url <- 'https://energybase.ru/en/oil-gas-field/index'

read_html(url) %>% html_nodes(".last") %>% html_children() %>% html_attr("data-page") %>% as.numeric()+1
# [1] 21

编辑:请注意,您总是可以在html_children()处截取管道(通过向其添加%>% html_attrs())来查找在那里可以使用的属性。

答案 1 :(得分:1)

您可以使用rel = last attribute = value节点并从href中提取数字

library("rvest") 
library("magrittr")

pg <- read_html('https://energybase.ru/en/oil-gas-field/index')
number_of_pages <- str_match_all(pg %>% html_node("[rel=last]") %>% html_attr("href"),'page=(\\d+)')[[1]][,2] %>% as.numeric()

或者,鉴于页面数量多于可见的分页数量,您可以通过多种方法进行计算。一种方法是从下拉列表中的适当li中获取总计数,然后除以每页计数的结果。

library(rvest)
library(magrittr)

pg <- read_html('https://energybase.ru/en/oil-gas-field/index')
total_sites <- strtoi(pg %>% html_node('#navbar-facilities > li:nth-child(13)') %>% html_attr('data-amount'), base = 0L)
# or use: total_sites <- pg %>% html_node('#navbar-facilities > li:nth-child(13)') %>% html_attr('data-amount') %>% as.numeric()
sites_per_page <- length(pg %>% html_nodes('.index-list-item'))
number_of_pages <- ceiling(total_sites/sites_per_page)