Webscraping与R“查看更多”的连续页面

Webscraping与R“查看更多”的连续页面,r,web-scraping,rvest,R,Web Scraping,Rvest,我是R的新手,需要在这个网站上的帖子上刮掉标题和日期 使用rvest,我能够编写基本代码来获取信息: url <- 'https://www.healthnewsreview.org/?post_type=news-release-review&s=' webpage <- read_html(url) date_data_html <- html_nodes(webpage,'span.date') date_data <- html_text(date_dat

我是R的新手,需要在这个网站上的帖子上刮掉标题和日期

使用rvest,我能够编写基本代码来获取信息:

url <- 'https://www.healthnewsreview.org/?post_type=news-release-review&s='
webpage <- read_html(url)
date_data_html <- html_nodes(webpage,'span.date')
date_data <- html_text(date_data_html)
head(date_data)

webpage <- read_html(url)
title_data_html <- html_nodes(webpage,'h2')
title_data <- html_text(title_data_html)
head(title_data)

但由于该网站一开始只显示10个项目,然后你必须点击查看更多,我不知道如何刮整个网站。谢谢

引入第三方依赖关系应作为最后手段。埃文斯认为硒是唯一的解决方案,在绝大多数情况下,包括现在,硒本来是不必要的。对于那些使用可怕技术(如SharePoint)的糟糕网站来说,这是必要的,因为在没有浏览器上下文的情况下维护状态是非常痛苦的

如果我们从主页开始:

library(rvest)

pg <- read_html("https://www.healthnewsreview.org/news-release-reviews/")
我想你是想把这些内容删掉,那就去做吧

但是,还有一个讨厌的“查看更多”按钮

当您单击它时,它会发出此POST请求:

通过使用,我们可以将其转换为一个可调用的httr函数,鉴于此任务的不可能性,该函数可能不存在。我们可以使用分页参数将该函数调用包装到另一个函数中:

view_more <- function(current_offset=10) {

  httr::POST(
    url = "https://www.healthnewsreview.org/wp-admin/admin-ajax.php",
    httr::add_headers(
      `X-Requested-With` = "XMLHttpRequest"
    ),
    body = list(
      action = "viewMore",
      current_offset = as.character(as.integer(current_offset)),
      page_id = "22332",
      btn = "btn btn-gray",
      active_filter = "latest"
    ),
    encode = "form"
  ) -> res

  list(
    links = httr::content(res) %>%
      html_nodes("div.item-content") %>%
      html_attr("onclick") %>%
      gsub("^window.location.href='|'$", "", .),
    next_offset = current_offset + 4
  )

}
我们可以将新的偏移量传递给另一个调用:

y <- view_more(x$next_offset)

str(y)
## List of 2
##  $ links      : chr [1:4] "https://www.healthnewsreview.org/news-release-review/sweeping-claims-based-on-a-single-case-study-of-advanced-c"| __truncated__ "https://www.healthnewsreview.org/news-release-review/false-claims-of-benefit-weaken-news-release-on-experimenta"| __truncated__ "https://www.healthnewsreview.org/news-release-review/contrary-to-claims-heart-scans-dont-save-lives-but-subsequ"| __truncated__ "https://www.healthnewsreview.org/news-release-review/breastfeeding-for-stroke-prevention-kudos-to-heart-associa"| __truncated__
##  $ next_offset: num 18
你可以做一些艰难的工作,把首页上的文章数划掉,然后做一些数学运算,把它放到一个循环中,然后有效地停止


注意:如果你是为了存档完整的网站而做这个剪贴,不管是为他们还是独立的,因为它在年底即将消亡,你应该对此发表评论,我对这个用例有比任何编程语言中的手工编码更好的建议。有免费的工业场地保护框架,旨在保护这些类型的濒危资源。如果您只需要文章内容,那么迭代器和自定义刮刀很可能是引入第三方依赖项的最后手段。埃文斯认为硒是唯一的解决方案,在绝大多数情况下,包括现在,硒本来是不必要的。对于那些使用可怕技术(如SharePoint)的糟糕网站来说,这是必要的,因为在没有浏览器上下文的情况下维护状态是非常痛苦的

如果我们从主页开始:

library(rvest)

pg <- read_html("https://www.healthnewsreview.org/news-release-reviews/")
我想你是想把这些内容删掉,那就去做吧

但是,还有一个讨厌的“查看更多”按钮

当您单击它时,它会发出此POST请求:

通过使用,我们可以将其转换为一个可调用的httr函数,鉴于此任务的不可能性,该函数可能不存在。我们可以使用分页参数将该函数调用包装到另一个函数中:

view_more <- function(current_offset=10) {

  httr::POST(
    url = "https://www.healthnewsreview.org/wp-admin/admin-ajax.php",
    httr::add_headers(
      `X-Requested-With` = "XMLHttpRequest"
    ),
    body = list(
      action = "viewMore",
      current_offset = as.character(as.integer(current_offset)),
      page_id = "22332",
      btn = "btn btn-gray",
      active_filter = "latest"
    ),
    encode = "form"
  ) -> res

  list(
    links = httr::content(res) %>%
      html_nodes("div.item-content") %>%
      html_attr("onclick") %>%
      gsub("^window.location.href='|'$", "", .),
    next_offset = current_offset + 4
  )

}
我们可以将新的偏移量传递给另一个调用:

y <- view_more(x$next_offset)

str(y)
## List of 2
##  $ links      : chr [1:4] "https://www.healthnewsreview.org/news-release-review/sweeping-claims-based-on-a-single-case-study-of-advanced-c"| __truncated__ "https://www.healthnewsreview.org/news-release-review/false-claims-of-benefit-weaken-news-release-on-experimenta"| __truncated__ "https://www.healthnewsreview.org/news-release-review/contrary-to-claims-heart-scans-dont-save-lives-but-subsequ"| __truncated__ "https://www.healthnewsreview.org/news-release-review/breastfeeding-for-stroke-prevention-kudos-to-heart-associa"| __truncated__
##  $ next_offset: num 18
你可以做一些艰难的工作,把首页上的文章数划掉,然后做一些数学运算,把它放到一个循环中,然后有效地停止

注意:如果你是为了存档完整的网站而做这个剪贴,不管是为他们还是独立的,因为它在年底即将消亡,你应该对此发表评论,我对这个用例有比任何编程语言中的手工编码更好的建议。有免费的工业场地保护框架,旨在保护这些类型的濒危资源。如果您只需要文章内容,那么迭代器和自定义刮板很可能是