2011-12-29 2 views
1

Я разборе веб-страницы с помощью BufferedReader обернутую вокруг InputStream в Java:Как перезагрузить Java InputStream

HttpURLConnection conn = (HttpURLConnection)url.openConnection(myUrl); 
InputStream stream = conn.getInputStream(); 

Проблема заключается в том, что цифры, которые я хочу получить от страницы генерируются динамически с Ajax вызовов , и недоступны в потоке. Есть ли способ обновить поток после ожидания, или кто-нибудь может подумать о другом способе получения данных? Страница here. Мне нужны цифры «Объем доллара» и «Общий объем» в середине страницы.

Спасибо, Джаред

+0

Просмотрите сообщение от @ziesemer. Похоже, что данные, которые вы хотите, не заполнены из результата AJAX, и вам может потребоваться продолжить анализ данных страницы, чтобы получить нужные данные. –

ответ

4

Если числа генерируются с помощью Ajax вызовов, то ваш код должен сделать эти Ajax звонки. Единственное, что похоже на «обновление потока», - это перезагрузка страницы, и это еще не будет иметь номера, если они обычно загружаются отдельными веб-запросами Javascript на клиенте.

Просто найдите, что запрашивает Javascript, и сделайте те же запросы из вашего собственного кода.

(Вы должны проверить, что веб-сайт является счастливым для вас, чтобы очистить свои данные, как это, кстати.)

+0

Я не согласен с последним комментарием. Любой, кто публикует веб-страницу, должен предполагать, что дал разрешение любому клиенту HTTP на доступ к данным. –

2

Вы можете проверить код JavaScript на странице или использовать сетевой анализатор для определения HTTP-запрос, который код JavaScript отправляет обратно на сервер, а затем вы можете воспроизводить их в Java вместо отправки запроса на исходную страницу.

Самый надежный способ добиться этого - это выяснить, предлагают ли они API.

1

Вы не можете «обновить» поток. Согласование инициируется клиентом, который использует AJAX. Клиент создает HTTP-запрос, и сервер обрабатывает его. У вас есть абстракция доступа к данным с именованным потоком и может читать ее до тех пор, пока поток не закончится, когда клиент завершит передачу данных или если произошла ошибка.

Итак, прочитайте поток до конца и проанализируйте содержимое. Когда клиент решает отправить еще один фрагмент данных, он создает новое соединение, и вы (в стороне от него) получаете новый поток.

2

Вам либо нужно перепроектировать JavaScript или следить за AJAX звонки с помощью расширения браузера (т.е. FireBug, IE Developer Tools и др.) Или веб-прокси, такие как скрипача, так что вы можете определить:

  • Точка назначения HTTP-адреса вызова AJAX
  • Метод HTTP-запроса вызова (вызовов) AJAX - т.е. POST, GET
  • Результат вызовов AJAX - т.е. XML, JSON, текст

После получения результата AJAX вам необходимо проанализировать его, чтобы определить ваши значения. Нет простого способа сделать это. Я рекомендовал Fiddler, потому что вы можете видеть как сырые, так и специально отформатированные HTTP-данные между запросами, даже через AJAX, SSL и т. Д.

http://www.fiddler2.com/fiddler2/

http://www.getfirebug.com/

+0

В соответствии с другими предложениями вы также должны (1) определить, что это приемлемо для очистки данных таким образом, и (2) определить, имеют ли они сначала открытый API для извлечения желаемых данных. –

1

Я собирался давать те же ответы, что и другие здесь, но посмотрев на странице, конкретные номера вы ищете не возвращаются AJAX, но возвращаются в фактическом HTML-странице страницы. Вот пример, который я просто схватил:

<div id="marketTotals"> 
    <div class="panel"> 
     <strong>Dollar Volume</strong> 
     <span class="value">79,567,751</span> 

    </div> 
    <div class="panel"> 
     <strong>Share Volume</strong> 
     <span class="value">32,225,173</span> 
    </div> 
    <div class="panel"> 
     <strong>Trades</strong> 

     <span class="value">6,413</span> 
    </div> 
    <div class="panel"> 
     <strong>Advancers</strong> 
     <span class="value">60</span> 
    </div> 
    <div class="panel"> 

     <strong>Decliners</strong> 
     <span class="value">120</span> 
    </div> 
</div> 

Там нет специального кодирования необходимо, чтобы получить эти - особенно не перезарядки потока. Вы даже можете увидеть их с помощью curl или wget.

Все, что сказано, пожалуйста, убедитесь, что у вас есть разрешение от владельца веб-сайта, прежде чем пытаться скринировать, что, вероятно, является проприетарными данными таким образом - или это не заставит вас долго ждать, кошки-мышки »с препятствиями и обходными ситуациями. Согласились с другими предложениями - если это разрешено и поддерживается, у них, вероятно, будет гораздо более стабильный API, который они могут предоставить вам, предназначенным для этого.

+0

Кажется, это так; возможно, он разбирается для первого появления определенных строк (т. е. объема доллара). Если это так, они встречаются раньше в дереве документов. Это может быть проблемой. –

+0

Я случайно отправил неправильную ссылку. Ссылка на данные закрытия действительно может быть проанализирована во время загрузки. Извините за miscue. – Jared