RSelenium:抓取加载缓慢的动态加载页面

2024-04-26

我不确定是否是因为我的网速很慢,但我正在尝试抓取一个在您向下滚动页面时加载信息的网站。我正在执行一个转到页面末尾的脚本,并等待 Selenium/Chrome 服务器加载附加内容。服务器确实更新并加载新内容,因为我能够抓取最初不在页面上的信息,并且新内容显示在 Chrome 查看器上,但它只更新一次。我设置了一个Sys.sleep()函数每次等待一分钟,以便内容有足够的时间加载,但它仍然不会更新多次。我是否错误地使用了 RSelenium?是否有其他方法来抓取动态加载的网站?

无论如何,您能提供的任何建议或帮助都会很棒。

以下是我认为与在页面末尾加载新内容有关的代码的相关部分:

for(i in 1:3){
  webElem <- remDr$findElement('css', 'body')
  remDr$executeScript('window.scrollTo(0, document.body.scrollHeight);') 
  Sys.sleep(60)
}

下面是完整的代码:

library(RSelenium)
library(rvest)
library(stringr)

rsDriver(port = 4444L, browser = 'chrome')
remDr <- remoteDriver(browser = 'chrome')
remDr$open()
remDr$navigate('http://www.codewars.com/kata')

#find the total number of recorded katas
tot_kata <- remDr$findElement(using = 'css', '.is-gray-text')$getElementText() %>%
  unlist() %>%
  str_extract('\\d+') %>%
  as.numeric()

#there are about 30 katas per page reload
tot_pages <- (tot_kata/30) %>%
  ceiling()

#will be 1:tot_pages once I know the below code works
for(i in 1:3){
  webElem <- remDr$findElement('css', 'body')
  remDr$executeScript('window.scrollTo(0, document.body.scrollHeight);') 
  Sys.sleep(60)
}

page_source <- remDr$getPageSource()

kata_vector <- read_html(page_source[[1]]) %>%
  html_nodes('.item-title a') %>%
  html_attr('href') %>%
  str_replace('/kata/', '')

remDr$close

该网站提供了一个api https://dev.codewars.com/这应该是第一个停靠港。如果失败,您可以使用以下方式访问各个页面:

http://www.codewars.com/kata?page=21

如果您想滚动到页面底部,直到没有更多内容RSelenium您可以使用“正在加载...”元素,它有一个class=js-infinite-marker。虽然页面上仍然有这个元素,但我们尝试每秒向下滚动到它(对于任何问题都会捕获一些错误)。如果该元素不存在,我们假设所有内容均已加载:

library(RSelenium)

rD <- rsDriver(port = 4444L, browser = 'chrome')
remDr <- rD$client # You dont need to use the open method 
remDr$navigate('http://www.codewars.com/kata')
chk <- FALSE
while(!chk){
  webElem <- remDr$findElements("css", ".js-infinite-marker")
  if(length(webElem) > 0L){
    tryCatch(
      remDr$executeScript("elem = arguments[0]; 
                      elem.scrollIntoView(); 
                        return true;", list(webElem[[1]])), 
      error = function(e){}
    )
    Sys.sleep(1L)
  }else{
    chk <- TRUE
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

RSelenium:抓取加载缓慢的动态加载页面 的相关文章

随机推荐

  • 批量插入期间 SQL Server 表锁

    下面是示例查询 考虑 A INSERT INTO Target Col1 Col2 Col3 Col4 Statement 1 Select A Col1 B Col2 A Col3 C Col4 Statement 2 FROM A WI
  • 如何在 WordPress 中创建“路线”?

    为了我自己的理智 我正在尝试为 ajax api 创建一条路由 如下所示 api
  • Unix shell 之间的可移植性 - 我是否正确地考虑了这个问题?

    每当我编写 shell 脚本 主要是软件开发实用程序或构建工具 时 我通常都会尝试避免使用 bash 而倾向于使用普通的旧 sh 来实现可移植性 然而最近我遇到了越来越多的问题 其中有用的功能不可用 或者使用 sh 的系统之间的行为实际上不
  • 节点命令不起作用[重复]

    这个问题在这里已经有答案了 我正在使用 ubuntu 14 04 当我在终端上使用 node hello js 命令时 没有任何反应 我使用 sudo apt get 命令安装了软件包 我不知道出了什么问题 没有错误消息或任何东西 我搜索了
  • 在matplotlib中,如何绘制多色线,如彩虹

    我想用不同的颜色绘制平行线 例如 我想要两条厚度为 3 的平行线 一红一蓝 而不是一条粗细为 6 的红线 任何想法将不胜感激 Merci 即使使用智能偏移 见下文 连续点之间存在锐角的视图中仍然存在问题 Zoomed view of sma
  • Maven依赖冲突

    在我的项目中 有2个库 每个库都依赖于XML解析类java xml parsers DocumentBuilderFactory 这些库中的每一个都引用来自不同 jar 的文件 一个从名为 xmlParserAPIs 的 jar 获取它 而
  • C++ 中的跨平台原始数据类型

    与 Java 或 C 不同 C 中的原始数据类型的大小可能因平台而异 例如 int不保证是 32 位整数 各种编译器环境定义数据类型 例如uint32 or dword为此目的 但似乎没有固定大小数据类型的标准包含文件 实现最大可移植性的推
  • 如何避免在 Scala 中使用 asInstanceOf

    目前我的代码需要类转换 val dataWriter BytesDataWriter createDataWriter def createDataWriter p SomeClass p create datawriter asInsta
  • 带有对象的 Javafx 可编辑组合框

    我刚刚开始学习 Java Fx 我有一个装满物体的组合框 我处理了 toString 方法 我可以看到我想要在屏幕上显示的名称 但现在我想让它可编辑 用户将输入自己的文本 ComboBox 将创建一个新对象并将该文本放入正确的字段中 我知道
  • re.findall结果的顺序有保证吗?

    返回的匹配列表是否为re findall总是与源文本中的顺序相同 是的 正如中所述re module docs https docs python org 2 library re html module contents 以字符串列表的形
  • 可以在子例程中使用模块吗?

    最近 我开始使用 OO Perl 并且为我正在开发的新项目创建了很多新对象 因为我不熟悉有关 OO Perl 的任何最佳实践 所以我们很急于完成它 P 我将大量此类代码放入每个函数中 sub funcx use ObjectX i don
  • “在捆绑 NSBundle 中找不到名为“MainStoryboard”的故事板”

    我已经在一个应用程序上工作了很长时间 突然我得到了这个 在捆绑包中找不到名为 MainStoryboard 的故事板 NS捆绑 我已经在 StackOverflow 上红色了类似的问题 并且我尝试了所有方法 包括 重命名故事板文件 重新添加
  • 类型错误:无法读取 null 的属性“名称”

    我有一个用户对象 他们可以在其中编辑他们的信息 电话号码 电子邮件等 我无法访问输入name在 的里面setState回调并继续获取TypeError Cannot read property name of null 但是当我登录时eve
  • Mozilla Firefox 不再支持dialog.showModal

    我有一个巨大的 asp 网站项目及其弹出窗口 使用自showModalDialog 几个月前mozilla更新了 这个功能出现了一些问题 所以我用了ModalDialog 填充 https github com niutech showMo
  • Tastypie 访问继承模型中的字段

    是否可以使用 tastypie 在相关模型上包含字段 根据我的下面的模型 如果我将一个 VideoContent 和一个 TextContent 实例保存到数据库 我就可以从我的内容资源中获取 2 个对象 但是没有任何其他字段可用 是否可以
  • 打开包含透视图等的 MTrimmedWindow 的多个实例

    我已经为我的 RCP 应用程序定义了一个 主窗口 作为 MTrimmedWindow 其中包含透视图 部件等 像往常一样 在 Application e4xmi 中 是否可以开通额外的以编程方式获取此主窗口的实例 类似于从 MPartDes
  • 布隆过滤器的实现

    使用布隆过滤器 我们将获得空间优化 cassandra 框架也有 Bloom Filter 的实现 但具体来说 这种空间优化是如何实现的呢 您可以使用以下示例了解它如何节省空间 假设我在 Google Chrome 团队工作 我想向浏览器添
  • Vba访问错误91

    我尝试运行这段代码 Public Sub Production UpdateStatus ByVal lngProductionId As Long ByVal NewProductionStatus As eProductionStatu
  • Heroku 中没有运行 Django 的 Web 进程

    我试图在heroku中部署我的应用程序 但是当我最终尝试在heroku中运行我的应用程序时 我在浏览器中看到了这样的内容 Application Error An error occurred in the application and
  • RSelenium:抓取加载缓慢的动态加载页面

    我不确定是否是因为我的网速很慢 但我正在尝试抓取一个在您向下滚动页面时加载信息的网站 我正在执行一个转到页面末尾的脚本 并等待 Selenium Chrome 服务器加载附加内容 服务器确实更新并加载新内容 因为我能够抓取最初不在页面上的信