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个已发现元素的任何想法?我还在倾斜,所以任何帮助都会非常感激.
使用 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)
| 归档时间: |
|
| 查看次数: |
2458 次 |
| 最近记录: |