我是R的新手并且一直在努力与" Rvest"包。
我目前正在尝试从网站Zillow抓取数据。
我的目标是能够找到房价,卧室数量,浴室数量和房屋面积。
谷歌搜索,我能够在GitHub上找到Hadley的一些代码。这非常有用,但是在运行之后我注意到它一次只能带回一页。
我希望能够看到具有与每个房屋相关的上述属性的房屋总清单。
我知道,当我尝试过滤网站时,#Pagination"它只允许我一次看一页。这个特定的网络搜索共有20页。
我可以看到,在URL中,唯一改变的是最后:
原始网址(第1页)= <?php
ini_set('display_errors', 1);
require_once('TwitterAPIExchange.php');
$settings = array(
'oauth_access_token' => "",
'oauth_access_token_secret' => "",
'consumer_key' => "",
'consumer_secret' => ""
);
$targetHashTag = '#CambrigeAnalytica';
$url = 'https://api.twitter.com/1.1/search/tweets.json';
$requestMethod = 'GET';
$getfield = '?q=' . $targetHashTag;
$twitter = new TwitterAPIExchange($settings);
$output = $twitter->setGetfield($getfield)
->buildOauth($url, $requestMethod)
->performRequest();
$tweets = json_decode($output, true);
?>
网址(第2页)= https://www.zillow.com/homes/for_sale/Charlotte-NC/24043_rid/globalrelevanceex_sort/35.479124,-80.39177,34.929289,-81.270676_rect/9_zm/
https://www.zillow.com/homes/for_sale/Charlotte-NC/24043_rid/globalrelevanceex_sort/35.479124,-80.39177,34.929289,-81.270676_rect/9_zm/2_p/
是唯一改变的事情。
如果您要转到第3页,那么它会说/2_p/
等等......
有没有办法遍历所有页面,并将属性保存到数据框中,然后访问该数据框?
以下是我正在使用的代码:
/3_p/
谢谢!
答案 0 :(得分:2)
我们可以使用sprintf
library(tidyverse)
links <- sprintf("https://www.zillow.com/homes/for_sale/Charlotte-NC/24043_rid/globalrelevanceex_sort/35.479124,-80.39177,34.929289,-81.270676_rect/9_zm/%d_p", 1:20)
然后遍历链接以将数据划分为单个data.frame
res <- map(links, ~ {
houses <- read_html(.x) %>%
html_nodes(".photo-cards li article")
z_id <- houses %>%
html_attr("id")
address <- houses %>%
html_node(".zsg-photo-card-address") %>%
html_text()
price <- houses %>%
html_node(".zsg-photo-card-price") %>%
html_text() %>%
readr::parse_number()
params <- houses %>%
html_node(".zsg-photo-card-info") %>%
html_text() %>%
strsplit("·")
beds <- params %>%
str_extract("\\d+(?=\\s*bds)") %>%
as.numeric()
baths <- params %>%
str_extract("\\d+(?=\\s*ba)") %>%
as.numeric()
house_area <- params %>%
str_extract("[0-9,]+(?=\\+*\\s*sqft)") %>%
str_replace(",", "") %>%
as.numeric
data_frame(price = price, beds= beds, baths=baths, house_area = house_area)
}
) %>%
bind_rows(.id = 'page_no')
-output
res
# A tibble: 500 x 5
# page_no price beds baths house_area
# <chr> <dbl> <dbl> <dbl> <dbl>
# 1 1 1995000 5.00 7.00 8110
# 2 1 325000 3.00 2.00 1897
# 3 1 1099000 5.00 4.00 3532
# 4 1 550990 4.00 4.00 2953
# 5 1 323000 5.00 3.00 3100
# 6 1 315000 3.00 3.00 1723
# 7 1 2600000 5.00 7.00 7124
# 8 1 1300000 5.00 5.00 4737
# 9 1 549900 2.00 2.00 1788
#10 1 538000 5.00 4.00 3595
# ... with 490 more rows
- 使用第1页上的前几个帖子检查提取的信息