Sreality.cz веб-слом - PullRequest
       16

Sreality.cz веб-слом

0 голосов
/ 01 мая 2019

Я попытался собрать данные с сайта недвижимости и упорядочить их так, чтобы их можно было легко отфильтровать и проверить с помощью электронной таблицы. Я на самом деле немного смущен, что я не продвигаю этот код 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 голосов
/ 03 мая 2019

Я бы сделал это по-другому: я бы создал функцию, скажем, «скребок», которая объединит все функции очистки, которые вы уже определили, и поэтому я создам список со str_c всех возможных ссылок (скажем 30), после этого простая функция lapply.Как все сказано, я не буду использовать Rselenium.(библиотеки: rvest, stringr, tibble, dplyr)

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

здесь это база URL, начиная с которой вы сможете реплицировать строки URL для всех страниц (от 1 до той, на которой вы находитесь)интересует (и для всех возможных URL-адресов, для praha, olomuc, ostrava и т. д.).

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

здесь вы создаете все ссылки в соответствии с количеством страниц, которые вы хотите:

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

, а затем определяете одну функцию для всех интересующих вас данных, таким образомВы более точны, и ваша отладка ошибок легче, а также качество данных.(Я предполагаю, что ваш выбор CSS правильный, в противном случае вы получите пустой объект)

для имен

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, даже если я их не проверял, кажется мне не правильным, но это даст вам правильную основу дляработа над).После этого объедините их в tibble obj

 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')
}
...