【问题标题】:Extract table from从中提取表
【发布时间】:2017-04-28 20:05:53
【问题描述】:

我想使用来自http://finra-markets.morningstar.com/BondCenter/TRACEMarketAggregateStats.jsp 的 rvest 提取下表(对于任何日期):

我尝试了以下方法,但没有产生任何结果:

library(rvest)

url <- "http://finra-markets.morningstar.com/BondCenter/TRACEMarketAggregateStats.jsp"

htmlSession <-html_session(url)            ## create session

goForm <- html_form(htmlSession)[[2]]   ## pull form from session

#filledGoForm <- set_values(goForm, value="04/26/2017") # This does not work

filledGoForm <- goForm
filledGoForm$fields[[1]]$value <- "04/26/2017"

htmlSession <- submit_form(htmlSession, filledGoForm)

> htmlSession <- submit_form(htmlSession, filledGoForm)
Submitting with ''
Warning message:
In request_POST(session, url = url, body = request$values, encode = request$encode,  :
  Not Found (HTTP 404).

任何关于如何做到这一点的提示都非常感谢。

【问题讨论】:

    标签: r web-scraping rvest


    【解决方案1】:

    该站点使用许多 XHR 请求来填充表格。并且,它使用隐藏的POST 请求建立一个服务器会话,该请求不会被html_session() 复制。

    我们需要添加httr 以获得帮助:

    library(httr)
    library(rvest)
    

    我们需要做的第一件事就是点击网站,将初始的qs_wid cookie 放入隐式 cookie jar curl/httr/rvest 分享:

    init <- GET("http://finra-markets.morningstar.com/MarketData/Default.jsp")
    

    接下来,我们需要模仿网页所做的隐藏“登录”:

    nxt <- POST(url = "http://finra-markets.morningstar.com/finralogin.jsp", 
                body = list(redirectPage = "/BondCenter/TRACEMarketAggregateStats.jsp"), 
                encode = "form")
    

    这会在服务器后端创建一个会话,并在我们的 cookie jar 中放置一些其他 cookie。

    最后:

    GET(
      url = "http://finra-markets.morningstar.com/transferPage.jsp", 
      query = list(
        `path`="http://muni-internal.morningstar.com/public/MarketBreadth/C",
        `date`="04/24/2017",
        `_`=as.numeric(Sys.time())
      )
    ) -> res
    

    发出请求。您可以从所有三个步骤(一起)中创建一个函数,并将最后一个 GET 参数化。

    不幸的是,这会返回一个非常损坏的 HTML &lt;table&gt;html_table() 无法自动为您转换为数据框,但这不应该阻止您:

    content(res) %>%
      html_nodes("td") %>% 
      html_text() %>% 
      matrix(ncol=4, byrow=TRUE) %>% 
      as_data_frame() %>% 
      mutate_all(as.numeric) %>% 
      rename(all_issues=V1, investment_grade=V2, high_yield=V3, convertible=V4) %>% 
      mutate(category = c("total_issues_traded", "advances", "declines", "unchanged", "high_52", "low_52", "dollar_volume"))
    
    ## # A tibble: 7 × 5
    ##   all_issues investment_grade high_yield convertible            category
    ##        <dbl>            <dbl>      <dbl>       <dbl>               <chr>
    ## 1       7983             5602       2194         187 total_issues_traded
    ## 2       3025             1798       1100         127            advances
    ## 3       4448             3575        824          49            declines
    ## 4        124               42         75           7           unchanged
    ## 5        257               66        175          16             high_52
    ## 6        139              105         33           1              low_52
    ## 7      22601            16143       5742         715       dollar_volume
    

    要获取其他数据表,请转到浏览器中的“开发人员工具”选项(如果您没有,请切换到具有该选项的选项……鉴于您正在处理金融事务和 IE/Edge,您可能在 Windows 上不是很好的内省浏览器)并刷新页面以查看发出的其他请求。

    【讨论】:

    • 这在相当长的一段时间内都能完美运行。谢谢。不幸的是,它不再。我一直没有得到任何回应。有什么提示要改变什么才能让它再次工作吗?
    • 您是否在打开开发者工具的情况下重新检查了目标 URL,以查看是否有任何 XHR 请求已更改和/或查看目标 URL 的来源以查看结构是否变了吗?
    • 是的@hrbrmstr 我已经检查了 URL。他们还是一样的。也是查询的参数。不幸的是,它返回空内容响应。我可以将这些事实(URL 和内容以及响应放在某处,如果对您有帮助的话)。
    猜你喜欢
    • 2018-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多