r
  • web-scraping
  • rvest
  • 2016-10-07 65 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

    相关问题