2012-04-24 8 views
7

Also baue ich eine App, die ein Bildboard von einer Website anzeigt, auf die ich in einer benutzerfreundlicheren Schnittstelle gehe. Im Moment gibt es eine Menge Probleme, aber die größte ist, die Bilder zu holen, um sie anzuzeigen.Gibt es etwas schneller als Jsoup für HTML-Scraping?

Wie ich es gerade habe, werden die Bilder in einer GridView der Größe 12 angezeigt, die die Anzahl der Bilder auf jeder Seite des Bildbretts widerspiegelt. Ich verwende Jsoup, um die Seite nach den Miniaturbild-URLs zu scrappen, die im GridView angezeigt werden, und um die URLs für die Bilder in voller Größe anzuzeigen, wenn ein Benutzer auf das Miniaturbild klickt.

Das Problem ist im Moment, dass Jsoup durchschnittlich 8-12 Sekunden braucht, um die HTML-Seite zu scrappen. Das halte ich für inakzeptabel und ich fragte mich, ob es irgendeinen Weg gab, dies schneller zu machen, oder ob dies ein innewohnender Engpass sein würde, gegen den ich nichts tun konnte.

Hier ist der Code, den ich mit der Seite holen zu kratzen:

try { 
    Document doc = Jsoup.connect(url).get(); 
    Elements links = doc.select("img[src*=/alt2/]"); 
    for (Element link : links) { 
     thumbURL = link.attr("src"); 
     linkURL = thumbURL.replace("/alt2/", "/").replace("s.jpg", ".jpg"); 
     imgSrc.add(new Pair<String, String>(thumbURL, linkURL)); 
    } 
} 
catch { 
    e.printStackTrace(); 
} 

Antwort

6

I verwendet Jsoup für einen TLFN Schaber und ich hatte keine Probleme mit der Geschwindigkeit. Sie sollten den Engpass eingrenzen. Ich nehme an, es ist Ihr Kratzen, das das Geschwindigkeitsproblem verursacht. Versuchen Sie, Ihren Selektor und Ihren Netzwerkverkehr separat zu verfolgen und zu sehen, wer dafür verantwortlich ist. Wenn Ihr Selektor dafür verantwortlich ist, sollten Sie einen anderen Ansatz für das Abfragen und Benchmarking der Ergebnisse finden.

Für schnellere, allgemeine Idee, Tests können Sie Jsoup immer von einem normalen Java-Projekt ausführen und wenn Sie das Gefühl haben, dass Sie es verbessert haben, werfen Sie es zurück auf ein Gerät und sehen, ob es ähnliche Leistungsverbesserungen hat.

EDIT

Nicht, dass dies Ihr Problem ist aber bewusst sein, dass Iteratoren ‚kann‘ verursachen ziemlich viel Garbage Collection mit auszulösen. In der Regel ist dies kein Problem. Wenn Sie sie jedoch an vielen Orten mit vielen Wiederholungen verwenden, können einige Geräte bemerkenswerte Leistungseinbußen hinnehmen.

nicht groß

for (Element link : links) 

besser

int i; 
Element tempLink; 
for (i=0;i<links.size();i++) { 
    tempLink = links.get(i); 
} 

EDIT 2

Wenn der Bild-URLs mit/alt2 beginnen/Sie in der Lage sein können^verwenden = statt * = die könnte möglicherweise die Suche schneller machen. Darüber hinaus verschwenden Sie, abhängig von der Menge an HTML, möglicherweise viel Zeit, um an den völlig falschen Stellen für diese Bilder zu suchen. Überprüfen Sie, ob diese Bilder in einem identifizierbaren Container wie z. B. <div class="posts"> verpackt sind. Wenn Sie die Menge des zu durchsuchenden HTML eingrenzen können, kann dies die Leistung verbessern.

+0

jsoup verlangsamt Nun, die Sache ist, dass ich die get() Aufruf timed das ist wo ich die 8-12 Sekunden Verzögerung bekam. Ich werde jedoch einen Blick in den Selektor werfen. – seraphzero

+0

Es kann schneller sein, alle Bilder auszuwählen und sie dann manuell zu durchlaufen, indem Sie die richtigen Bilder auswählen. –

+0

Ich führe mehr Timing-Tests aus und bin mir sicher, dass es der Aufruf get() ist, der die ganze Zeit in Anspruch nimmt. Bei einem normalen Java-Projekt dauert der Aufruf von get() ungefähr 1-2 Sekunden und der select() -Aufruf ungefähr 0,05 Sekunden. Das Ausführen des gleichen Codes auf dem Android-Emulator dauert die zuvor genannten 8-12 Sekunden für Get() und ca. 0,7 Sekunden für Select(). – seraphzero

0

Können Sie erkennen besser, die Inhalte, die Sie erhalten möchten, weil es nur einen Grund, dass die Ausführung des Codes verlangsamen

select("img[src*=/alt2/]") 

Gibt es eine gemeinsame „Klasse“ mit den Bildern, die Sie erhalten möchten ?

+0

Leider nein. Es sind nur die Quell-URLs für die Bilder. – seraphzero

+0

Können Sie den HTML-Code posten? – ChristopheCVB

+0

Thumbnail Bild wäre wie folgt: 'blog, Takahashi Ai,' – seraphzero

2

Ich lief in der gleichen Ausgabe:

Die Logcat auf meinem HTC One S zeigt deutlich, dass die Verbindung Antwort nimmt nur die ersten 4 Sekunden (3 Anschlüsse parallel). Die Parsing dauert fast 30 bis 40 Sekunden, die enorm viel Zeit ist .. feststellen, dass das HTC One S einen sehr schnellen Dual-Core @ 1,4GHz hat .. Das Problem ist eindeutig nicht mit dem Emulator verbunden

02-27 14:11:55.278: DEBUG/MyActivity(10735): =c> 
02-27 14:11:55.278: DEBUG/MyActivity(10735): =c> 
02-27 14:11:55.278: DEBUG/MyActivity(10735): =c> 
02-27 14:11:59.002: DEBUG/MyActivity(10735): <r= 
02-27 14:11:59.012: DEBUG/MyActivity(10735): <r= 
02-27 14:11:59.422: DEBUG/MyActivity(10735): <r= 
02-27 14:12:33.949: DEBUG/MyActivity(10735): <d= 
02-27 14:12:37.463: DEBUG/MyActivity(10735): <d= 
02-27 14:12:38.294: DEBUG/MyActivity(10735): <d= 

Dies ist mein Code:

// Jsoup-Connection 
Connection c = Jsoup.connect(urls[0]); 
// Request timeout in ms 
c.timeout(5000); 
Connection.Response r = c.execute(); 
Log.d("MyActivity","<r= doInBackground ("+urls[0]+")"); 

// Get the actual Document 
Document doc = r.parse(); 
Log.d("MyActivity","<d= doInBackground ("+urls[0]+")"); 

Update:

02-27 20:38:25.649: INFO/MyActivity(18253): !=c> 
02-27 20:38:27.511: INFO/MyActivity(18253): !<r= 
02-27 20:38:28.873: INFO/MyActivity(18253): !#d= 

Ich habe einige neue Ergebnisse .. die previosu waren aus dem Ausführen meiner App auf Android als DEBUGGING .. die jetzt veröffentlichten Ergebnisse sind von ohne Debugging-Modus (von IntelliJ IDE) .. jede Erklärung, warum Debugging macht Jsoup so langsam?

Mit Debugging auf meiner i5-Desktop-Maschine habe ich keine Performance-Strafe bekommen.

Der Täter, warum mein Code so langsam auf Android ist auf jeden Fall die DEBUG-Modus Modus .. es um den Faktor 100.

+0

Ich denke, es ist etwas mit der großen Anzahl von Aufrufen sehr kleiner Methoden verwandt. Ich nehme an, dass der Java VM/Debugger interne Hooks für jeden Methodeneintrag/-ausgang oder etwas ähnliches setzt. Anyway Jsoup ist eine unglaubliche und elegante Bibliothek, aber dieses Problem existiert nur im Debug-Modus. Ich benutze Eclipse und trenne den Debugger, wenn ich müde bin. – WindRider

Verwandte Themen