使用 rvest 和 V8 进行 R Web 抓取

cra*_*rry 3 v8 r nodes web-scraping rvest

我正在尝试使用 R 来抓取https://www.rotowire.com/football/player.php?id=4307上的各种表格,但是由于他们使用 javascript,我遇到了一些障碍。我已经安装了 rvest 和 V8 库并尝试找到正确的节点,但是我很确定我没有正确指定正确的表节点。我咨询了网站所有者,他们同意人们抓取他们的数据。

\n\n

V8 网页包含一段用于抓取电子邮件地址的示例代码。我尝试修改该代码以适合我的目的。

\n\n
#Loading both the required libraries\nlibrary(rvest)\nlibrary(V8)\n\nlink <- \'https://www.rotowire.com/football/player.php?id=4307\'\nemailjs <- read_html(link) %>% html_nodes(\'div\') %>% html_nodes(\'basicStats\') %>% html_text()\n\nct <- v8()\nread_html(ct$eval(gsub(\'document.write\',\'\',emailjs))) %>% \n  html_text()\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有成功

\n\n

我也尝试过:

\n\n
emailjs <- read_html(link) %>% html_nodes(\'div\') %>% html_nodes(\'script\') %>% html_text()\nct <- v8()\nread_html(ct$eval(gsub(\'document.write\',\'\',emailjs))) %>% \n   html_text()\n
Run Code Online (Sandbox Code Playgroud)\n\n

也:

\n\n
emailjs <- read_html(link) %>% html_nodes(\'div\') %>% html_nodes(\'basicStats\') %>% html_text()\n
Run Code Online (Sandbox Code Playgroud)\n\n

第一个代码块失败是因为我错误地指定了节点,或者至少我认为这是原因。

\n\n

第二组代码会撤回所有内容,但会出现以下错误:

\n\n
Error in context_eval(join(src), private$context) : \n  ReferenceError: window is not defined\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果你查看源代码,表格的 HTML 开头为:

\n\n
>div id=\xe2\x80\x9cbasicStats\xe2\x80\x9d class=\xe2\x80\x9c\xe2\x80\x9d)\n
Run Code Online (Sandbox Code Playgroud)\n\n

289号线

\n\n

html:

\n\n
            <div class="p-page__middle-box">\n\n<div id="basicStats-header" class="p-page__section-head is-stats">NFL Stats</div>\n<div id="basicStats">\n    <div class="table-load"><div class="table-load__inner"><div class="loader"></div>Loading NFL Stats...</div></div>    </div>\n    <script async>\ndocument.addEventListener(\'rw:pp-data-available\', function(e){\n    var defaultData = { \'basic\': { \'body\': [], \'footer\': [] }};\n    var data = (e.detail) ? e.detail : defaultData;\n    var tableID = "basicStats";\n    var playerID = "4307";\n    var primaryStatCat = "Pass";\n\n    var stats = {\n    \'pass\': [\n        { id: \'passComp\', startOfGroup: true, header: [{ text: \'Passing\', colspan: 6, }, \'COMP\'], },\n        { id: \'passAtt\', header: [\'\', \'ATT\'], },\n        { id: \'passPct\', header: [\'\', \'PCT\'], },\n        { id: \'passYds\', header: [\'\', \'YDS\'], },\n        { id: \'passTD\', header: [\'\', \'TD\'], },\n        { id: \'passInt\', header: [\'\', \'INT\'], },\n    ],\n
Run Code Online (Sandbox Code Playgroud)\n

QHa*_*arr 5

如果您使用与页面更新内容相同的端点,则它可用。它返回包含所有信息的 json。

library(httr)
r <-GET("https://www.rotowire.com/football/ajax/player-page-data.php?id=4307&pos=QB&team=GB&opp=")
json <- content(r,as="parsed")
Run Code Online (Sandbox Code Playgroud)

用 json 做你想做的事。浏览此处的json或将 URL 粘贴到 FireFox 浏览器中。


您可以在网络选项卡中找到该网址

在此输入图像描述