2016-09-06 3 views
3

я наткнулся на набор данных общего пользования, что я не могу понять, как получить непосредственно в R. Как правило, я использую следующий код R для извлечения данных от сети:данных сайта Импорт SharePoint в R

temp <- tempfile() 
download.file("http://www.webaddress.com",temp) 
data <- read.csv(unz(temp, "name_of_file")) 
unlink(temp) 

Этот сайт SEC, однако, имеет меня немного смущенный о том, как получить его непосредственно в R. Одной из причин является то, что, когда вы щелкните правой кнопкой мыши по ссылке, вместо того, чтобы веб-адрес, вы получите следующий код:

javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions("ctl00$cphMain$lnkSECReport", "", false, "", "Content/BulkFeed/CompilationDownload.aspx?FeedPK=37264&FeedType=IA_FIRM_SEC", false, true)) 

Адрес: http://www.adviserinfo.sec.gov/IAPD/InvestmentAdviserData.aspx

Есть ли способ получить эти данные непосредственно в R? В настоящее время, я загружаю затем открыть с 7-Zip, сохранить в Excel, а затем импортировать в R.

обновленный код

library(httr) 
library(xml2) 

res <- POST(url = "http://www.adviserinfo.sec.gov/IAPD/Content/BulkFeed/CompilationDownload.aspx?FeedPK=37264&FeedType=IA_FIRM_SEC", 
      httr::add_headers(Origin = "http://www.adviserinfo.sec.gov"), 
      body = list(`__EVENTTARGET` = "ctl00$cphMain$lnkSECReport"), 
      encode = "form") 

writeBin(content(res, as="raw"), "report.gz") 
gzf <- gzfile("report.gz") 
doc <- read_xml(gzf) 
close(gzf) 


xml_find_all(doc, ".//Firms/Firm/Info") %>% 
    xml_attr("LegalNm") %>% 
    head(10) 
+0

Пробовали ли вы ссылку в этом коде? ... http://www.adviserinfo.sec.gov/IAPD/InvestmentAdviserData.aspx/Content/BulkFeed/CompilationDownload.aspx?FeedPK=37264&FeedType=IA_FIRM_SEC – cory

+0

Да. Спасибо. Теперь взглянуть на RCurl, который может предложить решение. Будет пост, если я могу его найти. – BlueDevilPride

+0

'a <- httr :: GET (url)', за которым следует 'httr :: content (a)' получает анализируемый XML-документ – cory

ответ

3

Это один из тех, кто действительно, ужасно, убогие сайты SharePoint, которые появляясь как сумасшедший почти по всем правительственным электронным инициативам в глобальном масштабе и делая данные более или менее непрозрачными.

Сказав это, я совершенно поражен, что это работает:

library(httr) 
library(xml2) 

res <- POST(url = "http://www.adviserinfo.sec.gov/IAPD/Content/BulkFeed/CompilationDownload.aspx?FeedPK=37264&FeedType=IA_FIRM_SEC", 
      httr::add_headers(Origin = "http://www.adviserinfo.sec.gov"), 
      body = list(`__EVENTTARGET` = "ctl00$cphMain$lnkSECReport"), 
      encode = "form") 

Я использовал curlconverter для извлечения веб-вызова после отмены прямой загрузки и просмотра рулонного вызова в инструментах разработчика (который должен был быть до перед началом загрузки).

Под «сырым», рассчитанная httr функция запроса выглядит следующим образом:

httr::VERB(verb = "POST", url = "http://www.adviserinfo.sec.gov/IAPD/Content/BulkFeed/CompilationDownload.aspx?FeedPK=37264&FeedType=IA_FIRM_SEC", 
      httr::add_headers(Origin = "http://www.adviserinfo.sec.gov", 
          `Accept-Encoding` = "gzip, deflate", `Accept-Language` = "en-US,en;q=0.8", 
          `Upgrade-Insecure-Requests` = "1", `User-Agent` = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36", 
          Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
          `Cache-Control` = "max-age=0", Referer = "http://www.adviserinfo.sec.gov/IAPD/InvestmentAdviserData.aspx", 
          Connection = "keep-alive", DNT = "1"), httr::set_cookies(ASP.NET_SessionId = "vp5bt2nrl5m3l4tqq4mkbfrz"), 
      body = list(`__EVENTTARGET` = "ctl00$cphMain$lnkSECReport", 
         `__EVENTARGUMENT` = "", `__VIEWSTATE` = "/wEPDwUIOTg2OTY2NjYPZBYCZg9kFgQCAQ8WAh4EVGV4dAUeSUFQRCAtIEludmVzdG1lbnQgQWR2aXNlciBEYXRhZAIDD2QWAgIFD2QWEAIDDw8WAh4LUG9zdEJhY2tVcmwFUn4vSUFQRC9Db250ZW50L0J1bGtGZWVkL0NvbXBpbGF0aW9uRG93bmxvYWQuYXNweD9GZWVkUEs9MzcyNjQmRmVlZFR5cGU9SUFfRklSTV9TRUMWAh4Hb25jbGljawWvAWdhKCdzZW5kJywgJ3BhZ2V2aWV3JywgeydwYWdlJzogJ34vSUFQRC9Db250ZW50L0J1bGtGZWVkL0NvbXBpbGF0aW9uRG93bmxvYWQuYXNweD9GZWVkUEs9MzcyNjQmRmVlZFR5cGU9SUFfRklSTV9TRUMnLCAndGl0bGUnOiAnSUFQRCAtIFNFQyBJbnZlc3RtZW50IEFkdmlzZXIgUmVwb3J0IChHWklQKSd9KTtkAgcPZBYCZg8PFgIfAAVKUmVwb3J0IGFzIG9mOiA8Yj5TZXB0ZW1iZXIgNiwgMjAxNjwvYj4gPGJyLz5BcHByb3hpbWF0ZSBmaWxlIHNpemU6IDM3IE1CICBkZAINDw8WAh8BBVR+L0lBUEQvQ29udGVudC9CdWxrRmVlZC9Db21waWxhdGlvbkRvd25sb2FkLmFzcHg/RmVlZFBLPTM3MjY1JkZlZWRUeXBlPUlBX0ZJUk1fU1RBVEUWAh8CBbMBZ2EoJ3NlbmQnLCAncGFnZXZpZXcnLCB7J3BhZ2UnOiAnfi9JQVBEL0NvbnRlbnQvQnVsa0ZlZWQvQ29tcGlsYXRpb25Eb3dubG9hZC5hc3B4P0ZlZWRQSz0zNzI2NSZGZWVkVHlwZT1JQV9GSVJNX1NUQVRFJywgJ3RpdGxlJzogJ0lBUEQgLSBTdGF0ZSBJbnZlc3RtZW50IEFkdmlzZXIgUmVwb3J... <truncated> 
         `__VIEWSTATEGENERATOR` = "C7F140E8", `__PREVIOUSPAGE` = "_n_AIWFFdFo0uFQroVexEbLyjk41mQczgUv0yM_5WfsMAs5Mr4_W9OsfhauW1md49E6AtLMLKvwsM3efjdsFxSQVs8m60rXjM2G3a38s-vs9jeifY7Z97KwNciQDnS3E0", 
         `__EVENTVALIDATION` = "/wEdAAQgBK7oCoSH1SyM/nnv4+7OQ6BBh5UglL0V4PbvTmfHL5ETgQBTBoVSpnQmZd0nxKz/1ubqHHzGDP0ztOLUKJjXWi90IlgKV4uaEBSHcRvGBiO1/K20oSh88Xa2qq9BBCI="), 
         encode = "form") 

и это был мой опыт, что эти действительно дурные сайты SharePoint нужны различные «состояния отображения» информации, но я выстрелил в сокращая и преобразуя вызов, и он работает (по крайней мере, через 2 минуты после того, как я отправился на сайт изначально).

Вы не из леса еще так:

res$headers$`content-type` 
## "application/x-gzip; charset=utf-8" 

даже если добавить:

`Accept-Encoding` = "gzip, deflate" 

к add_headers() вызову.

Таким образом, поскольку memDecompress() абсолютно бесполезная функция, вам нужно:

writeBin(content(res, as="raw"), "report.gz") 

Чтобы получить архив gzip содержимое в файл.

Теперь мы можем работать с ним напрямую:

gzf <- gzfile("report.gz") 

doc <- read_xml(gzf) 
## [1] "LAUNCH ANGELS MANAGEMENT COMPANY, LLC"  "JACOBSEN CAPITAL MANAGEMENT, LLC"   
## [3] "CORESTATES CAPITAL ADVISORS, LLC"   "MINNEAPOLIS PORTFOLIO MANAGEMENT GROUP, LLC" 
## [5] "SHANNON RIVER FUND MANAGEMENT, LLC"   "AAC BENELUX HOLDING BV"      
## [7] "WILLINK ASSET MANAGEMENT LLC"    "SPIVAK ASSET MANAGEMENT, LLC"    
## [9] "ANNALY MANAGEMENT COMPANY LLC"    "WOODMONT INVESTMENT COUNSEL, LLC"   
close(gzf) 

xml_find_all(doc, ".//Firms/Firm/Info") %>% 
    xml_attr("LegalNm") %>% 
    head(10) 

Я не пробовал, но я подозреваю, что вы можете взять с собой:

javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(
    -----> "ctl00$cphMain$lnkStateReport", 
    "", 
    false, 
    "", 
    -----> "Content/BulkFeed/CompilationDownload.aspx?FeedPK=37265&FeedType=IA_FIRM_STATE", 
    false, 
    true)) 

элементы, определенные -----> и поместить их в очевидные места в url и body области для получения другого контента.Эти параметры взяты из источника ссылок кнопки «Государственный инвестиционный советник».

Если вы действительно не хотите, чтобы написать содержание в файл, вы можете попробовать не подвергавшихся воздействию функции в альфа-пакет шахты раздувать архив gzip необработанный содержимое непосредственно в R:

devtools::install_git("https://gitlab.com/hrbrmstr/warc.gz") 

raw_report <- warc:::gzuncompress(content(res, as="raw"), 50*1024*1024) 
doc <- read_xml(raw_report) 
... 
+0

ВАУ! Спасибо, @hrbrmstr. Я рад, что я не единственный, кто был расстроен такими сайтами. Ваше решение великолепен, и я понятия не имею, как вы это поняли. :) Я вставил код обратно вверх. Но так как это ново для меня, как бы я потянул за весь фрейм данных? Прямо сейчас, я тяну LegalNm. Еще раз спасибо, это невероятно. – BlueDevilPride

+0

«Как я могу превратить этот уродливый беспорядок в XML-документ, созданный SEC в пьяном ступор», лучше, чем полностью отдельный вопрос SO. – hrbrmstr

Смежные вопросы