如何抓取由 R 渲染的 JavaScript 网站?

2024-01-18

想问下有没有什么好的方法可以抓取下面的网站?

基本上我想获取所有产品的名称和价格 然而,价格信息存储在一些 JQuery 脚本中

硒是唯一的解决方案吗?想过用V8/Jsonlite,但好像不太适用。如果你能在 R 中提供一些替代方案,那就太好了。(我的计算机阻止了对 exe 文件的访问,我无法使用 Selenium / PhantomJS]


找不到任何禁止抓取的 robots.txt 或条款/条件(如果有人发现,请在评论中标记,以便我删除答案):

library(rvest)
library(V8)
library(tidyverse)

pg <- read_html("https://list.jd.com/list.html?cat=737,794,798&page=1&sort=sort_rank_asc&trans=1&JL=6_0_0#J_main")

将问题标记为V8是一个????????的主意。

ctx <- v8()

我们需要添加两个缺失的全局变量,然后评估 javascript:

paste0(
  c("var window = {}, SEARCH = {};",
    html_nodes(pg, "script")[[1]] %>%
      html_text()
  ),
  collapse = "\n"
) %>%
  ctx$eval()
## [1] "[object Object]"

现在取出一些数据:

ctx$get("aosList") %>%
  bind_rows(.id = "id") %>%
  tbl_df()
## # A tibble: 175 x 3
##    id      n                     v         
##    <chr>   <chr>                 <chr>     
##  1 1429810 39-45英寸             244_110017
##  2 1429810 全高清(1920×1080)   3613_77848
##  3 1429810 3级                   1200_1656 
##  4 4286570 39-45英寸             244_110017
##  5 4286570 高清(1366×768)      3613_93579
##  6 4286570 3级                   1200_1656 
##  7 4609652 55英寸                244_1486  
##  8 4609652 4k超高清(3840×2160) 3613_77847
##  9 4609652 3级                   1200_1656 
## 10 4609660 65英寸                244_58269 
## # ... with 165 more rows

并且,更多数据:

ctx$get("attrList") %>%
  bind_rows(.id = "id") %>%
  tbl_df()
## # A tibble: 60 x 15
##    id      IsSam    cw factoryShip isCanUseDQ isJDexpress  isJX isOverseaPurchase mcat3Id soldOS  tssp venderType xgzs 
##    <chr>   <int> <int>       <int>      <int>       <int> <int>             <int>   <int>  <int> <int> <chr>      <chr>
##  1 1429810     0     1           0          0           0     0                 0     798     -1     0 0          7.3  
##  2 4286570     0     1          NA          0           0     0                 0     798     -1     0 0          6.2  
##  3 4609652     0     1          NA          0           0     0                 0     798     -1     0 0          7.5  
##  4 4609660     0     1          NA          0           0     0                 0     798     -1     0 0          8.8  
##  5 4620979     0     1          NA          0           0     0                 0     798     -1     0 0          6.4  
##  6 4751739     0     1          NA          1           0     0                 0     798     -1     0 0          8.9  
##  7 4902977     0     1          NA         NA           0     0                 0     798     -1     0 0          9.5  
##  8 5010925     0     1          NA          1           0     0                 0     798     -1     0 0          8.6  
##  9 5102214     0     1          NA          0           0     0                 0     798     -1     0 0          7.8  
## 10 5218185     0     1          NA          1           0     0                 0     798     -1     0 0          <NA> 
## # ... with 50 more rows, and 2 more variables: isFzxp <int>, shipFareTmplId <int>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何抓取由 R 渲染的 JavaScript 网站? 的相关文章

  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • .push() 将多个对象放入 JavaScript 数组中返回“未定义”

    当我将项目添加到beats数组然后console log用户时 我得到了数组中正确的项目数 但是当我检查 length 时 我总是得到 1 尝试调用索引总是会给我 未定义 如下所示 Tom beats 1 我想我错过了一些明显的东西 但这让
  • 使用 Node.js 构建网站的最佳实践

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我想知道如何使用 Node js 从头开始 开发一个网站 我明白我怎么能possibly
  • 如何使用有角度的材料创建卡片网格?

    我正在尝试使用 ng repeat 创建每行三张卡片的网格 我有一个普通的 javascript 对象数组附加到范围 下面的代码将为每张卡创建一个新行 div div
  • Purrr::map_df() 删除 NULL 行

    使用时purrr map df 我偶尔会传递一个数据框列表 其中一些项目是NULL 当我做 map df 返回行数少于原始列表的数据框 我想发生的事情是这样的map df calls dplyr bind rows 它忽略了NULL价值观
  • 如何使用 Playwright 使用选择器查找框架 (iframe)

    我有一个小问题 无法找到使用 Microsoft Playwright 框架的答案 根据您可以使用以下代码获取 iframe const frame page frame frame login 但是如何使用选择器来查找 iframe 并与
  • 想要动态处理与分页相关的页码显示:ReactJS

    我有一些分页逻辑工作得很好 唯一的问题是我只能让它显示并固定数量的页面可供选择 现在我已经把它放到了 5 页 但我希望它能够根据总记录动态更改 假设我有 100 条记录 每页限制为 10 条 将有 10 页 现在我只能让它以这种方式显示 第
  • nodejs (libuv) 事件循环是否在一个阶段(队列)中执行所有回调,然后再进入下一阶段或以循环方式运行?

    我正在研究 Node js 中 libuv 提供的事件循环 我遇到了关注 Deepal Jayasekara 的博客 https blog insiderattack net event loop and the big picture n
  • 如何使用javascript确保元素仅在圆上朝一个方向移动?

    好吧 我承认我对三角学真的很糟糕 出于上下文的考虑 我将添加我在这里提到的问题中的内容 参考问题 https stackoverflow com a 39429290 168492 https stackoverflow com a 394
  • 本地推送通知到在应用程序内运行 JS 代码的 Win8 Live Tile

    我正在尝试将更新发送到我的应用程序的磁贴 当应用程序运行时 这可以正常工作 例如 当用户单击按钮时 我可以轻松地将磁贴更新通知发送到磁贴 我无法解决的是当应用程序无法运行时如何更新磁贴 我找到的唯一选择是使用以下命令从远程 Web 服务器拉
  • R 中的列乘以子字符串

    假设我有一个数据框 其中包含多个组件及其在多个列中列出的属性 并且我想对这些列运行多个函数 我的方法是尝试将其基于每个列标题中的子字符串 但我无法弄清楚如何做到这一点 下面是数据框的示例 Basket F Type 1 F Qty 1 F
  • r 中训练和测试数据的最小最大缩放/归一化

    我正在创建一个函数 它将训练集和测试集作为其参数 最小 最大缩放 标准化并返回训练集并使用这些same最小值和最小 最大范围的值 标准化并返回测试集 到目前为止 这是我想出的功能 min max scaling lt function tr
  • React autoFocus 将光标设置为输入值的开头

    我有一个受控输入 最初显示一个值 我已将该输入设置为自动聚焦 但当我希望它出现在末尾时 光标出现在输入的开头 我知道这可能是因为自动对焦是在值之前添加的 但我不能 100 确定 在输入字段末尾完成光标初始化的最佳方法是什么 var Test
  • mongodb 聚合 - 累积字段的不同组值

    如果我有Player表格文件 name String score Int 我有Group文档 其中组代表玩家列表 groupName String players ObjectID 玩家可以属于多个组 我想做一个聚合Player文档 按以下
  • 聆听 Angular 2 中的元素可见性

    我正在为我的网络应用程序使用 Bootstrap 和 Angular 2 v4 我想监听指令中的元素以了解可见性变化 我的元素有一个可以隐藏其子元素的父元素hidden sm up我需要在每次隐藏或显示时触发一个函数 div hidden
  • 使用 Jade 评估自定义 javascript 方法 (CircularJSON)

    我想通过 Jade 将一个对象解析为客户端 JavaScript 通常这会起作用 script var object JSON parse JSON stringify object but my object is circular ht
  • react-native - 图像需要来自 JSON 的本地路径

    你好社区 我正在react native中开发一个测试应用程序 并尝试从本地存储位置获取图像 我实际在做什么 我将图像直接链接源提供给 var 并在渲染函数中调用此方法 react 0 14 8 react native 0 23 1 np
  • 如何从 json 文件创建模型? (ExtJS)

    这是我想使用 json 文件创建的模型 Ext define Users extend Ext data Model fields name user id type int name user name type string 为了根据服
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对

随机推荐