【问题标题】:Web scraping of real estates [r]房地产网页抓取 [r]
【发布时间】:2021-02-22 10:54:51
【问题描述】:

我想自动收集房地产广告网站上的特定数据。我使用包tidyversejsonlite 作为起点。使用这些我也可以在一定程度上收集到我感兴趣的东西。

让我们使用这个庄园网页:https://www.sreality.cz/hledani/prodej/byty

# Libraries -----------------------------------------------------------------------------------
library(jsonlite)
library(tidyverse)

# Web Page of Estates: https://www.sreality.cz/hledani/prodej/byty/praha

# Select one region
id = 10

A = paste0("https://www.sreality.cz/api/cs/v2/estates?category_main_cb=1&category_type_cb=1&locality_region_id=", id, "&page=")
B= paste("&per_page=40&tms=1583500044717")
C = paste0(A,1,B)
D = fromJSON(C)


Res <- 
  D$`_embedded`$estates %>% 
  mutate(D$`_embedded`$estates$hash_id) %>% 
  as_data_frame()

Res %>% view()

这样Res 对象包含感兴趣的基本信息,例如价格,也使用正则表达式我们可以获得房间数量等。但是,有些信息我很感兴趣,例如 楼层号码 (Podlaží)、所有权类型 (Vlastnictví) 等。

让我们在一个特定的庄园抢劫

Res$hash_id[1]

将返回房地产 ID 号,然后我们可以使用该 ID 搜索此优惠。

我们会找到以下页面:

https://www.sreality.cz/detail/prodej/byt/2+kk/praha-praha-4-milevska/822296156#img=0&fullscreen=false

在这里我们可以看到有关 Floor (Podlaží:5. podlaží) 的信息可供使用。 然而,在 D 对象中没有关于 Floor (podlaží) 的信息,也没有关于“Vlastnictví”的信息可供使用。 我希望能够收集有关所有庄园的这些信息。 有什么办法可以在 R 中做到这一点?

【问题讨论】:

    标签: r json xml web-scraping rcurl


    【解决方案1】:

    您需要额外的 API 调用来获取所需的数据。每个hash_id 的新网址是

    https://www.sreality.cz/api/cs/v2/estates/<hash_id>?tms=<timestamp>
    

    考虑这个工作流程

    mas_url <- "https://www.sreality.cz"
    
    get_links <- function(url, id, page) {
      tmp <- paste0(
        url, 
        "/api/cs/v2/estates?category_main_cb=1&category_type_cb=1&locality_region_id=", id, 
        "&page=", page, 
        "&per_page=40&tms=1583500044717"
      )
      links <- jsonlite::fromJSON(tmp)$`_embedded`$estates$hash_id
      tms <- as.character(round(as.double(Sys.time())*1000))
      paste0(url, "/api/cs/v2/estates/", links, "?tms=", tms)
    }
    
    # I only scraped three websites for test
    res <- lapply(get_links(mas_url, 10, 1)[10:12], jsonlite::fromJSON)
    

    列表res 中的每个元素对应一个庄园。例如,您可以在以下位置找到您需要的信息

    res[[1L]]$items
    

    输出

       negotiation                   name   notes                 value currency      type          unit topped
    1        FALSE           Celková cena bez DPH             8 950 400       Kc price_czk za nemovitost     NA
    2           NA             ID zakázky    NULL                  D401     <NA>    string          <NA>     NA
    3           NA            Aktualizace    NULL                  Dnes     <NA>    edited          <NA>   TRUE
    4           NA                 Stavba    NULL               Cihlová     <NA>    string          <NA>     NA
    5           NA           Stav objektu    NULL            Novostavba     <NA>    string          <NA>     NA
    6           NA            Vlastnictví    NULL                Osobní     <NA>    string          <NA>     NA
    7           NA       Umístení objektu    NULL          Centrum obce     <NA>    string          <NA>     NA
    8           NA                Podlaží    NULL 4. podlaží z celkem 5     <NA>    string          <NA>     NA
    9           NA          Užitná plocha    NULL                    77     <NA>      area            m2     NA
    10          NA       Plocha podlahová    NULL                    83     <NA>      area            m2     NA
    11          NA                 Terasa    NULL                  TRUE     <NA>   boolean          <NA>     NA
    12          NA                  Sklep    NULL                  TRUE     <NA>   boolean          <NA>     NA
    13          NA                  Garáž    NULL                  TRUE     <NA>   boolean          <NA>     NA
    14          NA      Datum nastehování    NULL            30.01.2023     <NA>      date          <NA>     NA
    15          NA Datum zahájení prodeje    NULL            01.08.2020     <NA>      date          <NA>     NA
    16          NA                  Výtah    NULL                  TRUE     <NA>   boolean          <NA>     NA
    

    【讨论】:

    • 您好,使用您的方法,我可以做我需要做的事情。但是,我有时会遇到此错误Error in open.connection(con, "rb") : HTTP error 503。您是否也知道如何解决这个问题?
    • 这意味着服务器还没有准备好处理你的请求。这可能是因为您发送请求过于频繁,请考虑在您的请求之间引入一些短暂的休息,例如Sys.sleep(1)
    • 我在使用这种方法Error in open.connection(con, "rb") : Send failure: Connection was reset 时遇到了另一个错误。在这种情况下,我有Sys.sleep(3),这仍然会发生。你又遇到过这个吗?
    • 这可能是网络问题。通常,它会在第二次或第三次试验时自动解决。考虑将你的函数调用放在一个循环中,或者检查这个函数purrr::insistently
    猜你喜欢
    • 1970-01-01
    • 2022-11-09
    • 2023-03-27
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多