房地产网络抓取 [r]
Web scraping of real estates [r]
我想自动收集房地产广告网站上的特定数据。我使用包 tidyverse
和 jsonlite
作为起点。使用这些我可以在一定程度上收集我感兴趣的东西。
让我们使用这个庄园网页: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]
将 return 房地产 ID 编号,然后我们可以 google 使用该 ID 进行此优惠。
我们将找到以下页面:
在这里我们可以看到有关 Floor (Podlaží:5.podlaží) 的信息正在处理中。
但是,在 D 对象中,没有关于 Floor (podlaží) 的信息,也没有关于 'Vlastnictví' 的信息。
我希望能够收集有关所有庄园的信息。
有什么方法可以在 R 中做到这一点?
您需要额外 API 次调用才能获取所需数据。每个 hash_id
的新 URL 是
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
我想自动收集房地产广告网站上的特定数据。我使用包 tidyverse
和 jsonlite
作为起点。使用这些我可以在一定程度上收集我感兴趣的东西。
让我们使用这个庄园网页: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]
将 return 房地产 ID 编号,然后我们可以 google 使用该 ID 进行此优惠。
我们将找到以下页面:
在这里我们可以看到有关 Floor (Podlaží:5.podlaží) 的信息正在处理中。 但是,在 D 对象中,没有关于 Floor (podlaží) 的信息,也没有关于 'Vlastnictví' 的信息。 我希望能够收集有关所有庄园的信息。 有什么方法可以在 R 中做到这一点?
您需要额外 API 次调用才能获取所需数据。每个 hash_id
的新 URL 是
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