2016-11-24 5 views
0

Я пытаюсь разобрать веб-сайт с HtmlUnit и Jsoup, и я столкнулся с этой проблемой. У меня разные страницы для разбора, и я сохранил эти ссылки этих страниц в массиве строк. Я хочу, чтобы цикл на длину массива и проанализировать каждую страницу, и я иду таким образом.HtmlUnit: открытие новой страницы с тем же WebClient

1) Для петли на длину массива Линка 2) Открытие нового WEBClient 3) Создание нового HTMLPage от связи с методом GetPage 4) Синтаксического и получать некоторые элементы 5) Закрытия WebClient 6) вернуться к 2).

Таким образом, я получаю то, что хочу, но код немного медленный. Поэтому я попытался открыть и закрыть webClient вне цикла for. Как это:

1) Открытие нового WebClient 2) Для петли по длине массива Линка 3) Создание нового HTMLPage от связи с методом GetPage 4) Анализ и получить некоторые элементы 5) вернуться к 2) , 6) Закрытие webclient

Это намного быстрее, но я не получаю одинаковых результатов предыдущего пути.

Неправильно использовать конструктор webclient таким образом?

EDIT: После кода я тестирование:

public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException { 
     // TODO Auto-generated method stub 
     java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 

     String[] links = {"http://www.oddsportal.com/tennis/china/atp-beijing/murray-andy-dimitrov-grigor-fTdGYm3q/#cs;2;6", 
          "http://www.oddsportal.com/tennis/china/atp-beijing/murray-andy-dimitrov-grigor-fTdGYm3q/#cs;2;9"}; 

     String bm = null; 
     String[] odds = new String[2]; 

     //Second way 
     WebClient webClient = new WebClient(BrowserVersion.CHROME); 
     System.out.println("Client opened"); 
     for (int i=0; i<links.length; i++) { 

      HtmlPage page = webClient.getPage(links[i]); 
      System.out.println("Page loaded"); 
      Document csDoc = Jsoup.parse(page.asXml()); 
      System.out.println("Page parsed"); 

      Element table = csDoc.select("table.table-main.detail-odds.sortable").first(); 
      Elements cols = table.select("td:eq(0)"); 

      if (cols.first().text().trim().contains("bet365.it")) { 
       bm = cols.first().text().trim(); 
       odds[i]=table.select("tbody > tr.lo").select("td.right.odds").first().text().trim(); 
      } 
      else { 
       Elements footTable = csDoc.select("table.table-main.detail-odds.sortable"); 
       Elements footRow = footTable.select("tfoot > tr.aver"); 
       odds[i] = footRow.select("td.right").text().trim(); 

       bm = "AVG"; 
      } 
      webClient.close(); 
     } 

     System.out.println(bm +"\t" +odds[0] + "\t" + odds[1]); 

} 

Если я запускаю этот код результаты правильно. Если я перемещаю webClient.close(); результаты вне цикла for не верны. В частности, коэффициенты [0] равны коэффициентам [1];

+0

'но я не получаю одинаковые результаты предыдущего пути', слишком общий; пожалуйста, уточните, каким образом результаты разные. –

+0

Вы получаете какие-либо «Исключения»? –

+0

@FredericKlein in for loop Я получаю некоторые данные, которые храню в массиве odds. если я запустил код, я разместил это значение, все элементы массива будут одинаковыми, а если я запустим один и тот же код, но создав webclient внутри цикла for, элементы массива будут разными (как и должно быть). Пример: 1) с WebClient внутри для цикла я получить (для Exemple) коэффициентов [0] = 4,00 коэффициентов [1] = 3.00 коэффициентов [2] = 5,50 шансов [3] = 7.50 2) с WebClient снаружи цикл for i получается (например) коэффициенты [0] = 4.00 коэффициенты [1] = 4.00 коэффициенты [2] = 4.50 коэффициенты [3] = 4.00 Кажется, что это не загрузка правой страницы –

ответ

1

Подумайте о WebClient как о замене вашего браузера. Создание нового WebClient похоже на запуск нового браузера. Если вы хотите сделать что-то равное открытию новой вкладки в своем браузере, вы можете использовать WebClient # openWindow (..). И с точки зрения памяти неплохо закрыть окно, если вы закончите.

Если вы ищете производительность, почему вы повторно разобрали всю страницу Jsoup. HtmlUnit извлекает страницу, анализирует страницу, создает всю DOM и запускает javascript поверх этого dom, прежде чем вы вернетесь к странице из вашего вызова getPage. Затем вы используете HtmlUnit для сериализации дерева Dom обратно в Html и используйте Jsoup для повторного анализа страницы. HtmlUnit предлагает множество способов поиска элементов на странице. Я предлагаю использовать этот API непосредственно на странице, которую вы получили.

+0

Спасибо за ваш андер, особенно за предложение обо всех делах с HtmlUnit. Я буду смотреть на API глубоко. Что касается WebClient. Я точно думал о нем как о браслере, и именно поэтому он имеет в виду «второй путь». Если я запускаю браузер, и я закончил просмотр страницы, и мне нужно перейти в новую, я просто изменил адрес, а не закрыл браузер, снова открыв его или перейдя на новую вкладку. –