Ajuda para extrair informacoes de um site!

Galera estou com um problema. Eu preciso pegar algumas informacoes de um site de ofertas de compra e venda de minicontratos de ibovespa futuro. Eu consigo puxar o codigo fonte mas eu nao consegui achar nada nele que fosse util. Eu nao nao entendo nada de JavaScrip, por isso nao consigo identificar muito bem o que esta escrito no codigo. Nao adianta eu passar o link para voces pois envolve login para acessar tal tela, coisa que eu consugo fazer com o meu programa. Eu vo deixar aqui postado o codigo fonte e um print em anexo. Se alguem tiverl alguma ideiae souber se eh possibel ou nao plz, me ajude!! Vlew!!

PS: Antes que falem que isso eh um forum de Java e nao de JavaScrip eu quero pegar essas informacoes com o meu programa em Java.

Codigo Fonte:

<HTML>
<HEAD>
  <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
  <title>OFERTAS: wing09</title>
  <link href="/negociacao/CSS/27.css" rel="stylesheet" type="text/css">
  <script type="text/javascript" src="/negociacao/JS/funcoes.js"></script>
  <script>
    //parametros
    var iCulture = 1;
    var sEmpresa = "CD";
    var sInstrumento = "WING09";
    var sApplicationPath = "/negociacao";
    var sSkin = "27";
    
    function Search(code)
    {
      if (code == '' )  {
        alert("Código do instrumento inválido (" + code + ")."); 
        return;
      } 
      window.location.href = "../cotacoesEmpresa.asp?ativo="+code;
    }

    function SendToForm(qty, value)
    {
      try
      {
        alert("Função indisponivel");
      }
      catch(e) {
        alert("Erro: " + e);
      }
    }

    //body (scope)
    {       
      //General
      var xmlelem, xmlnode, count;
      var maxItm = 30;
      var arrType = new Array("S","B");

      //consulta de compra
      var strXmlIn = "<BOOK><INST NAME=\"" + sInstrumento + "\" EXCH=\"" + sEmpresa + "\" QTTO=\"100\"/></BOOK>";
      var strXmlErr = "<BOOK><INST NAME=\"" + sInstrumento + "\" EXCH=\"" + sEmpresa + "\"><ORDERS TYOR=\"S\"></ORDERS><ORDERS TYOR=\"B\"></ORDERS></INST></BOOK>";

      //executar consulta
      var xmldoc = executaXML(sApplicationPath+"/_xml/xml_consulta_livro_ofertas.asp", strXmlIn);
                
      //se nao retornou nada, exibir xml default
      if(xmldoc.xml == '')
      {
        xmldoc = new ActiveXObject("MSXML2.DOMDocument");
        xmldoc.async=false;
        xmldoc.loadXML(strXmlErr);
      }

      //preencher o grid se houver menos de 20 ofertas
      for (var j=0; j < arrType.length; j++)
      {              
        count = xmldoc.selectNodes("//BOOK/INST/ORDERS[@TYOR='" + arrType[j] + "']/ORDER").length;
        if ( count >= maxItm )
          continue;
          
        xmlnode = xmldoc.selectSingleNode("//BOOK/INST/ORDERS[@TYOR='" + arrType[j] + "']");
        if ( xmlnode != null )
        {
          for (var i = 0; i < (maxItm - count); i++)
          {
            xmlelem = xmldoc.createElement("ORDER");
            xmlelem.setAttribute("PRCE","0");
            xmlelem.setAttribute("QTOR","0");
            xmlnode.appendChild(xmlelem);
          }
        }
      }
    }
    
    function CreateBook(cType, xmlDocument)
    {
      //clonar estrutura
      var xmlCopy = xmlDocument.cloneNode(4);
      //selecionar nodes de venda para exclusao
      var xmlNodeList = xmlCopy.selectNodes("//BOOK/INST/ORDERS");
      for (var i = 0; i < xmlNodeList.length; i++)
      {
        if (xmlNodeList[i].attributes.getNamedItem("TYOR").nodeValue.toUpperCase() == cType )
        {
          var parent = xmlNodeList[i].parentNode;
          parent.removeChild(xmlNodeList[i]);
        }
      }
      //posicionar no root
      var rootnode = xmlCopy.documentElement;
      //adicionar data e hora atual
      var oDataHora = xmlCopy.createElement("dataHora");
      rootnode.appendChild(oDataHora);
      rootnode.lastChild.text = '05/01/2009  10:29:48';
      //adicionar skin
      var oSkinAttrib = xmlCopy.createElement("skin");
      rootnode.appendChild(oSkinAttrib);
      rootnode.lastChild.text = sSkin;
      //adicionar flag
      var oTopTenAttrib = xmlCopy.createElement("TopTen");
      rootnode.appendChild(oTopTenAttrib);
      rootnode.lastChild.text = "1";
      //aplicar XSL ao XML
      var content = applyXSL(xmlCopy.xml, sApplicationPath + "/_xsl/xsl_consulta_livro_ofertas.xsl", iCulture, sApplicationPath);
      //exibir
      document.writeln( content );
    }
  </script>
</HEAD>
<BODY topmargin="0" bottommargin="0" leftmargin="10" rightmargin="10" scroll="no">
  <table width="100%" border="0" cellpadding="0" cellspacing="0">
  	<tr>
  		<td colspan="2"><img src="/images/negociacao/skins/27/transp.gif" width="1" height="5"></td>
  	</tr>
  	<tr> 
  		<td width="354" class="CON_TXT_PRETO">
  		  <SPAN class=CON_TXT_PRETO>OFERTAS DE wing09 EM 05/01/2009  10:29:48</SPAN>
  		</td>
  		<td width="1" align="center" valign="bottom"><img src="/images/negociacao/skins/27/divideCinza.gif" width="1" height="11"></td>
  		<td height="29" align="right">
  		  <table cellspacing=0 cellpadding=0 border=0>
  		    <tr>
  		      <td><a href="JavaScript:Search('wing09');"><img src="/images/negociacao/skins/27/btVoltar.gif" alt="Atualizar" border="0"></a></td>
  		      <td><a href="JavaScript:window.document.location.reload();"><img src="/images/negociacao/skins/27/btTool_refresh.gif" alt="Atualizar" border="0"></a></td>
  		      
  		        <!--td><img src="/images/negociacao/skins/27/btTool_NegDia.gif" OnClick="JavaScript:window.open('/negociacao/bmf/negociacoes/negocios.asp');" alt="Negócios do Dia" border="0" style="cursor:hand;"></td-->
  		        <td><img src="/images/negociacao/skins/27/btTool_OrdPend.gif" OnClick="JavaScript:window.open('/negociacao/bmf/negociacoes/ordens.asp');" alt="Ofertas pendentes" border="0" style="cursor:hand;"></td>
  		        <td><img src="/images/negociacao/skins/27/btTool_ModOferta.gif" OnClick="JavaScript:window.open('/negociacao/bmf/negociacoes/ordens.asp');" alt="Modificar oferta" border="0" style="cursor:hand;"></td>
  		      
  		      <td><a href="JavaScript:window.close();"><img src="/images/negociacao/skins/27/btTool_close.gif" alt="Fechar" border="0"></a></td>
  		    </tr>
  		  </table>
  		</td>
  	</tr>
  	<tr><td class="DivCinza"><img src="/images/negociacao/skins/27/transp.gif" width="1" height="1"></td></tr>
  	<tr><td><img src="/images/negociacao/skins/27/transp.gif" width="1" height="10"></td></tr>
  </table>
  <table border="0" cellspacing="0" cellpadding="0" width="100%" height="92%">
    <tr>
      <!--PANEL LEFT-->
      <td width="50%" valign="top">
        <div class="scrollFull">
          <span id="spnBuyOffers">
            <script>CreateBook("S", xmldoc);</script>
          </span>
        </div>
      </td>
      <!--PANEL LEFT-->
      <td>&nbsp;</td>
      <!--PANEL RIGHT-->
      <td width="50%" valign="top">
        <div class="scrollFull">
          <span id="spnSellOffers">
            <script>CreateBook("B", xmldoc);</script>
          </span>
        </div>
      </td>
      <!--PANEL RIGHT-->
    </tr>
  </table>
</BODY>
</HTML>

A imagem esta em anexo!! Vlew!!

http://htmlcleaner.sourceforge.net

essa api é bem boa, dá pra você extrair e transformar dados, de uma fonte html, de uma forma bem simples, uso e recomendo!

[]'s

O seu problema não é com JavaScript (não tem nada demais nesse Javascript) e sim com XPath, que está analisando um arquivo de dados XML obtido sei lá de onde; aprenda a usar corretamente XPath - não é difícil, ainda mais que as expressões XPath necessárias para extrair as informações já estão nesse programa Javascript.
Para formatar os dados é usado também XSLT, o que você não vai precisar usar provavelmente porque irá formatar os dados de outra maneira.

Hmm XPath? Isso é integravel no Java? E existe algum tutorial para eu aprender ja voltado para Java? Entao so para ter certeza, eh possivel entao eu extrair as informacoes do site certo? Vlew pela ajuda ae!!

http://java.sun.com/javase/6/docs/api/javax/xml/xpath/package-summary.html

Eu sei que isso eh meio offtopic mas so para saber se alguem entende disso, eu tento acessar o caminho xml com o IE mesmo:

https://wtr.bmf.com.br/negociacao/_xml/xml_consulta_livro_ofertas.asp

depois de logar aparece o seguinte erro:

The XML page cannot be displayed
Cannot view XML input using style sheet. Please correct the error and then click the Refresh button, or try again later.


XML document must have a top level element. Error processing resource 'https://wtr.bmf.com.br/negociacao/xml/xml_consulta

Eu tentei procurar na internet o erro mas alguns lugares falarm que o problema eh na seguranca do do IE so que eu mudo e continua igual.

Alguem sabe o que pode ser?

Isso não é exatamente um erro.
É que o arquivo XML deve estar mencionando no seu cabeçalho um arquivo XSL, e o IE não está conseguindo achar esse arquivo XSL no local mencionado pelo XML.
O programa Javascript que você mostrou, em vez de mostrar diretamente o arquivo XML no browser, está pegando só um pedaço dele com XPath, e então está usando o XSL para efetuar a transformação.
Ou seja, você ainda precisa de um programa qualquer (Javascript ou Java) para pegar os dados. OK?

Acho que entendi, como eu estou no meu trabalho, e nao tenho como mecher nisso agora vou tentar fazer em casa, mas valew por toda ajuda!! Esse eh um dos grandes motivos que eu migrei de C para Java. Tem bastante pessoa disposta a judar!! Vlew ae!

E mais uma coisinha, eu to olhando o doc que voce me passou, mas nao peguei muito a ideia de como funciona essa classe. Voce poderia me dar algum exmplo generico de como seria pegar essa mesma informacao que o source que eu postei acima pega? Caso seja pedir muito nao precisa, valew pela ajuda ate agora!

A classe InputSource ( http://java.sun.com/javase/6/docs/api/org/xml/sax/InputSource.html ) recebe um InputStream, que no seu caso pode ser obtido de uma URLConnection ( http://java.sun.com/javase/6/docs/api/java/net/URLConnection.html ).

Isso tambem funcionaria? usando o httpclient do apcahe?

[code]

import java.util.ArrayList;
import java.util.List;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
.
.
.
URL site = String url = “https://wtr.bmf.com.br/negociacao/_xml/xml_consulta_livro_ofertas.asp”;

     HttpClient client = new HttpClient();   
     PostMethod method = new PostMethod(url);   
     client.executeMethod(method);   
     String page = method.getResponseBodyAsString();[/code]

Isso daria certo tambem?

Experimente e veja.

k vlew, quando eu chegar em casa eu testo! Vlew ae!

Entao, eu tentei o seguinte codigo para tentar pegar o source desse xml:

[code]
package webp;

import java.util.ArrayList;
import java.util.List;


import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

public class Main {

  public static void main(String[] args) {
     try {
         //Esse Primeiro site eh o que eu tenho que logar
        String url = "https://wtr.bmf.com.br/Autenticacao/SMLoginIBroker.fcc?TYPE=33554433&REALMOID=06-0ea14422-cef7-4d33-b467-0734805081ef&GUID=&SMAUTHREASON=0&METHOD=GET&SMAGENTNAME=$SM$Rlq1KK%2bTjmanrmkO%2bWkztYGagAIeD0fRFWN4cb08AryeECePlRWNZcA%2b3YdN0qOL&TARGET=$SM$https%3a%2f%2fwtr%2ebmf%2ecom%2ebr%2fnegociacao%2f_xml%2fxml_consulta_livro_ofertas%2easp";
        HttpClient client = new HttpClient();
        PostMethod method = new PostMethod(url);

       List params = new ArrayList();

        params.add(new NameValuePair("USER", "MeuUsoario"));
        params.add(new NameValuePair("PASSWORD", "MinhaSenha"));
      

        method.setRequestBody((NameValuePair[]) params.toArray(new NameValuePair[params.size()]));

        client.executeMethod(method);
        // Esse, é onde, pelo o que eu entendi pelo codigo fonte que eu postei acima, de onde sao retiradas as informacoes.
        method = new PostMethod("https://wtr.bmf.com.br/negociacao/_xml/xml_consulta_livro_ofertas.asp");
        client.executeMethod(method);

        String page = method.getResponseBodyAsString();

          System.out.println(page);

    } catch (Exception e) {
       e.printStackTrace();
    }
 }

}[/code]

Mas nao deu certo, o output vem vazio… Esse codigo sempre deu certo na hora de pegar os codigos fontes dos sites… E eu ja testei em outra parte do site em questao e o modo que eu estou logando funciona ok. Alguem tem alguma ideia?

Eu nao tenho muita nocao disso, mas caso eu ja tenha fugido muito do meu topico inicial eh so avisar que eu crio um novo, eh que eu so acho que esse ja tem varias informacoes uteis sobre o que eu quero fazer. Vlew!!

Voce poderia utilizar alguma ferramenta que permita interceptar as informacoes trocadas com o servidor no nivel do HTTP, entao usaando o httpclient reproduzir a comunicacao de forma que o servidor nao consiga mais diferenciar entre um e outro.

Nossa nao tenho a minima ideia de onde comecar para fazer isso… alguma sugestao? Meu deus tem coisas que da para fazer com java que eu nunca imaginaria haha…

Primeiro assegure que vc tem permissao pra fazer isso! Vc pode ter problemas caso viole as regras de utilizacao do servico ou resolva republicar conteudo do site que é protegido por direito autoral.

Ah, e pra analisar os HTTP headers eu conheco o tamper data.

Por que voce ta flando que nao seria permitido? O que vc me sugeriu nao seria colocar o meu programa como se fosse o browser? Dai para eles acho que nao importa se eu estou recebendo a informacao pelo browser ou pelo programa nao? Mas acho que assim eh complicar demais… pelo menso por agora… eu so queria mesmo acessar o xml de onde ele pega as cotacoes em questao… dai eu usaria algum xpath ou regex mesmo para pegar o que eu quero…

Minha resposta foi pra:

Como falei, nao tem nada de especial no java e sim como o servidor interpreta as requisicoes. Ele pode rejeitar seu pedido caso nao reconheca o usuario como um browser convencional ou alguma combinacao de headers.

[quote=Sink0]Por que voce ta flando que nao seria permitido?..
[/quote]

Leia meu post anterior.