用rvest进行网络抓取:通过paginanation过滤

时间:2018-04-14 17:09:20

标签: r web-scraping

我是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/

谢谢!

1 个答案:

答案 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("&middot;")

        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页上的前几个帖子检查提取的信息

enter image description here