【问题标题】:scraping with R using rvest and purrr, multiple pages使用 rvest 和 purrr 用 R 抓取,多页
【发布时间】:2018-08-16 13:23:54
【问题描述】:

我正在尝试抓取一个数据库,其中包含有关丹麦某个地区以前售出的房屋的信息。我不仅要从第 1 页检索信息,还要从第 2、3、4 页等检索信息。

我是 R 新手,但从一个教程中我得到了这个。

library(purrr)
library(rvest)

urlbase <- "https://www.boliga.dk/solgt/alle_boliger-4000ipostnr=4000&so=1&p=%d"
map_df(1:5,function(i){
    cat(".")
    page <- read_html(sprintf(urlbase,i))

    data.frame(Address = html_text(html_nodes(page,".d-md-table-cell a")))
               Price = html_text(html_nodes(page,".text-md-left+ .d-md-table-cell .text-right"))
               Rooms = html_text(html_nodes(page,".d-md-table-cell:nth-child(5) .paddingR"))
               m2 = html_text(html_nodes(page,".qtipped+ .d-md-table-cell .paddingR"))
               stringsAsFactors = FALSE

}) -> BOLIGA.ROSKILDE

View(BOLIGA.ROSKILDE)

这给了我信息:

bind_rows_(x, .id) 中的错误:参数 1 必须有名称

欢迎任何帮助

【问题讨论】:

  • 对我来说https://www.boliga.dk/solgt/alle_boliger-4000ipostnr=4000&amp;so=1&amp;p=%d 不起作用,给Bad Request - Invalid URL
  • boliga.dk/solgt/alle_boliger-4000ipostnr=4000&so=1&p=1 /// ups sorry.. %d 对于第 1 页应该是 1,对于第 2 页等等。
  • 你有没有成功使用类似的代码但只有一页?当我遇到这样的设置问题时,我会从运行map 的一次迭代的代码开始,例如抓取单个页面。然后我尝试map 而不是map_dfr,因为它对结构不那么严格。 bind_rows 中的一个错误向我表明问题在于将所有 map 输出绑定到一个数据帧中
  • 您还缺少用于在数据框中创建列的代码之间的逗号,然后让stringsAsFactors = FALSE 自行挂起,因此您只是返回FALSE,而不是数据框

标签: r web-scraping rvest purrr


【解决方案1】:

试试这个:

library(rvest)
library(tidyverse)
url="https://www.boliga.dk/solgt/alle_boliger-4000ipostnr=4000?ipostnr=4000ipostnr&so=1&p=1"

# find number of pages in table

   pgs<- ceiling(read_html(url)%>%
                html_nodes(".d-print-none")%>%
                html_nodes("b")%>%
                html_text()%>%
                gsub("[^\\d]+", "", ., perl=TRUE)%>%
                as.numeric()
              /40)

#scrap our table 

scrap=function(pg){
  url=paste0("https://www.boliga.dk/solgt/alle_boliger-4000ipostnr=4000?ipostnr=4000ipostnr&so=1&p=",pg)
  return( read_html(url)%>%
  html_node(".searchResultTable")%>%
  html_table()%>%
  .[,c(1,2,5,4)]%>%
    magrittr::set_colnames(c("Address","Price","Rooms","m2"))%>%
    mutate(m2=as.numeric(m2))
  )
}

#purrr for each page

df=seq(1,pgs)%>%
  map_df(.,scrap)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-06
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2020-04-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多