2014-05-22 3 views
2

Я могу webscrape таблицу с веб-страницы, содержащей новостиR webscraping: допрашивая на дату

library(XML) 
webpage <- "http://www.tradingeconomics.com/calendar" 
tables <- readHTMLTable(webpage) 
n.rows <- unlist(lapply(tables, function(t) dim(t)[1])) 

dfcal <- as.data.frame(tables$calendar) 

Например, как я мог webscrape новости с января 2014 года? Я могу сделать это на веб-странице, изменив настройки кнопок, но как я могу это сделать изнутри R?

Также есть ли лучшие способы сбора экономических новостей изнутри R? Я смотрел на http://www.rseek.org/, но ничего не смог найти. Благодарим вас за помощь.

<form method="post" action="/calendar" id="aspnetForm"> 
<div class="aspNetHidden"> 
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> 
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> 
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" /> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 


<script type="text/javascript"> 
//<![CDATA[ 
var theForm = document.forms['aspnetForm']; 
if (!theForm) { 
theForm = document.aspnetForm; 
} 
function __doPostBack(eventTarget, eventArgument) { 
if (!theForm.onsubmit || (theForm.onsubmit() != false)) { 
    theForm.__EVENTTARGET.value = eventTarget; 
    theForm.__EVENTARGUMENT.value = eventArgument; 
    theForm.submit(); 
} 
} 
//]]> 
</script> 
+1

Необходимо использовать отправку запроса POST. что-то вроде 'library (Rcurl); doc <- postForm ("http://www.tradingeconomics.com/china/calendar", startDate = "2014-01-22", ...); readHTmlTable (doc)) ' – agstudy

ответ

1

Как @hrbrmstr отметил, вы можете управлять браузером с RSelenium и селеном:

require(RSelenium) 
RSelenium::startServer() 
remDr <- remoteDriver() 
remDr$open(); Sys.sleep(15); 
remDr$navigate("http://www.tradingeconomics.com/calendar") 
# get the DOM element for the custom date 
webElem <- remDr$findElement("xpath", "//a[@data-target=\"#datesDiv\"]") 
# send a click to the element using javascript 
remDr$executeScript("arguments[0].click();", list(webElem)) 
startDate <- remDr$findElement("id", "startDate") 
startDate$clearElement() 
startDate$sendKeysToElement(list("2014-01-01")) 
endDate <- remDr$findElement("id", "endDate") 
endDate$clearElement() 
endDate$sendKeysToElement(list("2014-01-31")) 

okButton <- remDr$findElement("id", "ctl00_ContentPlaceHolder1_ctl02_Button2") 
okButton$clickElement() 
Sys.sleep(15) 
wData <- remDr$getPageSource()[[1]] 

require(XML) 
tables <- readHTMLTable(wData) 
n.rows <- unlist(lapply(tables, function(t) dim(t)[1])) 
dfcal <- as.data.frame(tables$calendar) 

Данный скрипт открывает веб-страницу. Нажимает на пользовательскую дату. Введите соответствующие даты и нажмите кнопку ok. Затем выводится источник html страницы.

+0

Большое спасибо за вашу помощь. –

1

Я сделал перехват запроса (это находится в нижней части этого «ответа»). Это довольно уродливый вызов AJAX, поскольку он выглядит так (я не читал javascript страницы), он base64 кодирует что-то, называемое «состояние представления». Там также есть куки-файл, который может или не может быть важен. Из следующих параметров я понятия не имею, какие из них действительно необходимы, но вы можете увидеть все заголовки HTTP-запросов и параметры запроса. Попробуйте сыграть с ними в POST, как предлагалось @agstudy.

Другой вариант - использовать RSelenium, чтобы управлять браузером и царапать этот путь.


HTTP AJAX запрос перехватывают ниже:

POST /calendar HTTP/1.1 
Host: www.tradingeconomics.com 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:29.0) Gecko/20100101 Firefox/29.0 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
X-Requested-With: XMLHttpRequest 
X-MicrosoftAjax: Delta=true 
Cache-Control: no-cache 
Content-Type: application/x-www-form-urlencoded; charset=utf-8 
Referer: http://www.tradingeconomics.com/calendar 
Content-Length: 116721 
Cookie: ASP.NET_SessionId=k2tc0xaqplgnps01mleehdcw; _ga=GA1.2.721625302.1402653647 
Connection: keep-alive 
Pragma: no-cache 

ctl00%24AjaxScriptManager1%24ScriptManager1=ctl00%24ContentPlaceHolder1%24ctl02%24UpdatePanel1%7Cctl00%24ContentPlaceHolder1%24ctl02%24Button2&__EVENTTARGET=&__EVENTARGUMENT=&__LASTFOCUS=&__VIEWSTATE=GIANT_BASE64_STRING_THAT_I_REMOVED&srch-term=&ctl00%24ContentPlaceHolder1%24ctl02%24startDate=2014-01-01&ctl00%24ContentPlaceHolder1%24ctl02%24endDate=2014-01-31&ctl00%24ContentPlaceHolder1%24ctl02%24DropDownListTimezone=-300&ctl00%24ContentPlaceHolder1%24ctl02%24Country=top&ctl00%24ContentPlaceHolder1%24ctl02%24Category=&ctl00%24ContentPlaceHolder1%24ctl02%24Importance=&__ASYNCPOST=true&ctl00%24ContentPlaceHolder1%24ctl02%24Button2=ok 
Смежные вопросы