Gewusst wie: laden von ajax mit HtmlUnit?
import java.io.IOException;
import java.net.MalformedURLException;
import java.util.List;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
public class YoutubeBot {
private static final String YOUTUBE = "http://www.youtube.com";
public static void main(String[] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException {
WebClient webClient = new WebClient();
webClient.setThrowExceptionOnScriptError(false);
//This is equivalent to typing youtube.com to the adress bar of browser
HtmlPage currentPage = webClient.getPage("http://www.youtube.com/results?search_type=videos&search_query=official+music+video&search_sort=video_date_uploaded&suggested_categories=10%2C24&uni=3");
//Get form where submit button is located
HtmlForm searchForm = (HtmlForm) currentPage.getElementById("masthead-search");
//Get the input field.
HtmlTextInput searchInput = (HtmlTextInput) currentPage.getElementById("masthead-search-term");
//Insert the search term.
searchInput.setText("java");
//Workaround: create a 'fake' button and add it to the form.
HtmlButton submitButton = (HtmlButton) currentPage.createElement("button");
submitButton.setAttribute("type", "submit");
searchForm.appendChild(submitButton);
//Workaround: use the reference to the button to submit the form.
HtmlPage newPage = submitButton.click();
//Find all links on page with given class
final List<HtmlAnchor> listLinks = (List<HtmlAnchor>) currentPage.getByXPath("//a[@class='ux-thumb-wrap result-item-thumb']");
//Print all links to console
for (int i=0; i<listLinks.size(); i++)
System.out.println(YOUTUBE + listLinks.get(i).getAttribute("href"));
}
}
Dieser code funktioniert, aber ich will einfach nur, um zu Sortieren, youtube-clips, zum Beispiel durch upload-Datum. Wie dies mit HtmlUnit? Ich klicken Sie auf den filter, das sollte das laden von Inhalten per ajax-request und dann sollte ich klicken Sie auf "Upload-Datum" - link. Ich weiß nur nicht, diesen ersten Schritt zu laden, ajax content. Ist das möglich mit HtmlUnit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein Weg, es zu tun:
search-lego-refinements
block-id.//ul/li/a
wenn Sie starten von der vorherigen id).Das folgende Codebeispiel zeigt, wie es gemacht werden kann:
Könnten Sie nur Sie die richtige Abfrage-URL (
http://www.youtube.com/results?search_type=videos&search_query=nyan+cat&search_sort=video_date_uploaded
).Aber dann müsste man zum Kodieren der parameter für die Suche(N) ein (ersetzen Sie die Leerzeichen mit
+
zum Beispiel).Dieser arbeitete für mich. Setzen Sie diese
Dies würde dazu führen, dass alle ajax-Aufrufe synchron sein.
Dies ist, wie ich meine setup-WebClient-Objekt
Ich habe schon mit HTMLUnit früher für ähnliche Zwecke verwendet werden.
Eigentlich finden Sie alle Informationen, die Sie benötigen hier. HTMLUnit verfügt über AJAX-Unterstützung aktiviert, so dass, wenn Sie die
newPage
Objekt in Ihrem code können Sie die Ausgabe auf die Ereignisse auf der Seite (Suche nach dem spezifischen element, und rufen Sie esclick()
- Funktion). Der schwierigste Teil ist, dass AJAX asynchron ist so Sie zu rufenwait()
odersleep()
nach der Durchführung von virtuellen auf, so dass der Javascript-code auf der Website konnte den Aktionen. Ist dies nicht der beste Ansatz, da Netzwerk-Nutzung machtsleep()
unzuverlässig. Möglicherweise finden Sie etwas, was auf der Seite was ändert sich, wenn Sie ausführen, ein Ereignis, wodurch AJAX-Aufrufe (zB. eine header-Titel ändert sich), so können Sie regelmäßig überprüfen, ob diese Veränderung schon geschehen, auf die Website oder nicht. (Ich sollte erwähnen, dass es eine Veranstaltung resynchronizer gebaut, um HTMLUnit, aber ich konnte nicht verwalten, damit es funktioniert wie ich es erwartet habe.) Ich verwende Firebug oder Chrome developer toolbar, die für die Prüfung der Website. Man könnte prüfen, den DOM-Baum vor und nach dem AJAX-Aufrufe und auf diese Weise werden Sie wissen, wie auf bestimmte Steuerelemente (wie links und dropdown-Menüs) auf der Seite.Ich würde die XPath-um spezifische Elemente, die dann, zB. Sie können dies zu tun (aus HTML-Unit Beispiele):
YouTube eigentlich nicht verwendet AJAX für den Rückgriff Ergebnis. Wenn Sie auf die Sortieren-dropdown auf der Ergebnis-Seite (dies ist eine verzierte
<button>
) eine absolute positioniert<ul>
angezeigt wird (dies emuliert das drop-down-Teil der combo), die<li>
Elemente für jeden Menüpunkt.<li>
Elemente enthalten eine spezielle<span>
element mit einemhref
Attribut angebracht. Wenn Sie auf die<span>
element Javascript navigiert der browser zu dieserhref
Wert.ZB. in meinem Fall die Sortierung nach Relevanz
<span>
- element sieht wie folgt aus:Können Sie die Liste mit diesen Spannweiten relativ leicht, da die hosting -
<ul>
ist das einzige Kind von<body>
. Obwohl, klicken Sie auf den dropdown-button, weil es erstelle die<ul>
element mit allen childs oben beschrieben mit Javascript. Sie können die Sortierung durch die Schaltfläche mit dieser XPath:Können Sie testen Sie Ihre XPath-Abfragen zB. rechts in Chrom, wenn Sie öffnen Sie die Entwickler-tools und Javascript-Entwickler-Konsole aus der Symbolleiste. Dann können Sie testen, wie diese:
Hoffe, diese erhalten Sie in die richtige Richtung.
http://htmlunit.sourceforge.net/faq.html#AJAXDoesNotWork