如何抓取此squawka页面?

发布于 2021-01-29 15:57:21

我正在尝试提取以下信息:

在页面上

http://epl.squawka.com/stoke-city-vs-arsenal/01-03-2014/english-barclays-
premier-league/matches

按下红色的“完整统计信息”按钮,将打开一个菜单,该菜单包括(左侧)“交叉”按钮。这将在屏幕的右侧打开带有19个箭头的足球场的图像,这些是斯托克在阿斯托纳(Stoke-
Arsenal)比赛中的传球。它们用颜色编码,红色=未完成,绿色=已完成,黄色=密钥通过。当您单击箭头时,它将告诉您谁给了通行证以及比赛的进行时间。同样,箭头表示玩家传球时站立的位置以及玩家被传给的位置。

我希望能够抓取此页面,以便获得带有列的表格:

球队; 发件人姓名;发件人位置;接收者的位置;分钟; 箭头的颜色

这是斯托克制造的一组传球,我也想为阿森纳自动重复此操作(因此,在上表中的“俱乐部”列)。

尽管我过去曾经抓过网页,但是这些都是静态的相当简单的页面,而我对于如何从该页面抓取信息完全感到傻眼。对于如何抓取我刚刚描述的数据,我将非常感激。我精通R,所以我特别喜欢可以帮助我在R中实现这一目标的代码,但是我也非常感谢使用其他语言或软件的帮助。

谢谢彼得

关注者
0
被浏览
46
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    彼得表示,您可以使用Selenium做到这一点。我还喜欢使用出色的选择器程序包。
    其想法是与网站进行短暂交互,然后在其他地方进行其余操作。squawkData应该包含所需的一切。

    # RSelenium::startServer() # if needed
    require(RSelenium)
    remDr <- remoteDriver()
    remDr$open()
    remDr$setImplicitWaitTimeout(3000)
    remDr$navigate("http://epl.squawka.com/stoke-city-vs-arsenal/01-03-2014/english-barclays-premier-league/matches")
    squawkData <- remDr$executeScript("return new XMLSerializer().serializeToString(squawkaDp.xml);", list())
    require(selectr)
    example <- querySelectorAll(xmlParse(squawkData[[1]]), "crosses time_slice")
    example[[1]]
    
    
    <time_slice name="0 - 5" id="1">
      <event player_id="531" mins="4" secs="39" minsec="279" team="44" type="Failed">
        <start>73.1,87.1</start>
        <end>97.9,49.1</end>
      </event>
    </time_slice>
    

    免责声明我是RSelenium软件包的作者。可以在RSelenium基础知识
    RSelenium:Testing
    Shiny应用程序中
    查看有关操作的基本信息

    使用选择器可以轻松访问更多信息:

    > xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "players #531 name")[[1]])
    [1] "Charlie Adam"
    
    > xmlValue(querySelectorAll(xmlParse(squawkData[[1]]), "game team#44 long_name")[[1]])
    [1] "Stoke City"
    

    更新:
    要将示例处理为数据框,您可以执行以下操作

    out <- lapply(example, function(x){
    # handle each event
      if(length(x['event']) > 0){
        res <- lapply(x['event'], function(y){
          matchAttrs <- as.list(xmlAttrs(y))
          matchAttrs$start <- xmlValue(y['start']$start)
          matchAttrs$end <- xmlValue(y['end']$end)
          matchAttrs
        })
        return(do.call(rbind.data.frame, res))
      }
    }
    )
    
    > head(do.call(rbind, out))
            player_id mins secs minsec team   type     start       end
    event         531    4   39    279   44 Failed 73.1,87.1 97.9,49.1
    event5        311    6   33    393   31 Failed 92.3,13.1 93.0,31.0
    event1        376    8   57    537   31 Failed  97.7,6.1 96.7,16.4
    event6        311   13   50    830   31 Failed  99.5,0.5 94.9,42.6
    event11       311   14   11    851   31 Failed  99.5,0.5 93.1,51.0
    event7        311   17   41   1061   31 Failed 99.5,99.5 92.6,50.1
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看