使用 rvest 和 V8 进行 R Web 抓取
R Web Scraping with rvest and V8
我正在尝试使用 R 在 https://www.rotowire.com/football/player.php?id=4307 上抓取各种 table,但是由于他们使用 javascript,我遇到了一些障碍。我已经安装了 rvest 和 V8 库并试图找到合适的节点,但是我很确定我没有正确指定合适的 table 节点。我咨询了网站所有者,他们同意人们抓取他们的数据。
V8 网页包含一段用于抓取电子邮件地址的示例代码。我试图修改该代码以适合我的目的。
#Loading both the required libraries
library(rvest)
library(V8)
link <- 'https://www.rotowire.com/football/player.php?id=4307'
emailjs <- read_html(link) %>% html_nodes('div') %>% html_nodes('basicStats') %>% html_text()
ct <- v8()
read_html(ct$eval(gsub('document.write','',emailjs))) %>%
html_text()
没有成功
我也试过:
emailjs <- read_html(link) %>% html_nodes('div') %>% html_nodes('script') %>% html_text()
ct <- v8()
read_html(ct$eval(gsub('document.write','',emailjs))) %>%
html_text()
以及:
emailjs <- read_html(link) %>% html_nodes('div') %>% html_nodes('basicStats') %>% html_text()
第一段代码失败是因为我错误地指定了节点,或者至少我认为这是原因。
第二组代码撤回所有内容,但出现以下错误:
Error in context_eval(join(src), private$context) :
ReferenceError: window is not defined
如果您查看源代码 HTML,table 开头为:
>div id=“basicStats” class=“”)
第 289 行
html:
<div class="p-page__middle-box">
<div id="basicStats-header" class="p-page__section-head is-stats">NFL Stats</div>
<div id="basicStats">
<div class="table-load"><div class="table-load__inner"><div class="loader"></div>Loading NFL Stats...</div></div> </div>
<script async>
document.addEventListener('rw:pp-data-available', function(e){
var defaultData = { 'basic': { 'body': [], 'footer': [] }};
var data = (e.detail) ? e.detail : defaultData;
var tableID = "basicStats";
var playerID = "4307";
var primaryStatCat = "Pass";
var stats = {
'pass': [
{ id: 'passComp', startOfGroup: true, header: [{ text: 'Passing', colspan: 6, }, 'COMP'], },
{ id: 'passAtt', header: ['', 'ATT'], },
{ id: 'passPct', header: ['', 'PCT'], },
{ id: 'passYds', header: ['', 'YDS'], },
{ id: 'passTD', header: ['', 'TD'], },
{ id: 'passInt', header: ['', 'INT'], },
],
如果您使用与页面相同的端点来更新 content.It returns 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")
用 json 做你想做的事。在 FireFox 浏览器中探索 json here 或粘贴 URL。
您可以在网络选项卡中找到url
我正在尝试使用 R 在 https://www.rotowire.com/football/player.php?id=4307 上抓取各种 table,但是由于他们使用 javascript,我遇到了一些障碍。我已经安装了 rvest 和 V8 库并试图找到合适的节点,但是我很确定我没有正确指定合适的 table 节点。我咨询了网站所有者,他们同意人们抓取他们的数据。
V8 网页包含一段用于抓取电子邮件地址的示例代码。我试图修改该代码以适合我的目的。
#Loading both the required libraries
library(rvest)
library(V8)
link <- 'https://www.rotowire.com/football/player.php?id=4307'
emailjs <- read_html(link) %>% html_nodes('div') %>% html_nodes('basicStats') %>% html_text()
ct <- v8()
read_html(ct$eval(gsub('document.write','',emailjs))) %>%
html_text()
没有成功
我也试过:
emailjs <- read_html(link) %>% html_nodes('div') %>% html_nodes('script') %>% html_text()
ct <- v8()
read_html(ct$eval(gsub('document.write','',emailjs))) %>%
html_text()
以及:
emailjs <- read_html(link) %>% html_nodes('div') %>% html_nodes('basicStats') %>% html_text()
第一段代码失败是因为我错误地指定了节点,或者至少我认为这是原因。
第二组代码撤回所有内容,但出现以下错误:
Error in context_eval(join(src), private$context) :
ReferenceError: window is not defined
如果您查看源代码 HTML,table 开头为:
>div id=“basicStats” class=“”)
第 289 行
html:
<div class="p-page__middle-box">
<div id="basicStats-header" class="p-page__section-head is-stats">NFL Stats</div>
<div id="basicStats">
<div class="table-load"><div class="table-load__inner"><div class="loader"></div>Loading NFL Stats...</div></div> </div>
<script async>
document.addEventListener('rw:pp-data-available', function(e){
var defaultData = { 'basic': { 'body': [], 'footer': [] }};
var data = (e.detail) ? e.detail : defaultData;
var tableID = "basicStats";
var playerID = "4307";
var primaryStatCat = "Pass";
var stats = {
'pass': [
{ id: 'passComp', startOfGroup: true, header: [{ text: 'Passing', colspan: 6, }, 'COMP'], },
{ id: 'passAtt', header: ['', 'ATT'], },
{ id: 'passPct', header: ['', 'PCT'], },
{ id: 'passYds', header: ['', 'YDS'], },
{ id: 'passTD', header: ['', 'TD'], },
{ id: 'passInt', header: ['', 'INT'], },
],
如果您使用与页面相同的端点来更新 content.It returns 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")
用 json 做你想做的事。在 FireFox 浏览器中探索 json here 或粘贴 URL。
您可以在网络选项卡中找到url