2017-02-22 2 views
0

Ich mache Kommandozeilen-Tool, um Websites mehrmals zu besuchen. Ich verwende mehrere Threads, um auf die Seite zu einem Zeitpunkt zuzugreifen, und jeder Thread wiederholt den Besuch der Website mithilfe von Schleifen. Tool funktioniert gut und es besuchen Websites wie erforderlich, aber das einzige Problem besteht darin, dass es Website öffnen und schließen Sie es nach wenigen Augenblicken. Daher ist die Sitzungsdauer jedes Besuchs auf 3 bis 4 Sekunden begrenzt. Ich muss diese Sitzungsdauer auf mindestens 60 Sekunden erhöhen. Unten ist mein Code.HtmlUnit WebClient Sitzungsdauer

package directUrl; 

import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import com.gargoylesoftware.htmlunit.BrowserVersion; 
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException; 
import com.gargoylesoftware.htmlunit.WebClient; 

public class ThreadDirectUrl extends Thread { 

    private String url; 
    private String paramUserAgent; 
    private String paramReferer; 
    private int loopSize; 

    public ThreadDirectUrl(String url, String paramUserAgent, String paramReferer, int loopSize) { 
     this.url = url; 
     this.paramUserAgent = paramUserAgent; 
     this.paramReferer = paramReferer; 
     this.loopSize = loopSize; 
    } 

    public void run() { 
     String userAgent = new String(); 

     // Get User Agent 
     if (paramUserAgent.equals("1")) { 
      userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:17.0) Gecko/17.0 Firefox/17.0"; 
     } else if (paramUserAgent.equals("2")) { 
      userAgent = "Mozilla/5.0 (Linux; U; Android 2.2; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1"; 
     } else if (paramUserAgent.equals("3")) { 
      userAgent = "Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_0 like Mac OS X; en-us) AppleWebKit/532.9 (KHTML, like Gecko) Version/4.0.5 Mobile/8A293 Safari/6531.22.7"; 
     } else if (paramUserAgent.equals("4")) { 
      userAgent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_0) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.79 Safari/537.1"; 
     } 

     BrowserVersion bv = new BrowserVersion("Netscape", "Version", userAgent, 0); 

     try { 
      URL openUrl = new URL(url); 
      for (int i = 1; i <= loopSize; i++) { 
       WebClient webClient = new WebClient(bv); 
       webClient.addRequestHeader("Accept-Encoding", "compress, gzip"); 
       webClient.addRequestHeader("Referer", paramReferer); 
       webClient.getOptions().setPrintContentOnFailingStatusCode(true); 
       webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
       webClient.getOptions().setThrowExceptionOnScriptError(false); 
       webClient.getOptions().setJavaScriptEnabled(true); 
       webClient.getOptions().setCssEnabled(false); 
       webClient.getOptions().setPopupBlockerEnabled(true); 
       webClient.getOptions().setMaxInMemory(3); 
       webClient.getPage(openUrl); 

       System.out.println(Thread.currentThread().getName() + "----" + i + "----\nSuccess!\nUser Agent: " 
         + bv.getUserAgent() + "\n\n"); 
       Thread.sleep(60000); 
       webClient.getCurrentWindow().getJobManager().removeAllJobs(); 
       webClient.close(); 
      } 
      System.out.println(Thread.currentThread().getName() + "COMPLETED"); 

     } catch (FailingHttpStatusCodeException e) { 
      System.out.println("Error!"); 
     } catch (MalformedURLException e) { 
      System.out.println("Error - Use URL with \"http://\" or \"https://\"!"); 
     } catch (IOException e) { 
      System.out.println("Error!"); 
     } catch (ArrayIndexOutOfBoundsException e) { 
      System.out.println("Error!"); 
     } catch (InterruptedException e) { 
      System.out.println(Thread.currentThread().getName() + "Interrupted"); 
     } finally { 

      System.gc(); 
     } 
    } 
} 

Hauptklasse ist als unten

package directUrl; 

import java.util.logging.Level; 
import java.util.logging.Logger; 

public class DirectUrl { 

    public static void main(String[] args) { 

     // Production Variables 
     String url = args[0]; // URL 
     String paramUserAgent = args[1]; // User Agent Choice 
     String paramReferer = args[2]; // Referrer URL 
     int loopSize = Integer.parseInt(args[3]); // Loop Size 
     int threadSize = Integer.parseInt(args[4]); // Counts of threads 

     Logger logger = Logger.getLogger(""); 
     logger.setLevel(Level.OFF); 

     // Create Multiple Threads 
     ThreadDirectUrl aThread; 
     for (int i = 1; i <= threadSize; i++) { 
      aThread = new ThreadDirectUrl(url, paramUserAgent, paramReferer, loopSize); 
      aThread.setName("thread" + i); 
      aThread.start(); 
     } 

    } 

} 

In der Klasse ThreadDirectUrl, die ich verwendet habe;

Thread.sleep(60000); 

nach getPage() -Methode, aber es funktioniert nicht. Bitte vorschlagen.

+0

Welche Fehler Sie nach 'Schlaf bekommen' Sie die Cookies in Header von 'LogManager.getLogger sehen können („org.apache.http.wire“) setLevel (org .apache.log4j.Level.ALL); 'please sample URL –

+0

@AhmedAshour Kein Fehler. –

+0

Also, was erwartest du? Sie erhalten eine Seite (mit impliziter Sitzung), was soll als nächstes getan werden? was 'es nicht funktioniert'. –

Antwort

0

Wenn der Server die Sitzung länger leben sehen soll, dann tun Sie etwas mit Client.

z. laden die gleiche Seite wieder:.

webClient.getPage(openUrl); 

Thread.sleep(60000); 

// then get the same page again 
webClient.getPage(openUrl); 
+0

Ich habe das gleiche getan, bevor Sie die Antwort geschrieben haben und es funktionierte nach einigen Recherchen, wie Server Sitzungsdauer sehen. Aber ich werde deine Antwort als richtig markieren. –

+0

Danke, versuche auch die neueste Version 2.25 zu verwenden, die gerade veröffentlicht wurde. –