我正在从事一个研究国家发行的市政债券的项目,但我在获取数据时遇到了问题。使用 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
但是那个网站只免费提供了一小部分 sample 。官方网站 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 页面上查找表格。
我认为这将是一个相当普遍的问题,但到目前为止,我还没有找到任何有人遇到过类似问题的帖子。如果有人能指出我正确的方向,我将不胜感激。
最佳答案
我终于让它工作了。我不得不在 Firefox 中使用 Web Developer,这让我可以看到网站为免责声明 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 行,您必须发布一个具有当前“viewstate”的表单:
# 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
关于r - R 中的网页抓取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12657371/