rvest 使用 javascript 进行网页抓取

2024-02-16

我正在尝试从中获取每日天气预报五三十八 https://projects.fivethirtyeight.com/election-2016/national-primary-polls/democratic/ using rvest,但我感兴趣的对象似乎是一个 javascript 对象,我什至很难找到要查找的位置和内容。 (我不太精通 CSS 或 Javascript,尽管我在过去几天尝试自学。)

通过检查网页元素和 CSS 选择器,我发现了以下内容:

  • 要查看的位置是<div id="polling-avg-chart">,所以我尝试了

    library(rvest)
    url <- 
      "https://projects.fivethirtyeight.com/election-2016/national-primary-polls/democratic/"
    
    url %>% 
      read_html() %>% 
      html_nodes("#polling-avg-chart")
    

    没有取得多大成功。输出很简单

    {xml_nodeset (1)}

    [1] \n

  • 个人民意调查结果以点为单位<g style="clip-path: url("#line-clippoll_avg");"> ... </g>,您会在其中看到 502 个位置的数字。我猜我得翻译一下cx and cy每个节点到适当的百分比,这是通过<g class="flag-box" transform="translate(30, 161.44093322753096)">...</g>等等。

  • 但是,我没有看到预测线的基础数据,而不是点。

  • 当我将光标悬停在图表上时,我会看到诸如<line class="hover-date-line hide-line">变化,以及诸如<path class="link" d="M 0 171.40106812500002 C 15 171.40106812500002 15 170.94093803735575 30 170.94093803735575"></path>变化,我猜测这些值就是创建每日预测线的原因。
  • 但这些值存储在哪里,以及如何将其转换回“49.1% 克林顿 vs. 26.6% 桑德斯”之类的内容对我来说仍然是个谜。

我确实读过其他一些帖子,例如this https://stackoverflow.com/questions/46823199/scraping-a-javascript-object-and-converting-to-json-within-r-rvest但它们似乎都不适用于这个特定问题。在整洁的数据框中获取预测百分比的最佳方法是什么?


另一种方式是直接抓取资源。

In your browser, open Developer Tools (F12 in Chrome/Chromium), head to "Network", refresh (F5), and look for what looks like a nicely formatted JSON. When we've found it, we copy the link address (right-click on the resource > Copy link address).

library(httr)
library(tidyr)
library(purrr)
library(dplyr)
library(ggplot2)

url <- "https://projects.fivethirtyeight.com/election-2016/national-primary-polls/USA.json"

r <- GET(url)

全部数据都在那里。权重也是如此,因此您可以重新计算这些平均值。绘制的数据位于"model":

dat <- 
  jsonlite::fromJSON(content(r, as = "text")) %>% 
  map(purrr::pluck, "model") %>% 
  bind_rows(.id = "party") %>% 
  mutate_all(readr::parse_guess)

# # A tibble: 5,288 x 5
#    party candidate_name state forecastdate poll_avg
#    <chr> <chr>          <chr> <date>          <dbl>
#  1 D     Sanders        USA   2016-07-01       36.5
#  2 D     Clinton        USA   2016-07-01       55.4
#  3 D     Sanders        USA   2016-06-30       37.0
#  4 D     Clinton        USA   2016-06-30       54.6
#  5 D     Sanders        USA   2016-06-29       37.0
#  6 D     Clinton        USA   2016-06-29       54.9
#  7 D     Sanders        USA   2016-06-28       37.2
#  8 D     Clinton        USA   2016-06-28       54.4
#  9 D     Sanders        USA   2016-06-27       37.4
# 10 D     Clinton        USA   2016-06-27       53.9
# # ... with 5,278 more rows

重现图表:

dat %>% 
  filter(candidate_name %in% c("Clinton", "Kasich", "Sanders", "Trump")) %>% 
  ggplot(aes(forecastdate, poll_avg)) +
  geom_line(aes(col = candidate_name)) +
  facet_wrap(~party)

如果您想要互动:

library(dygraphs)
library(htmltools)

foo <- dat %>% 
  filter(candidate_name %in% c("Clinton", "Kasich", "Sanders", "Trump")) %>% 
  split(.$party) %>% 
  map(~ {
    select(.x, forecastdate, candidate_name, poll_avg) %>% 
      spread(candidate_name, poll_avg) %>% 
      {xts(.[-1], .[[1]])} %>%
      dygraph(group = "poll-model") %>% 
      dyRangeSelector()
  })

browsable(tagList(foo))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rvest 使用 javascript 进行网页抓取 的相关文章

  • 盒子大小是否可在电子邮件模板中使用

    我正在创建电子邮件模板 我发现了这个CSS 支持指南 https www campaignmonitor com css but box sizing不在那儿 我想知道是否支持该 CSS 属性 如果支持 哪些电子邮件客户端支持它 不 不支持
  • 表单提交不起作用

    我有一张桌子 可以打印出所有可用的相机 它使用表单来更改这些设置 问题在于该表单仅更新条目中的最后一个摄像机 换句话说 如果我更改表单并为列表中的最后一个摄像机点击 应用 它将起作用 如果我更改此列表中任何其他摄像机的表单 它会将其更改为与
  • 通过电子邮件发送在 HTML5 画布上创建的图像

    我有一个画布 用户可以通过交互来更改设计 现在 用户完成更改后 可以提交他的设计及其电子邮件 ID 但为了提交设计 我使用以下方法将画布转换为图像http www nihilogic dk labs canvas2image http ww
  • JQuery _renderItem 没有被调用

    我正在尝试使用 renderItem 函数创建自定义 ui menu item 元素 但经过可能尝试后 我什至无法调用该函数 自动完成功能正在工作 但就像 renderItem 函数不存在一样 这是我的脚本部分
  • 提取模型摘要并将其存储为新列

    我是新来的purrr范例并正在努力解决它 根据一些来源 我已经设法嵌套一个数据框 在嵌套数据上运行线性模型 从每个 lm 中提取一些系数 并为每个 lm 生成摘要 我想做的最后一件事是从摘要中提取 r squared 我原以为这将是我想要实
  • Django 模板变量从 {% for %} 循环到 Javascript

    这是一个迭代记录的 Django 模板 每条记录都包含一个由 JS 函数填充的 div 为了让 JS 知道要做什么 它需要从每次 for 循环迭代中获取一个变量并使用它 我不知道具体如何实现这一目标或是否可能 我不知道 也许记录在单独的 J
  • 如何根据值扩展数据框? [复制]

    这个问题在这里已经有答案了 我有以下输入数据框 df lt data frame x c a b c y c 4 5 6 from c 1 2 3 to c 2 4 6 df x y from to 1 a 4 1 2 2 b 5 2 4
  • 使用边距与填充? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我最近开始自己在线学习周三开发 并且是这个领域的新手 所以对我的基本查询表示歉意 我知道边距和填充之间的区别 用逻辑术语 但不太确定 何时应该使
  • 函数声明或函数表达式

    我刚刚在块作用域中定义函数时遇到了问题 考虑以下程序 try greet function greet alert Merry Christmas catch error alert error 我希望这个程序能够发出警报Merry Chr
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • Jest - 语法错误:无法在模块外部使用 import 语句

    我在用jest 24 9 0无需任何配置 从 create react app 全局安装 在这些文件中我使用 es6 模块 使用时没有报错 test react scripts test 但是当我开始使用时jest with test je
  • Flot 0.8.2 折线图 - 颜色错误

    我正在使用 Flot 折线图并设置它们的颜色 我发现了一个奇怪的错误 在前 3 种颜色之后 绘图对所有其他线条使用最后一种颜色 这不是正确的行为 更有趣的是图例显示了正确的颜色 这是一个已知的错误 var dataSet label d1
  • NodeJS 中的缩进多行日志记录

    我要打印JSON stringify d 反对控制台 将上下文作为 Mocha 测试套件输出的一部分 当测试缩进时 我希望对象日志行向右缩进足够远 例如 3 4 个制表符空格 以便它们可以识别地位于右侧describe group 我怎样才
  • 直接来自数据的马尔可夫模型图(makovchain 或 deemod 包?)

    我想读取一堆因子数据并从中创建一个可以很好地可视化的转换矩阵 我发现了一个非常好的软件包 称为 heemod 它与 diagram 一起工作得不错 对于我的第一个快速而肮脏的方法 我运行了一段 Python 代码来获取矩阵 然后使用这个 R
  • 尽管给出了供应商 ID,Web 串行 api 显示“未找到兼容设备”

    Windows 8 1 Chrome v91 0 4472 164 我已根据设备管理器验证了供应商和产品 ID 该设备是使用 Ch340 驱动程序的 Arduino UNO 它在设备管理器中的端口 COM 和 LPT 下列为 USB SER
  • jQuery 显示/隐藏兄弟姐妹

    我有这段代码 旨在首先隐藏除第一个元素之外的所有相关元素 这个 做的不错啊接下来 它应该根据选择的项目显示 隐藏这些元素 但这部分不起作用 想法 jQuery accordion dl not first child hide hide a
  • 如何将外部 div 的高度设置为始终等于特定内部 div 的高度?

    我有一个外部 div 其中包含三个内部 div 我希望最左边的内部 div 始终确定外部 div 的高度 如果其他内部 div 的内容 比最左边的 div 少 它们将有空白空间 如果他们有更多的内容 比最左边的div 他们将得到一个滚动条
  • 更改 CSS 样式表的选择器属性

    以下是我们传统上如何更改重复元素的样式 将样式应用到每个元素 function changeStyle selector prop val var elems document querySelectorAll selector Array
  • Ie11 不应用媒体查询样式

    IE11 忽略我的媒体查询并始终使用移动 CSS 奇怪的是 如果我改变浏览器宽度 即使只是 1 2 像素 浏览器也会自行渲染并显示媒体查询 我尝试了 css lint 我的 css 中没有错误 我的CSS没有什么特别的 只是简单的 css
  • dplyr::mutate 添加多个值

    网上有几个与此相关的问题dplyr Github 存储库 https github com hadley dplyr已经 并且至少有一个相关的问题 但没有一个问题完全涵盖了我的问题 我认为 在 dplyr mutate 调用中添加多列 ht

随机推荐

  • func 在 R-Format 指令集中意味着什么?

    I am very new to Assembly language I was reading about MIPS architecture and I am stuck with the last field of the Regis
  • 如何确保java8流中的处理顺序?

    我想处理里面的列表XMLjava 对象 我必须确保处理所有元素才能收到它们 因此我应该打电话给sequential在各个stream I use list stream sequential filter forEach 或者只要我不使用并
  • 在 Three.js 中使用 renderOrder

    我想在场景中有两个重叠的对象 但我想定义应该首先绘制哪个对象 我这里有一个代码示例 http jsfiddle net sg02e5sm 1 http jsfiddle net sg02e5sm 1 我在用着renderOrder 1对于第
  • iPhone 应用程序在 didFinishLaunchingWithOptions 之前崩溃

    我的 iPhone 应用程序工作正常 但每当我在设备或模拟器上运行它时 它就会突然崩溃 并且它不会在日志中向我报告任何有用的信息 它只会记录以下无用的信息 2014 02 05 17 09 34 069 TeacherAssistant 7
  • 如何对Dataframe的多列执行单一操作

    我有以下数据框 df gt gt gt TSLA MSFT 2017 05 15 00 00 00 00 00 320 68 2017 05 16 00 00 00 00 00 319 69 2017 05 17 00 00 00 00 0
  • contenteditable .execCommand() 未触发?

    我正在尝试使用 contenteditable 自定义所见即所得编辑器 我使用以下代码使所选文本变为粗体 wysiwyg b click function document execCommand bold false true alert
  • Python C 互操作性

    我希望将现有的 C 纯 C 即非 C 库包装到 Python 中 以便我可以从 Python 脚本中调用它 各种可用的方法 C Api SWIG 等 中哪种方法最合适 与 Ctypes 一起使用 它是标准发行版的一部分并且运行良好 基本上你
  • CSS - 翻转一个元素,并使另一个元素可见

    在CSS中 当我滚动一个元素时 是否有可能使另一个元素可见 我有一个图标 当有人将鼠标悬停在它上面时 我希望它显示一个描述该图标功能的文本元素 这是我一直使用的纯 CSS 工具提示 效果很好 即使在 IE 中也是如此 a hover bac
  • 2TB CSV 中的帐号匿名化

    我有大约 2TB 的 CSV 其中第一个2 列包含两个身份证号码 这些数据需要匿名 以便数据可用于学术研究 匿名化可以 但不一定 是不可逆的 这些不是医疗记录 所以我不需要最奇特的加密算法 问题 标准哈希算法会生成很长的字符串 但我必须进行
  • 如何在SQL Server中生成随机数据

    我想创建一个存储过程来在 视频 表中插入随机数据 我已经为 UserProfile 表生成了 30 000 条记录数据 注 用户名是视频表中的FK元素 CREATE TABLE UserProfile Username VARCHAR 45
  • 为什么我们不能在 C# 中使用 Iterator StateMachine 属性?

    I did a Go To Definition F12 on a class I was trying to derive from and I noticed that one of the methods was marked wit
  • 当手机锁定/应用程序未打开时,推送通知振动不起作用

    向应用程序发送的推送通知始终会发送 这不是问题 问题是 仅当应用程序打开且手机未锁定时 如果从应用程序收到新通知 手机就会振动 如果应用程序未打开或手机已锁定 手机将不会在收到通知时振动 有没有办法让手机收到通知时振动 即使它被锁定或应用程
  • 带有嵌套聚合的 Elasticsearch 查询导致内存不足

    我安装了 Elasticsearch 内存为 16GB 我开始使用聚合 但当我尝试发出以下查询时遇到 java lang OutOfMemoryError Java堆空间 错误 POST test index syslog3 type sy
  • QuickBlox 2.0 聊天对话框 - 如何检测用户加入或离开群聊对话框?

    从版本 1 2 4 更新到版本 2 0 时 我遇到了 QuickBlox 问题 在2 0版本中如何检测用户加入或离开群聊对话框 在版本 1 2 4 中我使用 ParticipantListener 但版本 2 2 QBGroupChat 无
  • Google Colab Pro+ 断开连接并停止执行,并且只允许一个会话

    我的笔记本随机断开连接并停止执行 它应该将文件发送到云端硬盘 但会停止并且不会重新连接 另外 截至今天 它一次只允许我进行一次会话 我以为极限更多了 我已经检查过了 我仍然活跃在 Pro 计划中 大约一周前我才支付了该计划 这会影响我的所有
  • jQuery UI 1.7.1 叠加点击时模态关闭

    我试图覆盖 jQuery UI 模式对话框的默认行为 以在单击覆盖层时关闭该框 下面的代码将在我第一次打开对话框并单击叠加层后关闭该对话框 当我再次打开对话框时 单击叠加层没有任何反应 我在这里错过了一个活动 有人可以指出我在这里做错了什么
  • 如何将 JpaTemplate 的使用从 Spring 3.2 迁移到 4.1.4?

    我们目前已配置并运行 Spring 3 2 9 RELEASE 几年 需要迁移到 4 1 4 RELEASE 我们有一个抽象 DAO 类 它扩展了org springframework orm jpa support JpaDaoSuppo
  • JavaScript 随机数一/零实现

    您好 我发现这段 JS 代码生成零或一 我不明白这里如何涉及管道 ORing var randomNum Math random 2 0 1 1 random number between 0 and 1 我找到了另一种方法 Math fl
  • 使用标准库将循环替换为 strtok

    我有一个 strtok 解决的问题 从字符串中分割子字符串 但我 意识到 strtok 不安全 我想使用 C 标准库的一些更现代的部分 我应该用什么来代替 static int ParseLine std string line std s
  • rvest 使用 javascript 进行网页抓取

    我正在尝试从中获取每日天气预报五三十八 https projects fivethirtyeight com election 2016 national primary polls democratic using rvest 但我感兴趣