R очистка веб-страниц с помощью rvest и V8

#r #web-scraping #nodes #v8 #rvest

#r #очистка веб-страниц #узлы #v8 #rvest

Вопрос:

Я пытаюсь использовать R для очистки различных таблиц на https://www.rotowire.com/football/player.php?id=4307 однако из-за того, что они используют javascript, я столкнулся с несколькими проблемами. Я установил библиотеки rvest и V8 и попытался найти нужные узлы, однако я уверен, что неправильно указываю правильные узлы таблицы. Я связался с владельцами веб-сайтов, и они согласны с тем, что люди очищают свои данные.

Веб-страница 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-код, таблица начинается с:

 >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'], },
    ],
  

Комментарии:

1. Вероятно, javascript, а не java

2. html_nodes('basicStats') не будет работать, потому что нет элемента xml этого типа. Для того, чтобы указать идентификатор, который вы бы использовали html_nodes('#basicStats') , и для класса, который вы бы использовали html_nodes('.basicStats') , что, по сути, означает поиск любого типа узла (таблица, div, абзац и т. Д.) С идентификатором basicStats .

3. К вашему сведению, вы можете объединить свои вызовы узлов, выполнив что-то вроде html_nodes('div#basicStats') поиска любого div с идентификатором basicStats. Однако обратите внимание, что это ВСЕГДА будет возвращать 1 узел (не узлы), потому что basicStats — это идентификатор, а не класс. Так что вы могли бы сделать html_node('div#basicStats') .

4. Я попробовал: emailjs <- read_html(link) %>% html_node(‘div#basicStats’) %>% html_text() read_html(ct $eval(gsub(‘document.write’,»,emailjs))) %>% html_text() Ошибка в context_eval(join(src), частный $context) : ошибка синтаксиса: неожиданный идентификатор

Ответ №1:

Это доступно, если вы используете ту же конечную точку, что и страница, для обновления содержимого.Он возвращает json со всей информацией.

 library(httr)
r <-GET("https://www.rotowire.com/football/ajax/player-page-data.php?id=4307amp;pos=QBamp;team=GBamp;opp=")
json <- content(r,as="parsed")
  

Делайте с json все, что хотите. Изучите json здесь или вставьте URL-адрес в браузере FireFox.


Вы можете найти этот URL-адрес на вкладке сеть

введите описание изображения здесь