Sreality.cz网站抓取

时间:2019-05-01 16:54:29

标签: r selenium web-scraping rvest

我曾尝试从房地产网站上抓取数据,然后以一种可以方便地使用电子表格对其进行过滤和检查的方式来整理数据。实际上,我有点尴尬,因为我不将R代码向前推进。 现在,我拥有所有到帖子的链接,现在我无法遍历先前编译的数据框并从所有URL获取详细信息。

您能帮我吗?非常感谢。

#Loading the rvest package
library(rvest)
library(magrittr) # for the '%>%' pipe symbols
library(RSelenium) # to get the loaded html of
library(xml2)

complete <- data.frame()

# starting local RSelenium (this is the only way to start RSelenium that is working for me atm)
selCommand <- wdman::selenium(jvmargs = c("-Dwebdriver.chrome.verboseLogging=true"), retcommand = TRUE)
shell(selCommand, wait = FALSE, minimized = TRUE)
remDr <- remoteDriver(port = 4567L, browserName = "chrome")
remDr$open()  

URL.base <- "https://www.sreality.cz/hledani/prodej/byty?strana="

  #"https://www.sreality.cz/hledani/prodej/byty/praha?strana="

  #"https://www.sreality.cz/hledani/prodej/byty/praha?stari=dnes&strana="

  #"https://www.sreality.cz/hledani/prodej/byty/praha?stari=tyden&strana="

for (i in 1:10000) {

    #Specifying the url for desired website to be scrapped
    main_link<- paste0(URL.base, i)

    # go to website
    remDr$navigate(main_link)

    # get page source and save it as an html object with rvest
    main_page <- remDr$getPageSource(header = TRUE)[[1]] %>% read_html()

    # get the data
    name <-  html_nodes(main_page, css=".name.ng-binding") %>% html_text()
    locality <- html_nodes(main_page, css=".locality.ng-binding") %>% html_text()
    norm_price <- html_nodes(main_page, css=".norm-price.ng-binding") %>% html_text()
    sreality_url <- main_page %>% html_nodes(".title") %>% html_attr("href")

    sreality_url2 <- sreality_url[c(4:24)]
    name2 <- name[c(4:24)]

    record <- data.frame(cbind(name2, locality, norm_price, sreality_url2))

    complete <- rbind(complete, record)
}

# Write CSV in R
write.csv(complete, file = "MyData.csv")

1 个答案:

答案 0 :(得分:0)

我会采取不同的方式: 我将创建一个函数,例如“ scraper”,将您已经定义的所有抓取函数组合在一起,这样做,我将创建一个列表,其中包含所有可能的链接的str_c(例如30),然后简单地套用功能。综上所述,我不会使用Rselenium。 (库:rvest,stringer,tibble,dplyr)

url = 'https://www.sreality.cz/hledani/prodej/byty?strana='

这是URL的基础,从这里开始,您应该能够为所有感兴趣的页面(从1到任何一个)(以及所有可能的URL,对于praha,olomuc,ostrava等)复制URL字符串)。

 main_page = read_html('https://www.sreality.cz/hledani/prodej/byty?strana=')

在这里,根据需要的页面数创建所有行:

list.of.pages = str_c(url, 1:30)

然后为您感兴趣的所有单个数据定义一个函数,这样您可以更精确,更容易进行错误调试以及数据质量。 (我认为您的CSS选择是正确的,否则您将获得空的obj)

姓名

name = function(url) {

data = html_nodes(url, css=".name.ng-binding") %>% 
html_text()
return(data)
}

关于地区

locality = function(url) {

data = html_nodes(url, css=".locality.ng-binding") %>% 
html_text()
return(data)
}

获取规范价格

normprice = function(url) {

data = html_nodes(url, css=".norm-price.ng-binding") %>% 
html_text()
return(data)
}

用于hrefs

sreality_url = function(url) {

data = html_nodes(url, css=".title") %>% 
html_attr("href")
return(data)
}

这些是唯一的功能(即使我没有测试它们,CSS选择对于我来说似乎也不正确,但这将为您提供合适的框架进行工作)。之后,将它们组合成一个小对象

 get.data.table = function(html){
  name = name(html)
  locality = locality(html)
  normprice = normprice(html)
  hrefs = sreality_url(html)

  combine = tibble(adtext  = name,
                   loc     = locality, 
                   price   = normprice,
                   URL     = sreality_url)
  combine %>%
    select(adtext, loc, price, URL)   return(combine)
}

然后是最后的刮刀:

scrape.all = function(urls){
  list.of.pages %>% 
    lapply(get.data.table) %>%  
    bind_rows() %>%
    write.csv(file = 'MyData.csv')
}