2016-06-07 5 views
0

Ich versuche Jsoup zu verwenden, um Bestandsdaten von einer Website namens morningstar zu erhalten. Ich habe mir andere Foren angeschaut und konnte nicht herausfinden, was falsch ist.Abrufen von Webelementen mit Jsoup

Ich versuche, erweiterte Verschrottung von Daten zu tun, aber ich kann nicht scheinen, sogar den Preis zu bekommen. Ich bekomme entweder null zurückgegeben oder gar nichts.

Ich kenne andere Sprachen und APIs, aber ich möchte Jsoup verwenden, wie es scheint, sehr fähig zu sein.

Hier ist, was ich bisher:

public class Scrape { 
    public static void main(String[] args){ 
     String URL = "http://www.morningstar.com/stocks/xnas/aapl/quote.html"; 
     Document d = new Document(URL); 
     try{ 
      d = Jsoup.connect(URL).get(); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 
     Element stuff = d.select("#idPrice gr_text_bigprice").first(); 
     System.out.println("Price of AAPL: " + stuff); 
     } 
} 

Jede mögliche Hilfe würde geschätzt.

+0

Sind Sie positiv die Daten nicht dynamisch durch Javascript erzeugt? –

Antwort

0

Da der Inhalt dynamisch mit Javascript erstellt wird, könnten Sie einen kopflos Browser wie Htmlunit verwenden https://sourceforge.net/projects/htmlunit/

Die Informationen in Bezug auf den Preis usw. eingebettet ist in einem iFrame, so dass wir zunächst die (auch dynamisch bauen) greifen iFrame verlinke und analysiere den iFrame danach.

java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(java.util.logging.Level.OFF); 

final WebClient webClient = new WebClient(BrowserVersion.CHROME); 
webClient.getOptions().setCssEnabled(false); 
webClient.getOptions().setJavaScriptEnabled(true); 
webClient.getOptions().setThrowExceptionOnScriptError(false); 
webClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
webClient.getOptions().setTimeout(1000); 

HtmlPage page = webClient.getPage("http://www.morningstar.com/stocks/xnas/aapl/quote.html"); 

Document doc = Jsoup.parse(page.asXml()); 

String title = doc.select(".r_title").select("h1").text(); 

String iFramePath = "http:" + doc.select("#quote_quicktake").select("iframe").attr("src"); 

page = webClient.getPage(iFramePath); 

doc = Jsoup.parse(page.asXml()); 

System.out.println(title + " | Last Price [$]: " + doc.select("#last-price-value").text()); 

druckt:

Apple Inc | Last Price [$]: 98.63 

Die JavaScript-Engine in Htmlunit ist ziemlich langsam (über Code etwa 18 Sekunden auf meiner Maschine nimmt), so könnte es sinnvoll sein, in anderen Javascript-Motoren/kopflos Browser aussehen (phantomJs, etc; überprüfen Sie diese Liste von Optionen: https://github.com/dhamaniasad/HeadlessBrowsers), um die Leistung zu verbessern, aber HtmlUnit bekommt den Job erledigt. Sie könnten auch versuchen, nicht relevant Scripts, Bilder zu filtern, etc. mit einem benutzerdefinierten WebConnectionWrapper:

http://htmlunit.10904.n7.nabble.com/load-parse-speedup-tp22735p22738.html