2

我使用 Selenium webdriver 和 Firefox 来抓取网页。有时,Web 浏览器会无限期地等待完成一些过多的请求(例如对 facebook.net)。

我尝试使用 BrowserMob-Proxy 来过滤这些请求。但这没有帮助。这些请求,即使在收到 200 或 404 代码后,也不会停止。

我考虑过一段时间后停止网络浏览器加载页面的可能性。例如:

try {
    Thread.sleep(5000);
} catch (InterruptedException ex) {
      Thread.currentThread().interrupt(); }
((JavascriptExecutor) driver).executeScript("window.stop();");

但在网页完全加载之前它不起作用。

在我的情况下,你能建议我做什么?

PS 这是一个使用 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();
    }
4

1 回答 1

0
  1. 如何使用超时?因此,对于您使用的每个WebDriver实例,您需要设置:

    WebDriver.Timeouts pageLoadTimeout(long time, java.util.concurrent.TimeUnit unit)

文档中的哪个:

设置在引发错误之前等待页面加载完成的时间量。如果超时为负数,则页面加载可能是不确定的。

Parameters:
time - The timeout value.
unit - The unit of time. Returns:
A Timeouts interface.
  1. 我尝试使用 BrowserMob-Proxy 来过滤这些请求。但这没有帮助。这些请求,即使在收到 200 或 404 代码后,也不会停止。

你是什​​么意思“没有帮助”。我不相信你。请分享您将 URL 列入黑名单的代码。例如,以下代码为我返回了任何 google-analytics 相关网站的 HTTP.200

server.blacklistRequests("https?://.*\\.google-analytics\\.com/.*", 200); // server is bmp proxy server
  1. 听说,WebDriver现在应该有webdriver.load.strategy。我从来没有使用过它。所以 WebDrivers 阻塞调用 (a'la ) 的默认行为是get()等待,但我已经读过使用这个属性你可以告诉驱动程序立即返回。所以可能值得用谷歌搜索一段时间。document.readyStatecomplete
于 2015-07-18T19:03:39.103 回答