我正在尝试循环浏览职位列表网站以获取他们的职位列表并进行文本分析。对于这项工作,我使用 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)
,循环将无法工作,因为您需要在循环单击第二个项目之前完全加载第一页。