3

我正在研究国家发行的市政债券的项目,但我无法获取我的数据。使用 XML 包和下面的代码,我能够得到一些。

> nys="http://newyork.municipalbonds.com/bonds/issue/649787N87"
> nys.table=readHTMLTable(nys,asText=TRUE,which=4)
> nys.table=as.data.frame(nys.table)
> head(nys.table)
  Trade Date Trade Time Maturity Date Coupon   Price Yield Trade Amount      Trade Type
1 2012-09-27     2:49pm      2013-Apr 5.000% 102.522 0.289     $270,000 Investor bought
2 2012-09-27     1:17pm      2013-Apr 5.000% 102.290 0.712      $45,000    Inter-dealer

但该网站仅免费提供小样本。官方网站 EMMA 有免费的数据,但我很难抓取它。当我尝试与以前相同的方法时,我最终得到

nys="http://emma.msrb.org/SecurityView/SecurityDetailsTrades.aspx?cusip=649787N87"
nys.table=readHTMLTable(nys,asText=TRUE)
nys.table=as.data.frame(nys.table)
head(nys.table)

data frame with 0 columns and 0 rows

据我了解,并且我对此相当肯定,当您通过网络浏览器导航到它时,有一个标准的 T&C 页面。使用 htmlParse(nys) 后,输出与 T&C 页面的页面源代码相同,而不是数据实际所在的页面。因此,当代码运行时,它会尝试在 T&C 页面上查找表格。

我认为这将是一个相当普遍的问题,但到目前为止,我还没有找到任何有人遇到类似问题的帖子。如果有人能指出我正确的方向,我将不胜感激。

4

1 回答 1

6

我终于让它工作了。我必须在 Firefox 中使用 Web Developer,这使我能够查看该站点为 Disclaimer cookie 设置的名称/值对。这里是:

library(RCurl)
nys="http://emma.msrb.org/SecurityView/SecurityDetailsTrades.aspx?cusip=649787N87"
txt<-getURLContent(nys,cookie='Disclaimer=Ratings')
readHTMLTable(htmlParse(txt, asText = TRUE)) 

$ctl00_mainContentArea_tradeSearchResults
        Trade Date/Time   Settlement Date Price (%) Yield (%) Trade Amt ($) Trade Submission Type  
1   09/27/2012 : 02:49 PM      10/02/2012  102.5220     0.289       270,000       Customer bought  
2   09/27/2012 : 01:17 PM      10/02/2012    102.29     0.712        45,000    Inter-dealer Trade  
3   09/27/2012 : 01:17 PM      10/02/2012    102.29     0.712        45,000    Inter-dealer Trade  

要获得接下来的 100 行,您必须发布具有当前“视图状态”的表单:

# Get next set
viewstate=gsub('.*\"__VIEWSTATE\" value=\"([^\"]*)\".*','\\1',txt)

txt<-postForm(nys,
"__VIEWSTATE"=viewstate,
"__EVENTTARGET"="ctl00$mainContentArea$nextBottomButton",
.opts=list(cookie='Disclaimer=Ratings'))
readHTMLTable(htmlParse(txt, asText = TRUE)) 

$ctl00_mainContentArea_tradeSearchResults
        Trade Date/Time   Settlement Date Price (%) Yield (%) Trade Amt ($) Trade Submission Type  
1   06/27/2011 : 01:51 PM      06/30/2011  107.7350      0.65       600,000         Customer sold  
2   06/22/2011 : 12:05 PM      06/27/2011  107.1960     0.957         8,000       Customer bought  
3   06/22/2011 : 12:05 PM      06/27/2011  106.6960     1.226         8,000    Inter-dealer Trade  
于 2012-09-30T02:10:38.040 回答