gpt4 book ai didi

R - 使用 PhantomJS 等待页面在 RSelenium 中加载

转载 作者:行者123 更新时间:2023-12-02 04:39:35 26 4
gpt4 key购买 nike

我组装了一个粗糙的抓取工具,可以从 Expedia 上抓取价格/航空公司:

# Start the Server
rD <- rsDriver(browser = "phantomjs", verbose = FALSE)

# Assign the client
remDr <- rD$client

# Establish a wait for an element
remDr$setImplicitWaitTimeout(1000)

# Navigate to Expedia.com
appurl <- "https://www.expedia.com/Flights-Search?flight-type=on&starDate=04/30/2017&mode=search&trip=oneway&leg1=from:Denver,+Colorado,to:Oslo,+Norway,departure:04/30/2017TANYT&passengers=children:0,adults:1"
remDr$navigate(appURL)

# Give a crawl delay to see if it gives time to load web page
Sys.sleep(10) # Been testing with 10

###ADD JAVASCRIPT INJECTION HERE###
remDr$executeScript(?)

# Extract Prices
webElem <- remDr$findElements(using = "css", "[class='dollars price-emphasis']")
prices <- unlist(lapply(webElem, function(x){x$getElementText()}))
print(prices)

# Extract Airlines
webElem <- remDr$findElements(using = "css", "[data-test-id='airline-name']")
airlines <- unlist(lapply(webElem, function(x){x$getElementText()}))
print(airlines)

# close client/server
remDr$close()
rD$server$stop()

如您所见,我内置了一个 ImplicitWaitTimeout 和一个 Sys.Sleep 调用,以便页面有时间在 phantomJS 中加载并且不要让网站因请求而重载。

一般来说,在日期范围内循环时,抓取工具运行良好。但是,当连续循环 10 个以上日期时,Selenium 有时会抛出 StaleElementReference 错误并停止执行。我知道这是因为页面尚未完全加载,并且 class='dollars Price-emphasis' 尚不存在。 URL 构造很好。

只要页面成功加载完毕,抓取工具就会获得近 60 个价格和航类。我之所以提到这一点,是因为有时脚本仅返回 15-20 个条目(通常在浏览器上检查此日期时,有 60 个条目)。在这里,我得出的结论是,我只找到了 60 个元素中的 20 个,这意味着页面仅部分加载。

我想通过注入(inject) JavaScript 来使该脚本更加健壮,在查找元素之前等待页面完全加载。我知道执行此操作的方法是 remDr$executeScript(),并且我找到了许多有用的 JS 片段来完成此操作,但由于 JS 知识有限,我在将这些解决方案适应在语法上使用我的脚本。

以下是 Wait for page load in Selenium 提出的几种解决方案& Selenium - How to wait until page is completely loaded :

基本代码:

remDr$executeScript(
WebDriverWait wait = new WebDriverWait(driver, 20);
By addItem = By.cssSelector("class=dollars price-emphasis");, args = list()
)

对基本脚本的添加:

1) 检查元素是否陈旧

# get the "Add Item" element
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(addItem));
# wait the element "Add Item" to become stale
wait.until(ExpectedConditions.stalenessOf(element));

2) 等待元素可见

wait.until(ExpectedConditions.visibilityOfElementLocated(addItem));

我尝试过使用remDr$executeScript("return document.readyState").equals("complete") 作为继续抓取之前的检查,但页面始终显示为完整,即使不是。

有人对我如何调整这些解决方案之一以与我的 R 脚本一起使用有任何建议吗?关于如何完全等待页面加载近 60 个找到的元素,有什么想法吗?我仍在学习,所以任何帮助将不胜感激。

最佳答案

使用 while/tryCatch 的解决方案:

remDr$navigate("<webpage url>")
webElem <-NULL
while(is.null(webElem)){
webElem <- tryCatch({remDr$findElement(using = 'name', value = "<value>")},
error = function(e){NULL})
#loop until element with name <value> is found in <webpage url>
}

关于R - 使用 PhantomJS 等待页面在 RSelenium 中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43402237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com