首页 > 解决方案 > R中的网页抓取:如何跟随“下一步”按钮并抓取页面?

问题描述

我目前正在使用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 和一般编码的新手。

标签: rweb-scraping

解决方案


如果您导航到下一页,您将看到 url 更新为 include &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 … 

推荐阅读