Устранение неполадок при поиске в сети Google Sheets в R с использованием RSelenium и RCurl - PullRequest
0 голосов
/ 24 ноября 2018

Моя конечная цель состоит в том, чтобы удалить из Интернета страницу Таблица Озадаченная пинта для Montreal.

Я думаю, что мне нужно динамически удалить ( например, использовать RSelenium), поскольку интересующая меня таблица представляет собой JavaScript iframe - часть веб-страницы, которая отображает контент, независимыйего контейнера.

Некоторые предположили, что очистка непосредственно от источника этих iframes - это путь.Я использовал инструмент веб-разработчика Inspector в своем браузере firefox, чтобы найти src=, который выглядит как Google Sheets.

enter image description here

Во-первых, используйте robots.txt, чтобы убедиться, что нам разрешено очищать его от Google Sheets:

library(robotstxt)
paths_allowed("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=203220308")

Теперь, когда я знаю, что у меня есть разрешение, я попробовал пакет RCurl.Получить первую страницу очень просто:

library(RCurl)
sheet <- getForm("https://docs.google.com/spreadsheet/pub", hl = "en_US", key = "1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U", output = "csv", .opts = list(followlocation = TRUE, verbose = TRUE, ssl.verifypeer = FALSE))
df <- read.csv(textConnection(sheet))
head(df)

Однако, когда вы нажимаете на любую из других Month/Year ссылок на этом Google Sheet gid= изменения URL-адреса.Например, на октябрь 2018 года это теперь:

https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=1367583807

Я не уверен, что можно очистить widget с RCurl?Если бы я хотел услышать как.

Похоже, мне, скорее всего, понадобится RSelenium, чтобы сделать это.

library(RSelenium)
# connect to a running server
remDr <- remoteDriver(
  remoteServerAddr = "192.168.99.100",
  port = 4445L
)
remDr$open()
# navigate to the site of interest
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=203220308")

Моя проблема пытается получитьHTML для таблицы на этой странице, следующее было предложено для SO , но не работает для меня (он не возвращает ожидаемый результат, только Month/Year метаданные из ссылок / элементов)?

library(XML)
doc <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc)

Я считаю, что мне нужно перейти к внутренней рамке, но не знаете, как это сделать?Например, при поиске тега CSS для этой таблицы с SelectorGadget в chrome, я получаю предупреждение о том, что это iframe, и чтобы иметь возможность выбирать его, мне нужно щелкнуть ссылку.

enter image description here

Когда я использую эту ссылку с readHTMLTable(), я получаю необходимую информацию:

remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pubhtml/sheet?headers=false&gid=203220308")
doc <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc)

enter image description here

Это создает проблему, так как мне нужно использовать RSelenium для навигации по различным страницам / таблицам предыдущей ссылки (виджет iframe):

remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=203220308")

Для навигации по различным страницам / таблицам я использую SelectorGadget , чтобы найти CSS теги

# find all elements/links
webElems <- remDr$findElements(using = "css", ".switcherItem")
# Select the first link (October 2018)
webElem_01 <- webElems[[1]]

Затем с помощью TightVNC viewer Я подтвердил, что я былвыделив нужный элемент, затем «щелкните» элемент (в данном случае ссылка October 2018).

webElem_01$highlightElement()

enter image description here

webElem_01$clickElement()

Так как яЯ вижу, что страница изменилась на TightVNC Я предполагаю, что здесь больше не требуется никаких шагов, прежде чем захватывать / очищать, но, как уже упоминалось, мне нужен способ программного перехода к внутреннему iframe каждой из этих страниц.

ОБНОВЛЕНИЕ

Хорошо, я понял, как перейти к внутреннему фрейму с помощью команды remDr$switchToFrame(), но я не могуКажется, выясняется, как вернуться к внешнему фрейму, чтобы «щелкнуть» по следующей ссылке и повторить процесс.Моя нынешняя хакерская попытка будет включать в себя возвращение на главную страницу и повторение этого процесса много раз:

# navigate to the main page
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156")
# look for table
tableElem <- remDr$findElement(using = "id", "pageswitcher-content")
# switch to table
remDr$switchToFrame(tableElem)
# parse html
doc <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc)

# how do I switch back to the outer frame?
# the remDr$goBack() command doesn't seem to do this

# workaround is to navigate back to the main page then navigate back to the second page and repeat process
remDr$navigate("https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true#gid=690408156")
webElems <- remDr$findElements(using = "css", ".switcherItem")
webElem_01 <- webElems[[1]]
webElem_01$clickElement()
tableElem <- remDr$findElement(using = "id", "pageswitcher-content")
# switch to table
remDr$switchToFrame(tableElem)
# parse html
doc2 <- htmlParse(remDr$getPageSource()[[1]])
readHTMLTable(doc2)

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

вам не нужен селен, просто извлеките gid или pageUrl из источника страницы

https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pub?output=html&widget=true

пример кода

items.push(
{
  name: "November 2018",
  pageUrl: "https:\/\/docs.google.comm\/.....&gid=690408156",
  gid: "690408156",
  initialSheet: ("690408156" == gid)
});
items.push(
{
  name: "October 2018",
  pageUrl: "https:\/\/docs.google.com\/.....&gid=1367583807",
  gid: "1367583807",
  initialSheet: ("1367583807" == gid)
});

URL результата:

https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pubhtml/sheet?headers=false&gid=690408156
https://docs.google.com/spreadsheets/d/1o1PlLIQS8v-XSuEz1eqZB80kcJk9xg5lsbueB7mTg1U/pubhtml/sheet?headers=false&gid=1367583807
0 голосов
/ 25 ноября 2018

Отметив, что я сделал в комментарии, это работает для ~ 19 URL:

library(googlesheets4)
library(rvest)

pg <- read_html("http://www.puzzledpint.com/standings/")

html_nodes(pg, xpath=".//iframe[contains(@src, 'sheet')]") %>% 
  html_attr("src") -> gsheet_urls

gsheet_urls[grepl("output=html", gsheet_urls, fixed=TRUE)] %>% 
  lapply(function(x) {
    read.csv(
      file =gsub("=true", "=false", gsub("=html", "=csv", x)),
      stringsAsFactors = FALSE
    )
  }) -> nineteen

str(nineteen, 1)
## List of 19
##  $ :'data.frame': 8 obs. of  6 variables:
##  $ :'data.frame': 37 obs. of  7 variables:
##  $ :'data.frame': 35 obs. of  6 variables:
##  $ :'data.frame': 62 obs. of  6 variables:
##  $ :'data.frame': 34 obs. of  6 variables:
##  $ :'data.frame': 30 obs. of  11 variables:
##  $ :'data.frame': 24 obs. of  6 variables:
##  $ :'data.frame': 11 obs. of  6 variables:
##  $ :'data.frame': 9 obs. of  6 variables:
##  $ :'data.frame': 13 obs. of  6 variables:
##  $ :'data.frame': 36 obs. of  6 variables:
##  $ :'data.frame': 9 obs. of  6 variables:
##  $ :'data.frame': 13 obs. of  6 variables:
##  $ :'data.frame': 29 obs. of  6 variables:
##  $ :'data.frame': 45 obs. of  6 variables:
##  $ :'data.frame': 34 obs. of  6 variables:
##  $ :'data.frame': 22 obs. of  6 variables:
##  $ :'data.frame': 3 obs. of  6 variables:
##  $ :'data.frame': 14 obs. of  6 variables:

У всех из pubhtml экспорт CSV явно запрещен без разрешения.

...