我正在尝试使用rvest和RSelenium刮擦当地报纸上的新闻报道。为了访问除首页以外的其他内容,我需要按“下一页”按钮。当我通过浏览器单击它时,它可以正常工作,但是当我通过RSelenium进行时,则什么也没有发生。
我相信这个问题是由于与“下一页”按钮相关的唯一jQuery事件是
function() {
moveScrollToTop()
}
我的问题是,按钮如何导致更改浏览器中页面的内容?我需要知道这一点,以便尝试通过R激活该机制。
[This是我要抓取的网页,而我指的按钮是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;”。您可以创建所需网址的列表,然后使用循环抓取每个页面。由于此页面使用javascript加载页面,因此我能够使用phantomJS加载正确的页面。转到https://www.datacamp.com/community/tutorials/scraping-javascript-generated-data-with-r了解如何使用Phantom JS
这是一个基本示例:
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();
});