使用 POST 在 R 中抓取动态表

2024-02-14

我正在努力刮这张桌子 http://myfwc.com/wildlifehabitats/managed/alligator/harvest/data-export/使用 R。到目前为止,我使用下面的代码只得到了 27 行。我想取回所有条目,并且理想情况下修改请求,以便我可以选择某些年份等。关于 SO 的其他问题针对的情况略有不同,我想将其保留在 rvest-xml2-httr 世界中,如果可能的话。

url <- "http://myfwc.com/wildlifehabitats/managed/alligator/harvest/data-export/"


view <- httr::POST(url) %>% 
  xml2::read_html() %>% 
  rvest::html_nodes("input[name='__VIEWSTATE']") %>% 
  rvest::html_attr("value")

param <- list(`__EVENTTARGET` =     "",
               `__EVENTARGUMENT` =  "",
               `__VIEWSTATE` = view,
               `ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl00$RefreshButton` = "",
               `ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_Year` = "",
               `ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_AreaNumber` = "",
               `ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_AreaName` =   "",
               `ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl03$ctl01$PageSizeComboBox` = "10000",
               `ctl00_ctl00_ctl00_ctl00_ctl00_ContentPlaceHolderDefault_pageBody_pageBody_rightColumn_ctl01_AlligatorHarvestExport_6_RadGrid1_ctl00_ctl03_ctl01_PageSizeComboBox_ClientState` = "",
               `ctl00_ctl00_ctl00_ctl00_ctl00_ContentPlaceHolderDefault_pageBody_pageBody_rightColumn_ctl01_AlligatorHarvestExport_6_RadGrid1_rfltMenu_ClientState` = "",
               `ctl00_ctl00_ctl00_ctl00_ctl00_ContentPlaceHolderDefault_pageBody_pageBody_rightColumn_ctl01_AlligatorHarvestExport_6_RadGrid1_ClientState` =    "",
               `__VIEWSTATEGENERATOR` = "CA0B0334")

request <- httr::POST(url,
                       body = param,
                       encode = 'form') %>% 
  xml2::read_html() %>% 
  rvest::html_table(fill = T)

tib <- request[[1]]

> dim(tib)
[1] 27  9

相关表格有一个“导出为 CSV”链接:

如果你点击它,你会直接得到6.36MB的CSV文件,这很好。我假设您需要/想要以编程方式执行此操作,所以这对我有用:

以编程方式进行的步骤“单击导出至 CSV”

  1. I'm using Firefox, but Chrome has a similar capability: Inspector. I opened it (Ctrl-Shift-I) and went to the "Network" tab.
  2. 单击“导出为 CSV”按钮。您应该在检查器框架中看到一个新的“POST”行。当它完成时...
  3. 右键单击“POST”行并选择“复制POST数据”;这提供了:

    __EVENTTARGET
    __EVENTARGUMENT
    __VIEWSTATE=...
    ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl00$ExportToCsvButton=+
    ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_Year
    ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_AreaNumber
    ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl03$FilterTextBox_AreaName
    ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl03$ctl01$PageSizeComboBox=20
    ctl00_ctl00_ctl00_ctl00_ctl00_ContentPlaceHolderDefault_pageBody_pageBody_rightColumn_ctl01_AlligatorHarvestExport_6_RadGrid1_ctl00_ctl03_ctl01_PageSizeComboBox_ClientState
    ctl00_ctl00_ctl00_ctl00_ctl00_ContentPlaceHolderDefault_pageBody_pageBody_rightColumn_ctl01_AlligatorHarvestExport_6_RadGrid1_rfltMenu_ClientState
    ctl00_ctl00_ctl00_ctl00_ctl00_ContentPlaceHolderDefault_pageBody_pageBody_rightColumn_ctl01_AlligatorHarvestExport_6_RadGrid1_ClientState
    __VIEWSTATEGENERATOR=CA0B0334
    

    (我用“替换了长的base64字符串...".) 值得注意的行是第四行,以$ExportToCsvButton=+。这是您需要包含在 POST 数据中的参数 (param).

  4. 使用上面的代码并包括定义param, 继续:

    param$`ctl00$ctl00$ctl00$ctl00$ctl00$ContentPlaceHolderDefault$pageBody$pageBody$rightColumn$ctl01$AlligatorHarvestExport_6$RadGrid1$ctl00$ctl02$ctl00$ExportToCsvButton` <- "+"
    request <- httr::POST(url, body = param, encode = 'form')
    

您现在将拥有:

request
# Response [http://myfwc.com/wildlifehabitats/managed/alligator/harvest/data-export/]
#   Date: 2017-06-01 18:09
#   Status: 200
#   Content-Type: text/csv; charset-UTF-8;
#   Size: 6.36 MB
# <U+FEFF>"Year","Area Number","Area Name","Carcass Size","Harvest Date","Location"
# "2000","101","LAKE PIERCE","11 ft. 5 in.","09-22-2000",""
# "2000","101","LAKE PIERCE","9 ft. 0 in.","10-02-2000",""
# "2000","101","LAKE PIERCE","8 ft. 10 in.","10-06-2000",""
# "2000","101","LAKE PIERCE","8 ft. 0 in.","09-25-2000",""
# "2000","101","LAKE PIERCE","8 ft. 0 in.","10-07-2000",""
# "2000","101","LAKE PIERCE","8 ft. 0 in.","09-22-2000",""
# "2000","101","LAKE PIERCE","7 ft. 2 in.","09-21-2000",""
# "2000","101","LAKE PIERCE","7 ft. 1 in.","09-21-2000",""
# "2000","101","LAKE PIERCE","6 ft. 11 in.","09-25-2000",""
# ...

旁注:网站以以下内容开头文件<U+FEFF>,一个 unicode 字符。这会抛出read.csv并给你一个列名X.U.FEFF.Year,完全是装饰性的。

保存到文件

如果您不关心建议的文件名,您可以简单地执行以下操作

write(as.character(request), file="quux.csv")

如果您想使用网站建议的文件名,您可以通过以下方式找到它:

httr::headers(request)$`content-disposition`
# [1] "inline;filename=\"FWCAlligatorHarvestData.csv\""

解析应该是直接的。

即时消费

如果您不想/不需要保存到中间文件,您始终可以立即使用它:

head(read.csv(textConnection(as.character(request))))
# Invalid encoding : defaulting to UTF-8.
#   X.U.FEFF.Year Area.Number   Area.Name Carcass.Size Harvest.Date Location
# 1          2000         101 LAKE PIERCE 11 ft. 5 in.   09-22-2000         
# 2          2000         101 LAKE PIERCE  9 ft. 0 in.   10-02-2000         
# 3          2000         101 LAKE PIERCE 8 ft. 10 in.   10-06-2000         
# 4          2000         101 LAKE PIERCE  8 ft. 0 in.   09-25-2000         
# 5          2000         101 LAKE PIERCE  8 ft. 0 in.   10-07-2000         
# 6          2000         101 LAKE PIERCE  8 ft. 0 in.   09-22-2000         
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 POST 在 R 中抓取动态表 的相关文章

  • stat_function 从函数生成平线

    我有以下代码 library ggplot2 f lt function x if x gt 2 1 x 0 3 else 0 graph lt ggplot data frame x c 0 10 aes x graph lt graph
  • ggplot 图例标签内的希腊字母、符号和换行符

    我在尝试着 有换行符 自动或强制 对齐文本 左对齐或左右对齐 有希腊字母和百分号 在 gglot 图例标签内 我尝试了几种方法 但我似乎无法将我读到的所有技巧结合起来 我可以通过插入来换行 n进入标签 但这似乎不适用于希腊字母 不适用于图例
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 在`rmarkdown`中,如何在句子中添加图标?

    In rmarkdown 如何在句子中添加图标 例如如下 如何添加markdown icon单词 Markdown 和 is 之间 有一个很好的 R 包 可以轻松下载 RMarkdown 文档并将图标添加到其中 icons https gi
  • R:ifelse 中的字符串列表

    我正在寻找与 MySQL 中的 where var in 语句类似的东西 我的代码如下 data lt data frame id 10001 10030 cc1 rep c a b c 10 attach data data new lt
  • R 错误:无法更改锁定绑定的值

    我试图估计无限数字流的平均值和标准差 当我运行代码时 出现错误消息 无法更改锁定绑定的值 我做了一些研究 发现这个错误与我使用全局变量有关 但我无法弄清楚 任何帮助将非常感激 在此先感谢您的帮助 define global variable
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • dplyr 中的标准评估:全局环境中的函数出现“无法找到函数”错误

    我试图在 dplyr 中对全局环境中的函数使用标准评估 但出现 无法找到函数 错误 这是一些代码 create data frame df lt data frame x rnorm 10 y rnorm 10 define arbitra
  • zsh:未找到命令:使用 Big Sur Mac 的终端上的 R

    我从官方 cran 网站安装了 R 我可以从 Rstudio 运行 R 但是当我尝试从终端使用 R 时 我得到以下结果 base ege Eges MBP R zsh command not found R base ege Eges MB
  • 为什么第二个 request.session cookies 返回空?

    我想使用 requests Session post 登录网站 但是当我已经登录主页 然后进入帐户页面时 看来cookies还没有保存 因为cookies是空的 而且我无法进入正确的帐户页面 import requests from bs4
  • R data.table 1.9.2 关于 setkey 的问题

    这似乎是 1 8 10 后引入的一个错误 与包含列表的 DT 的 setkey 相关 运行下面两个代码来查看问题 library data table dtl lt list dtl 1 lt data table scenario 1 p
  • 加速美丽汤

    我正在运行本课程网站的抓取工具 我想知道将页面放入 beautifulsoup 后是否有更快的方法来抓取页面 花费的时间比我预期的要长得多 Tips from selenium import webdriver from selenium
  • 如何在 R 中绘制一列与其余列的关系图

    我有一个数据集 其中 1 是时间 接下来的 14 个是幅度 我想在一张图表上散布所有大小与时间的关系 其中每个不同的列都是网格化的 分层在另一个之上 我想使用原始数据来制作这些图表 并单独制作它们 但只想执行此过程一次 数据集A 唯一的自变
  • 如何使用 BeautifulSoup 从表中选择特定行?

    So I have a question related to a previous question but I realized I needed to go one level more to get an 11 digit NDC
  • 如何在 R 中将字符串解析为层次结构或树

    有没有办法将表示组的字符串解析为 R 中的层次结构 假设我的小组结构如下 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 3 1 1 3 1 1 1 3 2 1 1 3 3 1 2 1 2 1 1 2 1 1 1 2 1 2 1
  • 读取R中打开的Excel文件

    有没有办法将打开的Excel文件读入R 当Excel中打开一个excel文件时 Excel会对文件加锁 比如R中的read方法无法访问该文件 你能绕过这个锁吗 Thanks 编辑 这发生在带有原始 Excel 的 Windows 下 发生错
  • 当有很多列时,使用 readr::read_csv() 导入数据时覆盖列类型

    我正在尝试使用 R 中的 readr read csv 读取 csv 文件 我导入的 csv 文件大约有 150 列 我只包含示例的前几列 我希望将第二列从默认类型 我执行 read csv 时为日期 覆盖为字符或其他日期格式 GIS Jo
  • R - 与 SpatialPolygonsDataFrame 对象相交的 SpatialLinesDataFrame 列表的嵌套循环

    我有一系列需要完成的步骤SpatialLinesDataFrame 此处的 线 基于对象与多特征中各个特征的关系SpatialPolygonsDataFrame 多边形 对象 简而言之 每个线列表元素源自单个面要素内部 并且可能会也可能不会
  • RStudio 如何确定控制台宽度,为什么它似乎总是出错?

    我刚刚发现wid lt options width在 RStudio 中 它似乎是我日常控制台使用中令人烦恼的根源 或者更确切地说 更接近根源 我应该先说一下 我目前使用的是 R 3 2 2 RStudio 0 99 491 Linux M
  • 如何绘制大时间序列(数千次给药次数/药物剂量)?

    我正在尝试绘制医院中如何开出单一药物的图解 在这个虚拟数据库中 我在 2017 年 1 月 1 日之后遇到了 1000 名患者 绘图的目的是了解该药物的给药模式 在接近入院 出院或患者住院期间是否更频繁 高剂量给药 Get random d

随机推荐

  • 动态代码生成

    我目前正在开发一个应用程序 您可以用它创建 程序 而无需编写源代码 如果您愿意 只需单击并播放即可 现在的问题是如何从我的数据模型生成可执行程序 有很多种可能性 但我不确定哪一种最适合我 我需要生成包含类和命名空间以及可以成为应用程序一部分
  • 谷歌应用程序脚本桌面IDE [重复]

    这个问题在这里已经有答案了 我喜欢将 Google Sheets 与应用程序脚本一起使用 但在线脚本 IDE 很麻烦 滞后 等 并且没有桌面 IDE 的许多便利 希望谷歌能在某个时候推出桌面IDE 有人知道制作 Google 应用程序脚本的
  • 传单中的javascript地图如何刷新

    我通过使用传单 API 在 javascript 中有一个基本的 geoJson 程序 div style width 100 height 400px div
  • 在 Laravel 8 中捕获 HTTP 客户端错误

    你如何捕捉抛出的错误HTTP客户端 https laravel com docs 8 x http client 例如超时 以便在您可以对错误执行任何操作以避免停止执行之前 它不会在 Laraval 调试器 在调试模式下 中抛出curl 错
  • 表视图中的文本标签太长,会影响正确的详细信息(detailTextLabel)被覆盖或不显示

    我已经为该单元格设置了一个文本 但是 它显示的文本太长 这会影响正确的详细文本被覆盖或不显示 我无法更改它 因为我需要下一个视图控制器中的名称 是否可以使其仅显示文本 后跟 EXAMPLE 电气电子工程 01 gt 传奇 Electrica
  • 如何在插件架构中做到免注册COM

    我们使用清单文件来实现免注册 COM 正如我在这另一个问题 https stackoverflow com questions 465882 generate manifest files for registration free com
  • 在哪里添加 String 原型

    我目前正在 Titanium Studio 中使用 JavaScript CommonJS 并且有一个关于原型设计的问题 假设我想向现有的类添加一个新函数 例如 String prototype trim function return t
  • 运行应用程序中的 Grails 3.0 静态 html

    之前曾就 grails 2 3 4 提出过类似的问题 我觉得很奇怪 我找不到一种方法来做到这一点 因为这对我来说似乎是一个标准用例 我只是想在运行 grails run app 时提供 html 页面 包括它们链接的 css 和 js An
  • 使用 asyncio 并行化生成器

    我的应用程序从慢速 I O 源读取数据 进行一些处理 然后将其写入本地文件 我已经用生成器实现了这个 如下所示 import time def io task x print requesting data for input s x ti
  • 您能否返回适用于任何可能的错误类型的结果?

    我想使用多个库 每个库都有自己的错误类型 我并不真正关心每个特定板条箱的错误类型 我想使用 习惯用法是使用那些返回 a 的 crate 的方法Result type 我也不想解开这些值 如果遇到错误 这会导致恐慌 我可能只是想使用传播不同的
  • 光滑的旋转木马 - 强制幻灯片具有相同的高度

    我在使用 Slick carousel JS 插件时遇到了多个问题幻灯片显示它们具有不同的高度 我需要幻灯片相同高度 但是对于 CSS flex box 它不起作用 因为幻灯片具有冲突的 CSS 定义 另外 我在论坛和网络上没有找到任何有用
  • 单例类与具有静态成员的类

    尽管关于该主题的主题有很多 但我仍然不清楚何时选择哪种方法 我希望通过讨论一个具体的例子 我最终能 明白 注意 我这里的语言是 Cocoa 尽管一般问题不是特定于语言的 我有一个类 TaskQueue 我想用它来 从我的代码中的任何位置访问
  • 在 Java 8 中使用两个具有相同签名的默认方法实现两个接口

    假设我有两个接口 public interface I1 default String getGreeting return Good Morning public interface I2 default String getGreeti
  • 如何将 jPCT 与 Vuforia SDK 结合使用?

    有人可以概述一下混合 Jpct 和 Qualcomm Vuforia SDK 的情况吗 将 Java 渲染引擎与 Vuforia 结合使用是个好主意吗 基本上 QCAR 的全部工作就是计算变形的预定义目标图像的变换矩阵 它为您提供了两个重要
  • 新的 Angular2 路由器配置

    回到使用已弃用的路由器时 我能够执行 router config 并传入一个对象 事实是 路由器本身在应用程序启动后进行了一些配置 该对象具有相同的 模板 就像我使用了 RouterConfig 一样 我正在寻找的是是否有一种方法可以像这样
  • POST 403 Forbidden for Chrome 扩展(后端为 Django)

    我以前从未开发过 Chrome 扩展程序 目前正在为我的 Django 应用程序开发 Chrome 扩展程序 具有链接提交功能 当我尝试使用扩展程序提交链接时 出现以下错误 POST http 127 0 0 1 8000 add link
  • 找到未使用的 Javascript 函数?

    我的应用程序中有大约 100 个 js 文件 我需要从这些文件中找到未使用的函数 哪个编辑器或工具可以帮助我 看看JSLint http jslint com help html代码质量工具
  • 如何在 Windows Phone 中对 LongListSelector 进行排序

    我希望能够按升序或降序对绑定到 LongListSelector 的数据进行排序 我无法将排序后的数据绑定到我的 LongListSelector 最初 我的解决方案没有尝试实现排序 而是有效的 但我相信在涉及排序时我遗漏了一些东西 我也尝
  • Google Play Android .apk 上传“无法运行 aapt dump badging”

    自从我上次将应用程序上传到 Google Play 开发者控制台以来已经快一年了 这是我已经签名并压缩对齐的 Cordova 应用程序 按照我过去成功使用的相同流程 我现在收到以下错误 上传失败 无法使用 aapt dump badging
  • 使用 POST 在 R 中抓取动态表

    我正在努力刮这张桌子 http myfwc com wildlifehabitats managed alligator harvest data export 使用 R 到目前为止 我使用下面的代码只得到了 27 行 我想取回所有条目 并