R 网页在几天内刮桌子

R 网页在几天内刮桌子,r,web-scraping,css-selectors,html-parsing,rvest,R,Web Scraping,Css Selectors,Html Parsing,Rvest,我一直在使用XML::readHTMLTable进行Web垃圾处理,现在我正在尝试学习如何在更细粒度的级别上进行垃圾处理。我的动机来自于在几天的时间里试图在一个网站上刮一张改变位置的桌子(例如,昨天是页面上的第四张桌子,今天是页面上的第二张桌子,等等)。我将使用一个网站发布各种运动的维加斯赔率作为一个例子,我将特别尝试提取NBA数据 URL1 = "http://www.scoresandodds.com/grid_20161123.html" URL2 = "http://www.scores

我一直在使用
XML::readHTMLTable
进行Web垃圾处理,现在我正在尝试学习如何在更细粒度的级别上进行垃圾处理。我的动机来自于在几天的时间里试图在一个网站上刮一张改变位置的桌子(例如,昨天是页面上的第四张桌子,今天是页面上的第二张桌子,等等)。我将使用一个网站发布各种运动的维加斯赔率作为一个例子,我将特别尝试提取NBA数据

URL1 = "http://www.scoresandodds.com/grid_20161123.html"
URL2 = "http://www.scoresandodds.com/grid_20161125.html"
您会注意到NBA表是
URL1
中的第一个表,也是
URL2
中的第二个表。认识到NBA是第一个表格,下面是我如何将其作为第一个URL:

library(XML)

URL1 = "http://www.scoresandodds.com/grid_20161123.html"
exTable = readHTMLTable(URL1)[[1]] %>%
# Find first blank, since NBA is the first table #
  head(which(exTable[,1] == "")[1] - 1)
然后我会从那里把它清理干净。我知道这不是最好的方法,甚至在考虑到我想循环很多天之前,因为所有需要进行的清洁工作。学习如何抓取网页表中的特定对象会更好


我已经尝试过使用
rvest
一些,我知道我可以获得类似于维加斯线路“td.line”的节点,但我在尝试为特定表格选择节点时迷失了方向(
css=“#nba>div.sport”
或其他什么?)。我不一定想要这个具体例子的答案,但学习如何做这个例子将使我能够将这些技能应用到许多其他案例中。提前感谢您的帮助。

您在这方面进展顺利;您需要一个更合适的CSS或XPath选择器。使用rvest,如果选择器足够好,您可以使用相同的代码获取这两个选项:

库(rvest)
URL1=”http://www.scoresandodds.com/grid_20161123.html"
URL2=”http://www.scoresandodds.com/grid_20161125.html"
html1%read_html()
df1%html_节点('#nba~div table')%>%html_table()
html2%read_html()
df2%html_节点('#nba~div table')%>%html_table()
str(df1)
#>“数据帧”:65 obs。共有7个变量:
#>$Team:chr“美国东部时间下午7:05”“701凤凰太阳”“702奥兰多魔术”“PHO-F-T.J.沃伦-?;电视:佛罗里达州广播公司,数字电视:654”。。。
#>$Open:chr“美国东部时间下午7:05”“206.5”“4.5”“PHO-F-T.J.Warren-?;TV:FS佛罗里达,DTV:654”。。。
#>美元线移动:chr“美国东部时间晚上7:05”“207.5/208/209.5”“-4-15/-4.5/-4.5-05”“PHO-F-T.J.Warren-?;电视:佛罗里达州财政部,数字电视:654”。。。
#>$Current:chr“美国东部时间晚上7:05”“210”“4”“PHO-F-T.J.Warren-?;电视:佛罗里达州财政司司长,数字电视:654”。。。
#>$Moneyline:chr“美国东部时间下午7:05”+155”-175“PHO-F-T.J.Warren-?;电视:佛罗里达财政司司长,数字电视:654”。。。
#>中场休息时间:chr“美国东部时间下午7:05”“109”“4”“PHO-F-T.J.Warren-?;电视:佛罗里达州财政司,数字电视:654”。。。
#>$Scores:chr“美国东部时间晚上7:05”“92210以下”“87决赛”“PHO-F-T.J.Warren-?;电视:佛罗里达州广播公司,数字电视:654”。。。
str(df2)
#>“数据帧”:75 obs。共有7个变量:
#>$Team:chr“东部时间下午1:05”“圣安东尼奥马刺701”“波士顿凯尔特人702”“电视:CSN新英格兰,FS西南,DTV:642676”。。。
#>$Open:chr“美国东部时间下午1:05”-2.5“203.5”电视:新英格兰中央电视台,FS西南,数字电视:642676”。。。
#>$Line移动:chr“美国东部时间下午1:05”-3/-3.5-15/-3.5”-199/200/201“电视:CSN新英格兰,FS西南,数字电视:642676”。。。
#>$Current:chr“美国东部时间下午1:05”-3.5-05“201.5”电视台:新英格兰中央电视台,FS西南,DTV:642676”。。。
#>$Moneyline:chr“美国东部时间下午1:05”-155“+135”电视台:新英格兰中央电视台,财政司司长西南部,数字电视台:642676”。。。
#>中场休息时间:chr“美国东部时间下午1:05”-4.5“106”电视:CSN新英格兰,FS西南,DTV:642676”。。。
#>$Scores:chr“美国东部时间下午1:05”“109Over 201.5”“103决赛”“电视:CSN新英格兰,FS西南,DTV:642676”。。。
在本例中,CSS选择器

  • 查找ID为nba的节点,然后
  • 在此之后查找
    div
    ,然后
  • 选择表中的
    节点
如果愿意,您可以用XPath编写同样的东西,这将允许您使用XML包。如果你想提高你的CSS选择器技能,这是有趣和有效的


如果你想一次抓取很多相似的URL,你可以把它们放在一个向量中,然后用
lappy
或者更方便的
purrr::map_df
对其进行迭代。负责地刮;在匿名函数中加入一个
Sys.sleep
调用,使其行为更像一个普通的站点访问者,这是一种很好的方式;您需要一个更合适的CSS或XPath选择器。使用rvest,如果选择器足够好,您可以使用相同的代码获取这两个选项:

库(rvest)
URL1=”http://www.scoresandodds.com/grid_20161123.html"
URL2=”http://www.scoresandodds.com/grid_20161125.html"
html1%read_html()
df1%html_节点('#nba~div table')%>%html_table()
html2%read_html()
df2%html_节点('#nba~div table')%>%html_table()
str(df1)
#>“数据帧”:65 obs。共有7个变量:
#>$Team:chr“美国东部时间下午7:05”“701凤凰太阳”“702奥兰多魔术”“PHO-F-T.J.沃伦-?;电视:佛罗里达州广播公司,数字电视:654”。。。
#>$Open:chr“美国东部时间下午7:05”“206.5”“4.5”“PHO-F-T.J.Warren-?;TV:FS佛罗里达,DTV:654”。。。
#>美元线移动:chr“美国东部时间晚上7:05”“207.5/208/209.5”“-4-15/-4.5/-4.5-05”“PHO-F-T.J.Warren-?;电视:佛罗里达州财政部,数字电视:654”。。。
#>$Current:chr“美国东部时间晚上7:05”“210”“4”“PHO-F-T.J.Warren-?;电视:佛罗里达州财政司司长,数字电视:654”。。。
#>$Moneyline:chr“美国东部时间下午7:05”+155”-175“PHO-F-T.J.Warren-?;电视:佛罗里达财政司司长,数字电视:654”。。。
#>中场休息时间:chr“美国东部时间下午7:05”“109”“4”“PHO-F-T.J.Warren-?;电视:佛罗里达州财政司,数字电视:654”。。。
#>$Scores:chr“美国东部时间晚上7:05”“92210以下”“87决赛”“PHO-F-T.J.Warren-?;电视:佛罗里达州广播公司,数字电视:654”。。。
str(df2)
#>“数据帧”:75 obs。共有7个变量:
#>$Team:chr“东部时间下午1:05”“圣安东尼奥马刺701”“波士顿凯尔特人702”“电视:CSN新英格兰,FS西南,DTV:642676”。。。
#>$Open:chr“美国东部时间下午1:05”-2.5”“203.5”“电视:新英格兰西南部南区