用R抓取网页,但“下一页”按钮仅具有事件“转到顶部”

问题描述 投票:0回答:1

我正在尝试使用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()

jquery html r web-scraping click
1个回答
0
投票

看来基本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();
});
© www.soinside.com 2019 - 2024. All rights reserved.