2012-04-24 25 views
7

Así que estoy construyendo una aplicación que muestra una imagen desde un sitio web al que voy en una interfaz más fácil de usar. En este momento hay muchos problemas, pero el más grande en este momento es buscar las imágenes para mostrarlas.¿Hay algo más rápido que Jsoup para raspar HTML?

De la manera en que lo tengo ahora, las imágenes se muestran en un GridView de tamaño 12, reflejando el número de imágenes en cada página del tablero de imágenes. Estoy usando Jsoup para raspar la página para que las URL de la imagen en miniatura se muestren en GridView, así como para que las URL de las imágenes de tamaño completo se muestren cuando un usuario hace clic en la miniatura.

El problema ahora es que toma de 8-12 segundos en promedio para Jsoup obtener la página HTML para raspar. Esto me parece inaceptable y me preguntaba si había alguna forma de hacerlo más rápido o si esto sería un cuello de botella inherente del que no puedo hacer nada.

Aquí está el código que estoy usando para buscar la página para raspar:

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(); 
} 

Respuesta

6

que se utiliza para Jsoup un raspador TLFN y no tuve problemas con la velocidad. Debes reducir el cuello de botella. Supongo que es su raspado lo que está causando el problema de la velocidad. Trate de rastrear su selector y su tráfico de red por separado y vea cuál es el culpable. Si su selector tiene la culpa, considere buscar otro enfoque para consultar y comparar los resultados.

Para una idea más rápida y general, siempre puede ejecutar Jsoup desde un proyecto Java normal y cuando sienta que lo ha mejorado, vuelva a colocarlo en un dispositivo y vea si tiene mejoras de rendimiento similares.

EDITAR

No es que esto es su problema, pero tenga en cuenta que el uso de iteradores 'pueden' causar un poco de recolección de basura para disparar. Por lo general, esto no es una preocupación, aunque si los usa en muchos lugares con mucha repetición, pueden causar que algunos dispositivos reciban un golpe de rendimiento notable.

no es un gran

for (Element link : links) 

mejor

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

EDIT 2

Si las URL de imágenes comienzan con/alt2/usted puede ser capaz de utilizar^= en lugar de * = el cual podría hacer la búsqueda más rápida. Además, dependiendo de la cantidad de HTML, puede estar perdiendo mucho tiempo buscando en el lugar completamente equivocado para estas imágenes. Verifique si estas imágenes están envueltas dentro de un contenedor identificable como, por ejemplo, <div class="posts">. Si puede reducir la cantidad de HTML para examinar, puede mejorar el rendimiento.

+0

Bueno, la cosa es que lo cronometré la llamada get() que es donde obtuve el retraso de 8-12 segundos. Echaré un vistazo al selector sin embargo. – seraphzero

+0

Puede ser más rápido seleccionar todas las imágenes y luego recorrerlas manualmente seleccionando las imágenes correctas. –

+0

Ejecutando más pruebas de tiempo, estoy seguro de que es la llamada a get() la que está ocupando todo el tiempo. En un proyecto Java normal, la llamada get() tarda alrededor de 1-2 segundos y la llamada select() dura aproximadamente 0,05 segundos. Al ejecutar el mismo código en el emulador de Android, está tomando los mencionados 8-12 segundos para get() y alrededor de 0.7 segundos para select(). – seraphzero

0

¿Puede identificar mejor el contenido que desea obtener, porque sólo hay una razón por la que puede ralentizar la ejecución de su código

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

¿Hay alguna "clase" común con las imágenes que desea obtener ?

+0

Lamentablemente, no. Solo son las URL de origen para las imágenes. – seraphzero

+0

¿Puedes publicar el html? – ChristopheCVB

+0

La imagen en miniatura sería así: 'blog, Takahashi Ai,' – seraphzero

2

me encontré con el mismo problema:

El Logcat en mi HTC uno S claramente muestra que la conexión de respuesta sólo toma los primeros 4 segundos (3 conexiones en paralelo). El análisis sintáctico lleva casi 30-40 segundos, que es un tiempo enorme .. notar que el HTC One S tiene un doble núcleo muy rápido @ 1,4ghz .. El problema no está claramente conectada con el emulador

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= 

Este es mi código:

// 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]+")"); 

actualización:

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= 

Obtuve algunos resultados nuevos ... los previosu eran de ejecutar mi aplicación en Android como DEBUGGING .. los resultados ahora publicados se ejecutan sin modo de depuración (de IntelliJ IDE) .. ¿alguna explicación de por qué la depuración hace que Jsoup sea tan lento?

Ejecutando depuración en mi i5-Desktop-Machine no recibí ninguna penalización de rendimiento.

El culpable por eso que mi código es tan lento en Android es sin duda el modo de depuración modo .. que ralentiza jsoup por factor de 100.

+0

Creo que es algo relacionado con la gran cantidad de llamadas de métodos muy pequeños. Supongo que Java VM/debugger establece ganchos internos en cada entrada/salida de método o algo así. De todos modos, Jsoup es una biblioteca increíble y elegante, pero este problema solo existe en el modo de depuración. Uso Eclipse y desconecto el depurador cuando estoy cansado esperando. – WindRider

Cuestiones relacionadas