使用 R 但'next page'按钮抓取网页只有事件'go to top'



我正在尝试使用 rvest 和 RSelenium 从当地报纸上抓取新闻文章的瓷砖。为了访问超过第一页的内容,我需要按"下一页"按钮。当我通过浏览器单击它时,它工作正常,但是当我通过 RSelenium 执行此操作时,没有任何反应。

我相信这个问题来自这样一个事实,即附加到"下一页"按钮的唯一jQuery事件是

function() {
moveScrollToTop()
}

我的问题是,该按钮如何导致在浏览器中更改页面内容? 我需要知道这一点才能尝试通过 R 激活该机制。

这是我试图抓取的网页,我所指的按钮class="next-button"

如果这是一个愚蠢的问题,我很抱歉,我对HTML和Javascript几乎一无所知。

我必须时刻的代码是:

# Load libraries and specify url
library(RSelenium)
library(rvest)
url <- 'https://www.elcolombiano.com/negocios/economia'
# Connect to server
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L)
remDr$open()
remDr$navigate(url)
# Find and click button
next_btn <- remDr$findElement(using = "css selector", ".next-button") 
next_btn$isElementEnabled() #Returns TRUE
next_btn$clickElement() # Returns no errors
Sys.sleep(5)
# Get source
html_data <- remDr$getPageSource()[[1]]
# Scrape titles
titles <- html_data %>% 
read_html() %>% 
html_nodes("#estraordinario .priority-content") %>% 
html_text()

看起来基本 URL 是"https://www.elcolombiano.com/negocios/economia#.p:2;"。 您可以创建所需 url 的列表,然后使用循环来抓取每个页面。 由于此页面使用javascript来加载页面,因此我能够使用phantomJS来加载正确的页面。
转到有关如何使用Phantom JS https://www.datacamp.com/community/tutorials/scraping-javascript-generated-data-with-r

下面是一个基本示例:

baseurl<-"https://www.elcolombiano.com/negocios/economia#.p:"
setwd("/Users/user/Documents/R_Files/phantom")
library(rvest)
page<-read_html('newpage.html')
urllist<-paste0(baseurl, 1:3)
for (url in urllist) {
print(url)
call<-paste("./phantomjs genericpage.js", url)
system(call)
page<-read_html('newpage.html')
titles <- page %>%html_nodes("#estraordinario .priority-content") %>% 
html_text()
print(titles)
Sys.sleep(1)
}

这是我使用的javascript代码:

// scrape web page
var page = require('webpage').create(),
system = require('system'),
t, address;
//Set up delay function
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
if (system.args.length === 1) {
console.log('Usage: loadspeed.js <some URL>');
phantom.exit();
}
t = Date.now();
//Read file name and print to console
address = system.args[1];
console.log(address);
var fs = require('fs');
var path = 'newpage.html';

page.open(address, function (status) {
console.log("Status: " + status);
sleep(500);
var content = page.content;
fs.write(path, content, 'w');
t = Date.now() - t;
console.log('Loading time ' + t + ' msec');
phantom.exit();
});

最新更新