2

Webページをスクレイピングするために、FirefoxでSelenium Webdriverを使用しています。Web ブラウザは、過剰なリクエスト (facebook.net など) が完了するまで無限に待機することがあります。

BrowserMob-Proxy を使用してこれらのリクエストをフィルタリングしようとしました。しかし、それは役に立ちませんでした。これらのリクエストは、200 または 404 コードを受信した後でも停止しません。

しばらくすると、Web ブラウザーのページの読み込みを停止する可能性について考えました。例えば:

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

ただし、Web ページが完全に読み込まれるまで機能しません。

私の場合、何をするように提案できますか?

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(長時間、java.util.concurrent.TimeUnit単位)

ドキュメンテーションによるもの:

エラーをスローする前に、ページの読み込みが完了するまで待機する時間を設定します。タイムアウトが負の場合、ページの読み込みは無制限になる可能性があります。

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.readyStateことcompleteですが、このプロパティを使用すると、ドライバーにすぐに戻るように指示できることを読みました。しばらくの間、グーグルで検索する価値があるかもしれません。
于 2015-07-18T19:03:39.103 に答える