python - 如何抓取这个 squawka 页面?

标签 python r python-2.7 web-scraping screen-scraping

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

在页面上

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

按下红色的“完整统计”按钮会打开一个菜单,其中包括(在左侧)按钮“Crosses”。这会在屏幕右侧打开一个足球场的图像,上面有 19 个箭头,这些是斯托克城在斯托克城与阿森纳队的比赛中的传中。它们采用颜色编码,红色 = 未完成,绿色 = 完成,黄色 = 关键通过。 当你点击一个箭头时,它会告诉你谁传球了,在比赛的哪一分钟传球。 此外,箭头显示了球员传球时所站的位置以及传球给球员的位置。

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

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

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

虽然我过去也抓取过网页,但这些都是相当简单的静态页面,我完全不知道如何从这个页面抓取信息。 我非常感谢有关如何抓取我刚才描述的数据的帮助。我精通 R,因此我特别感谢可以帮助我在 R 中实现此目的的代码,但我也非常感谢使用其他语言或软件的帮助。

谢谢, 彼得

最佳答案

Peter 正如他们所说的那样,您可以使用 Selenium 做到这一点。我也喜欢使用优秀的 selectr package 这个想法是与网站进行短暂的互动,然后在其他地方做剩下的事情。 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 basics 查看有关操作的基本插图。和 RSelenium: Testing Shiny apps .

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

> 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

关于python - 如何抓取这个 squawka 页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22121006/

相关文章:

python - django:自动检测数据库上所做的 CRUD 更改

python - 如何使用 Tornado 网络服务器进行点对点视频聊天

python - 单步执行时应用GDB FrameDecorator

R:编译问题

python - 为什么在 Python 中使用 super() 时必须给出类名

python - 如何获取服务器的 IPMI 地址?

r - (R 统计包)对于向量中的每个值,计算该值在不同向量中出现的次数

r - 根据另一列的可用值动态替换一列的值

python - Pygame - Sprite 与 Sprite 组的碰撞

python - 如何创建复杂类型的字典对象