2017-02-22 25 views
0

Я делаю инструмент командной строки для посещения веб-сайтов несколько раз. Я использую несколько потоков для доступа к странице за раз, и каждый поток повторяет посещение веб-сайта с использованием циклов. Инструмент работает отлично, и он посещает веб-сайты по мере необходимости, но единственная проблема связана с тем, что он открывает веб-сайт и закрывает его через несколько мгновений. Таким образом, продолжительность сеанса каждого посещения ограничена 3-4 секундами. Мне нужно увеличить продолжительность сеанса до 60 секунд. Ниже мой код.HtmlUnit WebClient Session Duration

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(); 
     } 
    } 
} 

Основной класс как ниже

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(); 
     } 

    } 

} 

В классе ThreadDirectUrl я использовал;

Thread.sleep(60000); 

после метода getPage() но не работает. Пожалуйста, предложите.

+0

Какую ошибку вы получите после '' сна, вы можете увидеть печенье в заголовках на 'LogManager.getLogger («org.apache.http.wire») setLevel (орг .apache.log4j.Level.ALL); 'пожалуйста, отправьте образец URL –

+0

@AhmedAshour Ошибка. –

+0

Итак, что вы ожидаете? Вы получаете страницу (с неявной сессией), что делать дальше? что это «не работает». –

ответ

0

Если вы хотите, чтобы сервер видел, как сеанс длится дольше, сделайте что-нибудь с клиентом.

E.g. загружать ту же страницу снова:.

webClient.getPage(openUrl); 

Thread.sleep(60000); 

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

Я сделал то же самое, прежде чем вы отправили ответ, и он работал после того, как сделал некоторые исследования о том, как сервер видит длительность сеансов. Но я отвечу правильно. –

+0

Спасибо, также попробуйте использовать последние версии 2.25, которые были только что выпущены. –