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

IRN*_*art 5 selenium r web-scraping selenium-webdriver rselenium

我整理了一个刮擦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()
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我构建了一个ImplicitWaitTimeout和一个Sys.Sleep调用,以便页面有时间加载phantomJS并且不会使请求超载网站.

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

每当页面成功加载时,刮刀就会接近60个价格和航班.我之所以提到这一点是因为有时候脚本只返回15-20个条目(通常在浏览器上检查这个日期时有60个).在这里,我得出结论,我只找到60个元素中的20个,这意味着页面只有部分加载.

我希望通过injecting JavaScript在查找元素之前等待页面完全加载来使此脚本更加健壮.我知道这样做的方法是remDr$executeScript(),我已经找到了很多有用的JS片段来实现这一点,但是由于JS知识有限,我在调整这些解决方案以使用我的脚本在语法上工作时遇到了问题.

以下是Selenium&Selenium中等待页面加载的几个解决方案- 如何等待页面完全加载:

基本代码:

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

添加到基本脚本:

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));
Run Code Online (Sandbox Code Playgroud)

2)等待元素的可见性

wait.until(ExpectedConditions.visibilityOfElementLocated(addItem));
Run Code Online (Sandbox Code Playgroud)

我在尝试使用remDr$executeScript("return document.readyState").equals("complete")scrape之前尝试使用它 作为检查,但页面总是显示为完整,即使它不是.

有没有人有任何关于如何使用这些解决方案来适应我的R脚本的建议?有关如何完全等待页面加载近60个已发现元素的任何想法?我还在倾斜,所以任何帮助都会非常感激.

Vic*_*ett 8

使用 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>
}
Run Code Online (Sandbox Code Playgroud)