/ / Skrobanie stron WWW w R, wyodrębnianie adresów URL ze strony z leniwymi stronami ładującymi - r, xml, rvest, rcurl

Web scraping w R, wyodrębnianie adresów URL ze strony z leniwymi stronami ładującymi - r, xml, rvest, rcurl

Próbuję wyodrębnić adresy URL ze strony internetowejponiżej. Trudność polega na tym, że strona automatycznie ładuje nowe strony. Nie udało mi się zdobyć xpath do zeskanowania wszystkich adresów URL, w tym tych na nowo załadowanych stronach - udało mi się zdobyć tylko pierwszych 15 adresów URL (ponad 70). Zakładam, że xpath w ostatnim wierszu (new_results ...) brakuje jakiegoś ważnego elementu do uwzględnienia także dla kolejnych stron. Jakieś pomysły? Dziękuję Ci!

# load packages
library(rvest)
library(httr)
library(RCurl)
library(XML)
library(stringr)
library(xml2)


# aim: download all speeches stored at:
# https://sheikhmohammed.ae/en-us/Speeches

# first, create vector which stores all urls to each single speech
all_links <- character()
new_results <- "/en-us/Speeches"
signatures = system.file("CurlSSL", cainfo = "cacert.pem", package =  "RCurl")
options(RCurlOptions = list(verbose = FALSE, capath =  system.file("CurlSSL", "cacert.pem", package = "RCurl"), ssl.verifypeer = FALSE))

while(length(new_results) > 0){
new_results <- str_c("https://sheikhmohammed.ae", new_results)
results <- getURL(new_results, cainfo = signatures)
results_tree <- htmlParse(results)
all_links <- c(all_links, xpathSApply(results_tree,"//div[@class="speech-share-board"]", xmlGetAttr,"data-url"))
new_results <- xpathSApply(results_tree,"//div[@class="speech-share-board"]//after",xmlGetAttr, "data-url")}

# or, alternatively with phantomjs (also here, it loads only first 15 urls):
url <- "https://sheikhmohammed.ae/en-us/Speeches#"

# write out a script phantomjs can process
writeLines(sprintf("var page = require("webpage").create();
page.open("%s", function () {
console.log(page.content); //page source
phantom.exit();
});", url), con="scrape.js")

# process it with phantomjs
write(readLines(pipe("phantomjs scrape.js", "r")), "scrape.html")

Odpowiedzi:

1 dla odpowiedzi № 1

Uruchamianie Javascriptu do leniwego wczytywaniaRSelenium lub Selenium w Pythonie to najbardziej eleganckie podejście do rozwiązania problemu. Jednak jako mniej elegancka, ale szybsza alternatywa, można ręcznie zmienić ustawienia kwerendy json w funkcji modemu / sieci rozwoju firefox, aby załadować nie tylko 15, ale więcej (= wszystkich) wystąpień naraz. To działało dobrze dla mnie i udało mi się wyodrębnić wszystkie łącza za pośrednictwem odpowiedzi json.