【问题标题】:Scraping with R, how to extract var用R刮,如何提取var
【发布时间】:2017-09-27 10:51:14
【问题描述】:
require(httr)
require(XML)
basePage <- "http://bet.hkjc.com/"
h <- handle(basePage)
GET(handle = h)
res <- GET(handle = h, path = "racing/pages/odds_wp.aspx?date=27-09-2017&venue=HV&raceno=2")
resXML <- htmlParse(content(res, as = "text"))

我使用上面的代码来抓取一个 aspx。网站。它返回了一堆文本。但是我只对获取“var infoDivideByRace”、“var scratchList”感兴趣。请问如何把这两个变量提取出来转成列数据?谢谢!部分回报如下:

var poolSellStatus = '1@@@@@@;WIN;PLA;W-P;QIN;QPL;QQP;TRI;DBL;TCE;F-F;QTT;CWA;'.split('@@@');
var poolSellStatus_bak = '1@@@@@@;WIN;PLA;W-P;QIN;QPL;QQP;TRI;DBL;TCE;F-F;QTT;CWA;'.split('@@@');
var winOddsByRace = '175852@@@@@@WIN;1=3.6=1;2=4.7=0;3=43=0;4=11=0;5=29=0;6=9.4=0;7=4.6=0;8=11=0;9=52=0;10=82=0;11=52=0;12=8.6=0#PLA;1=1.4=1;2=2.0=0;3=6.0=0;4=3.5=0;5=6.2=0;6=2.6=0;7=2.0=0;8=4.2=0;9=7.9=0;10=11=0;11=8.4=0;12=2.5=0'.split('@@@');
var multiRacePoolsStr = '@@@DBL#;1,2;2,3;3,4;4,5;5,6;6,7;7,8@@@TBL#;6,7,8@@@D-T#;3,4;6,7@@@T-T#;4,5,6@@@6UP#;3,4,5,6,7,8';
var fieldSize = 'HV;12;12;12;12;12;12;12;12';
var fieldSizeWithReserve = 'HV;12;12;12;12;12;12;12;12';
var reserveList = 'HV';
var scratchList = 'HV';

【问题讨论】:

    标签: r screen-scraping


    【解决方案1】:

    最简单或最合适的方法是使用 Phantomjs 或 selenium。如果没有,Regexrvest 可以解决。

    library(rvest)
    
    basePage <- "http://bet.hkjc.com/"
    
    ss <- paste0(basePage,path)
    
    path = "racing/pages/odds_wp.aspx?date=27-09-2017&venue=HV&raceno=2"
    
    scripts <- read_html(ss, encoding = 'utf8') %>% 
        html_nodes("script") %>% html_text(trim=TRUE)
    
    new <- scripts[grepl('var scratchList =|var infoDivideByRace = ',scripts)]
    
    value1 <- str_replace_all(strsplit(str_extract(new,regex('var scratchList = (.*?);')), split=' ')[[1]][4],";|'",'')    
    value2 <- str_replace_all(strsplit(str_extract(new,regex('var infoDivideByRace = (.*?);')),split=' ')[[1]][4],";|'",'')
    
    value1
    #[1] "HV"
    
    value2
    

    【讨论】:

      【解决方案2】:

      使用 V8 包的替代选项:

      library(rvest)
      library(stringi)
      library(purrr)
      library(V8)
      

      获取你指定的页面内容:

      pg <- read_html("http://bet.hkjc.com/racing/pages/odds_wp.aspx?date=27-09-2017&venue=HV&raceno=2", encoding = "UTF-8")
      

      提取包含目标变量的脚本标签,将脚本标签转换为文本,拆分为字符向量,只保留var 行:

      html_nodes(pg, xpath=".//script[contains(., 'infoDivideByRace')]") %>% 
        html_text() %>% 
        stri_split_lines() %>% 
        flatten_chr() %>% 
        keep(stri_detect_regex, "^var") -> script_txt
      

      初始化 V8 javascript 引擎:

      ctx <- v8()
      

      让它解析javascript并创建数据:

      ctx$eval(script_txt)
      

      检索数据(infoDivideByRace 有 2 个空白数组元素,因此我们忽略它们):

      grep("^$", ctx$get('infoDivideByRace'), value=TRUE, invert=TRUE)
      ## [1] STACKOVERFLOW'S SPAM PROTECTION WON'T LET ME PASTE THIS CONTENT
      
      ctx$get('scratchList')
      [1] "HV"
      

      【讨论】:

      • 以上不起作用...它返回:flatten_chr(.) 中的错误:找不到函数“flatten_chr”
      • 我忘记了library(purrr)(我已添加到帖子中)
      猜你喜欢
      • 2018-03-26
      • 2018-06-20
      • 1970-01-01
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多