RSelenium - For 循环多个网页,抓取数据并将其粘贴到 data.frame 中

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

我正在尝试循环浏览职位列表网站以获取他们的职位列表并进行文本分析。对于这项工作,我使用 RSelenium。 我正在编写的代码如下:

#### REMOTE.COM ####
remDR$navigate('https://remote.com/jobs/all?query=marketing&country=anywhere')
# click on the cookies policy
remDR$findElement(using = 'xpath', '//*[@id="ccc-notify-accept"]')$clickElement()
# print all job listings
num_links <- 20
for(i in 1:num_links){
  remDR$findElement(using = 'xpath', 
                    paste('/html/body/div[2]/main/div/div/div[3]/article[',i,']', sep = ''))$clickElement()
  print(remDR$getCurrentUrl())
  remDR$goBack()
}

问题是当我开始循环时,出现了两个问题。

首先,

print(remDR$getCurrentUrl())
命令返回原始网址(https://remote.com/jobs/all?query=marketing&country=anywhere),而不是在
for
的第一部分中单击的页面环形。其次,当
remDR$goBack()
执行时,它会将我带回到上一个空白页面,就好像没有单击链接一样。

总而言之,我认为循环的运行速度比 Rselenium 查找并单击元素的速度更快。

编辑

根据建议找到了解决方案:

for(i in 1:5){
  remDR$findElement(using = 'xpath', 
                    paste('/html/body/div[2]/main/div/div/div[3]/article[',i,']', sep = ''))$clickElement()
  Sys.sleep(2) # add time for page to load
  print(remDR$getCurrentUrl())
  remDR$navigate('https://remote.com/jobs/all?query=marketing&country=anywhere') # .$navigate() works better as it makes the page load and give you time
  Sys.sleep(2) # add time for page to load
}

采取的步骤是给chrome时间来加载页面

Sys.sleep(2)
并使用
.$navigate()
而不是
goBack()
,原因是
.$navigate()
在浏览器中加载内容。重要提示,如果没有最后的
Sys.sleep(2)
,循环将无法工作,因为您需要在循环单击第二个项目之前完全加载第一页。

r web-scraping rselenium
© www.soinside.com 2019 - 2024. All rights reserved.