r - R中的网页抓取:如何跟随“下一步”按钮并抓取页面?
问题描述
我还希望解决方案依赖以下软件包 -
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 和一般编码的新手。
解决方案
如果您导航到下一页,您将看到 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 …
推荐阅读
- angular - Ionic 5 在 http 上传递参数和标头
- java - Java / Selenium WebDriver 使用扫描仪永久加载
- react-native - 像 SQL 一样应用连接以从多个集合中获取数据 - Firestore
- react-native - 有什么方法可以让 NodeJS 使用 Expo 应用程序在本地运行?
- git - git - 获取第二级标签之间的提交(--second-parent?)
- python - 多线程python问题,不打印
- jenkins - 在 RasPi4 上的 Docker 中运行 Jenkins
- python - 从字符串熊猫python中提取值?
- reactjs - 基于先前值的 ReactJS 表条件样式
- java - groovy 元类覆盖属性不起作用