2016-05-29 5 views
0

Ich versuche, einige Informationen von einer Webseite zu verschrotten. Mein Problem ist, dass die Rückgabe, die ich bekomme, nicht das enthält, wonach ich suche.Daten von der Webseite abkratzen. Java, HTMLUnit

Wenn ich den Quellcode der Web-inspizieren finde ich einen leeren Abschnitt

<section id="player-controller"> 
</section> 

Aber wenn ich die Elemente Ich möchte Daten aus inspizieren, erscheinen sie innerhalb dieses Abschnitts

Da es dynamisch generiert wird Ich habe versucht mit HTMLUnit, aber ich kann es immer noch nicht bekommen. Vielleicht sehe ich das falsch an.

Gibt es eine Möglichkeit, den Code mit HTMLUnit zu erhalten, oder sollte ich ein anderes Tool verwenden?

Gelöst

von Htmlunit mit und machen den Vorgang einig Zeit anhalten, bevor die Seite Druckt ich es den fehlenden Inhalt Drucken bekam können

WebClient webclient = new WebClient(); 
    HtmlPage currentPage = webclient.getPage("https://www.dubtrack.fm/join/chilloutroom"); 
    Thread.sleep(2000); 
    System.out.println(currentPage.asXml()); 

Antwort

0

Wenn Sie den Text der Seite beim ersten Laden untersuchen, wird der dynamische Inhalt noch nicht geladen. Das JavaScript in callScraper.html wird eine andere Seite aufrufen und dann zwei Sekunden warten, bevor der Inhalt des HTML-Elements gelesen wird. Timing könnte hier schwierig sein. Ich hoffe der folgende Code wird hilfreich sein.

callScraper.html

<!DOCTYPE html> 
<head> 
<title>Call test for scraping</title 
<meta charset="UTF-8" /> 
<script> 
var newWindow; 
var contents; 
function timed() { 
contents.value = contents.value + "\r\n" +"function timed started" + "\r\n"; 
contents.value = contents.value + "\r\n" + newWindow.document.getElementById("player-controller").innerHTML; 
} 
function starter() { 
// alert("Running starter"); 
contents = document.getElementById("contents"); 
newWindow = window.open("scraper.html"); 
contents.value = contents.value + "\r\nTimer started\r\n"; 
setTimeout(timed, 2000); 
} 
window.onload=starter; 
</script> 
</head> 
<body> 
<p>This will open another page and then diplay an element from that page.</p> 
<form name="reveal"> 
<textarea id="contents" cols="50" rows="50"></textarea> 
</form> 
</body> 
</html> 

scraper.html

<!DOCTYPE html> 
<head> 
<title>Test for scraping</title> 
<meta charset="UTF-8" /> 
<script> 
var section; 
function starter() { 
section = document.getElementById("player-controller"); 
// alert(":"+section.innerHTML+";"); 
section.innerHTML = "<p>inner text</p>"; 
// alert(":" +section.innerHTML + ":"); 
} 
window.onload = starter; 
</script> 
</head> 
<body> 
<p>See http://stackoverflow.com/questions/37513393/scrapping-data-from-webpage-java-htmlunit</p> 
<section id="player-controller"> 

</section> 
</body> 
</html> 
+0

Ihre Idee hat funktioniert. Ich habe es in Java implementiert, habe die Seite aufgerufen und ein paar Sekunden gewartet, bevor ich den Code ausgedruckt habe. – ipop

0

Sie versuchen jsoup für

Inspizieren Sie die Elemente, von denen ich Daten möchte, sie erscheinen in diesem Abschnitt dynamisch generiert

Die API ermöglicht das Extrahieren und Bearbeiten von Daten unter Verwendung der besten DOM-, CSS- und jquery-ähnlichen Methoden. Vielleicht müssen Sie einige Aktionen ausführen, bevor die Daten AJAX geladen sind.

+0

Ich habe auch versucht, Jsoup, von dem, was ich habe verstanden es kein Javascript/Ajax unterstützt, die ich vermute, bin ist, was es verwendet, um die Lücken zu füllen. Ich versuche, GET-Petitionen für die Daten zu senden, und scheint am Anfang zu arbeiten, muss es noch ein bisschen mehr testen. – ipop

+0

Sieht aus wie eine Kombination mit [headless Browser] (http://stackoverflow.com/questions/16852660/how-to-scrape-ajax-loaded-content-with-jsoup) könnte den Trick tun. – ekostadinov