R中的网页抓取:如何跟随“下一个”按钮并抓取页面?

时间:2019-11-28 02:02:23

标签: r web-scraping

我目前正在使用https://www.presidency.ucsb.edu/advanced-search?field-keywords=%22Labor%22&field-keywords2=&field-keywords3=&from%5Bdate%5D=&to%5Bdate%5D=&person2=&items_per_page=100提供的数据。

我也希望解决方案依赖以下软件包-

library(tidyverse)
library(rvest)
library(stringr)
library(purrr)
library(lubridate)

我的最终目标是抓取前5页中的每篇文章,以提供一个函数来对其进行解析并生成一个数据框。我想从第一页开始,我想使用“下一页”按钮在所有5页上移动,但是我很难把注意力集中在做这些事情的方法上第一页。我已经看到在类似的上下文中使用了各种选项,例如“ follow_link”和“ sprintf”以及“ html_session”,但是还没有足够的理解这些示例以将其概括化,然后在这里使用它们。

看一个类似的例子,我给人的印象是,如果在html_nodes函数中输入正确的信息,则该结构应该可以工作。但是,到目前为止,我没有尝试过的标签组合还不能像示例所示那样成功。

source_col <- https://www.presidency.ucsb.edu/advanced-search?field-keywords=%22Labor%22&field-keywords2=&field-keywords3=&from%5Bdate%5D=&to%5Bdate%5D=&person2=&items_per_page=100

map_df(1:4, function(i){

    page <- read_html(sprintf(source_col, i))

    data.frame(Doc_ID = html_text(html_nodes(page, ""))) 

  }) -> Labor_References

如果有人可以给我任何其他替代方法的指导(并简要解释它们的工作原理?),或者如何解决现有的问题,我将非常感谢。如果对此尚不清楚,我深表歉意。我是R和编码领域的新手。

1 个答案:

答案 0 :(得分:0)

如果导航到下一页,您将看到URL更新为包括&page=1。我们可以利用它(从page = 0开始)并通过更新url遍历每个页面。

library(dplyr)
root <- 'https://www.presidency.ucsb.edu/advanced-search?field-keywords=%22Labor%22&field-keywords2=&field-keywords3=&from%5Bdate%5D=&to%5Bdate%5D=&person2=&items_per_page=100&page='
pages <- 5
df <- tibble()

for(i in seq_len(pages)){
  # pages start from 0 so subtract 1
  page <- paste0(root,i-1) %>%
    read_html() %>%
    html_nodes('table') %>%
    html_table()

  tmp <- page[[1]]

  df <- bind_rows(df, tmp)
}

df
## A tibble: 500 x 3
#   Date        Related        `Document Title`                                                                                
#   <chr>       <chr>          <chr>                                                                                           
# 1 Dec 05, 18… James K. Polk  Fourth Annual Messageof affairs in California. Labor commands a most exorbitant …               
# 2 Jan 24, 18… Franklin Pier… "Special Messagetemporarily to the \"Shawnee Manual Labor School\" (or mission). and …"         
# 3 Dec 03, 18… Abraham Linco… First Annual Message                                                                            
# 4 Dec 01, 18… Abraham Linco… Second Annual Messageis mathematically certain. Labor is like any other commodity …