r
  • web-scraping
  • rvest
  • 2016-10-07 35 views 0 likes 
    0

    我試圖用rvest讓所有471案件在這個網站,但每次只能拿到25例(名單無論擴展與否)。任何幫助,將不勝感激。Webscraping與rvest

    library("rvest") 
    url <- "http://investmentpolicyhub.unctad.org/ISDS?status=100" 
    cases <- url %>% 
    read_html() %>% 
    html_nodes(xpath='//*[@id="cases-list"]') %>% 
    html_table() 
    View(cases) 
    

    謝謝。

    +3

    它使用一個XHR請求試圖加載XHR請求的URL,所以你需要使用RSelenium時加載額外的案件和Web服務器檢查的JavaScript。 – hrbrmstr

    回答

    4

    的問題是,你必須點擊「全部顯示」按鈕,顯示錶,你不能做rvest的其餘部分。因此,使用RSelenium導航和rvest解析,

    library(RSelenium) 
    library(rvest) 
    
    pJS <- phantom() # install PhantomJS if necessary 
    remDr <- remoteDriver(browserName = 'phantomjs') 
    
    remDr$open() 
    remDr$navigate(url) 
    
    button <- remDr$findElement(using = 'css selector', 'a#loadWholeList') 
    button$clickElement() 
    
    Sys.sleep(60) # or just wait a while, or rerun the following bits till they work 
    
    html <- remDr$getPageSource() 
    
    cases <- html[[1]] %>% read_html() %>% 
        html_node('table#cases-list') %>% 
        html_table() 
    
    if(nrow(cases) > 26){ 
        remDr$close() 
        pJS$stop() 
    } 
    

    因爲你引導[無頭]瀏覽器中的,單擊後位可能會給你25行或471行,這取決於如果表已完成加載。該表格非常大,所以加載需要一段時間,就像在普通瀏覽器中一樣。如果你沒有得到所有東西,請稍等一會,然後再次運行Sys.sleep後的行。

    有耐心,雖然:

    tail(cases[, 1:3]) 
    ##  No. Year of initiation   Short casename 
    ## 466 466    1995  Goetz v. Burundi (I) 
    ## 467 467    1995 Leaf Tobacco v. Albania 
    ## 468 468    1994 Gruslin v. Malaysia (I) 
    ## 469 469    1994 Saar Papier v. Poland (I) 
    ## 470 470    1993    AMT v. Zaire 
    ## 471 471    1987   AAPL v. Sri Lanka 
    
    +0

    Alistaire,非常感謝你的幫助。它工作得很好,但花了我一段時間纔得到phantomjs的工作,然後我注意到,我必須用471取代內部「if(nrow(cases)> 26)」,以獲得所有情況:)).. – user6934711

    +0

    ' remDr $ close()'和'pJS $ stop()'只需關閉遠程驅動程序和PhantomJS。他們被包裝在一個條件,所以他們不會運行,除非你有正確的數據。如果您要將條件更改爲471,則還應將其更改爲'> =',否則您將永遠不會關閉它們。 – alistaire

    相關問題