我使用Selenium webdriver和Firefox来抓取网页。有时Web浏览器会等待一些过多的请求完成(例如,到facebook.net)。
我尝试使用BrowserMob-Proxy来过滤这些请求。但它没有任何帮助。即使在收到200或404代码后,这些请求也不会停止。
我想过在一段时间后停止Web浏览器加载页面的可能性。 例如:
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt(); }
((JavascriptExecutor) driver).executeScript("window.stop();");
但是在网页完全加载之前它不起作用。
在你的情况下,你能建议我做什么?
P.S。这是使用pageLoadTimeout参数的代码。
WebDriver driver;
FirefoxBinary firefox;
FirefoxProfile customProfile;
public static void main(String[] args) {
openFirefox();
for (String url : listOfUrls) {
Boolean pageLoaded = false;
while (pageLoaded == false) {
try {
driver.get(url);
pageLoaded = true;
} catch (org.openqa.selenium.TimeoutException ex) {
System.out.println("Got TimeoutException on page load. Restarting browser...");
restartFirefox();
}
}
//here I do something with a content of a webpage
}
}
public static void openFirefox(){
firefox = new FirefoxBinary(new File(Constants.PATH_TO_FIREFOX_EXE));
customProfile = new FirefoxProfile();
customProfile.setAcceptUntrustedCertificates(true);
customProfile.setPreference("webdriver.load.strategy", "unstable");
driver = new FirefoxDriver(firefox, customProfile);
driver.manage().deleteAllCookies();
driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
}
private static void restartFirefox() {
driver.close();
firefox.quit();
openFirefox();
}
答案 0 :(得分:0)
如何使用超时?因此,对于您正在使用的每个WebDriver
实例,您需要设置:
WebDriver.Timeouts pageLoadTimeout(长时间,java.util.concurrent.TimeUnit单位)
设置之前等待页面加载完成的时间 抛出一个错误。如果超时为负,则可以加载页面 无限期的。
Parameters: time - The timeout value. unit - The unit of time. Returns: A Timeouts interface.
我尝试使用BrowserMob-Proxy来过滤这些请求。但它 没有帮助。这些请求,即使在收到200或404代码后, 不停。
你是什么意思“没有帮助”。我不相信你。请分享您的黑名单网址代码。例如,以下代码代码为我的任何谷歌分析相关网站返回HTTP.200
server.blacklistRequests("https?://.*\\.google-analytics\\.com/.*", 200); // server is bmp proxy server
WebDriver
现在应该有webdriver.load.strategy
。我从来没用过它。因此,阻止调用(a'la get()
)的WebDrivers的默认行为是等待document.readyState
为complete
,但我已经读过这个属性,你可以告诉驱动程序返回立刻。所以可能值得谷歌搜索一段时间。