crawler's People
crawler's Issues
El actor Manager debe pasar los errores a través de las pipelines
El proceso manager no almacena los errores cuando los pipelines están reiniciando
Solamente almacena mensajes de tipo Response y Result para enviarlos más tarde.
La etapa de filtrado de errores hace drop de peticiones correctas
En caso de que la etapa sufra un reinicio y su estado vuelva a ser el inicial, si llega una respuesta http correcta desde el Downloader y no está registrada en el estado de la etapa, esta se pierde.
Este es el comportamiento normal si la petición es erronea y no está guardada en el estado de la etapa,: eliminarla del pipeline para que sea reintentada por el proceso master ya que al no estar registrada en la etapa, no puede reintentarse desde este punto.
Las peticiones almacenadas en RetryHttpError nunca se borran si se recibe un Error en lugar de un Response
Refactorizar el proyecto
Ordenar estructura de directorios, poner un nombre y versión.
User Agent personalizado
Las etapas del pipeline pueden modificar su estructura en tiempo de ejecución
La forma en que las etapas se estructuran no debería poder cambiar dinámicamente, los atributos left
y right
deben ser de solo lectura.
Controlar errores y tiempo de reinicio de las dependencias de Manager
Manager deberá conocer el estado de sus procesos hijos, encolando mensajes a los procesos caídos y enviándolos cuando estén listos.
Una opción sencilla es refactorizar Manager como una máquina de estados.
Refactorizar test
Los test deben de ser independientes. Con akka-testkit todos los test comparten el mismo mailbox. Una posible solución es utilizar una TestProbe diferente para cada test.
Seguir redirecciones hasta un límite configurable
La etapa RobotsFilter no detecta cuando la solicitud de robots.txt ha fallado
Seguir robots.txt
El pipeline no reinicia las etapas si fallan durante su estado de inicialización.
El parser del robots.txt debe reconocer reglas con patrones *
Implementar supervisión
Reintentar códigos de error HTTP.
Reintentar peticiones HTTP que devuelvan ciertos códigos de error.
Soporte para URLs relativas
Es necesario "normalizar" las URLs convirtiéndolas en absolutas.
Control de profundiddad
Se implementará como una etapa de proceso en las pipelines que filtre las peticiones que superen la profundidad configurada.
Las respuestas a las peticiones de robots.txt lanzadas por RobotsFilter terminan en Master
Invalid port: -1 en algunas peticiones http
Spray.io no permite añadir una cabecera 'User-Agent' manualmente
Debe hacerse en el fichero de configuración.
https://groups.google.com/forum/#!msg/spray-user/kMb01XzmEkA/c-v1NLJbtmYJ
Algunas etapas eliminan peticiones sin notificar un error
Las respuestas del Downloader deben incluir el código de error HTTP.
Esto permitirá que las pipelines tener más información para por ejemplo, hacer filtrado de ciertos errores.
Cerrar conexiones HTTP abiertas tras un cierto timeout.
Spray client abre cierto número de conexiones con cada host y estas se reutilizan para las peticiones siguientes. Estas conexiones nunca se llegan a cerrar.
Refactorizar el protocolo
Definir correctamente el protocolo de mensajes de forma que sea fácilmente reutilizable y extensible.
Conectar las pipelines con el proceso manager
Filtrar respuestas HTTP que devuelvan ciertos códigos de error.
Guardar errores permantentes
Manager deberá enviar a Master las tareas con errores que no son recuperables (Ej: la petición HTTP ha superado el máximo de reintentos) para evitar que se vuelvan a enviar.
Mejorar el parseo de HTML
El parser SAX por defecto solo funciona con documentos HTML que sean XMLs bien formados.
Para tratar con HTML "del mundo real", habrá que utilizar otra implementación.
Crear ejecutable
Crear un ejecutable por linea de comandos que muestre la funcionalidad básica del sistema.
Reintentar tareas que tardan mucho tiempo.
Master deberá volver a enviar tareas que no se han completado en cierto timeout, ya que es posible que haya sucedido algún error o se hayan perdido los mensajes.
Split #19
Añadir logging en los actores
Implementar niveles de logging en los actores.
Posibilidad de replicar etapas de los pipelines
Permitir etapas redundantes para realizar un balanceo de carga.
El parser intenta parsear todo tipo de archivos, no solo html
Se debería controlar antes de realizar un parseo que el contenido es html o xml.
Los resultados almacenados por master deben guardarse de forma persistente.
Los resultados deben sobrevivir a caídas del proceso master y poder ser accedidos por cualquier maestro en cualquier nodo.
Soporte para crawlear aplicaciones ajax
Implementar pipelines
Implementar pipelines que permitan añadir etapas de procesado para las peticiones/respuestas así como los resultados del crawler.
Leer la configuración desde archivo
Problema de rendimiento
Con la configuración actual, el rendimiento es muy bajo, sin embargo el uso CPU se dispara al 100% en muy poco tiempo.
A veces el crawler se queda bloqueado, pero el uso de CPU continúa al 100%.
La etapa AjaxLinksTransform intenta parsear cualquier contenido, no solo html
Relacionada con #32.
Ambas fallan si no existe la cabecera 'Content-Type' en la respuesta.
Los mensajes enviados y recibidos desde el proceso master deben ser serializables.
Cualquier etapa debe poder devolver un error y cancelar una tarea
Las etapas no pueden cancelar una tarea devolviendo un error. En concreto si una tarea es filtrada por RobotsFilter, al no cancelarse, se volverá a reintentar.
Realizar test basados en propiedades
Generación de una estructura de páginas aleatoria para probar el sistema.
http://www.scalacheck.org/
No se puede ejecutar la Typesafe Console
El main funciona, pero al ejecutar la consola desde sbt lanza un error.
Esto funcionaba en 5a3ee8b y el error aparece por primera vez en a97dc22.
[error] (run-main) org.jboss.netty.channel.ChannelException: Failed to bind to: /127.0.0.1:2551
org.jboss.netty.channel.ChannelException: Failed to bind to: /127.0.0.1:2551
at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:272)
at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:391)
at akka.remote.transport.netty.NettyTransport$$anonfun$listen$1.apply(NettyTransport.scala:388)
at scala.util.Success$$anonfun$map$1.apply(Try.scala:206)
at scala.util.Try$.apply(Try.scala:161)
at scala.util.Success.map(Try.scala:206)
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
at scala.concurrent.Future$$anonfun$map$1.apply(Future.scala:235)
at com.typesafe.atmos.trace.FutureCallback.apply(FutureTrace.scala:136)
at com.typesafe.atmos.trace.FutureCallback.apply(FutureTrace.scala:127)
at scala.concurrent.impl.CallbackRunnable.run(Promise.scala:32)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.processBatch$1(BatchingExecutor.scala:67)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply$mcV$sp(BatchingExecutor.scala:82)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59)
at akka.dispatch.BatchingExecutor$Batch$$anonfun$run$1.apply(BatchingExecutor.scala:59)
at scala.concurrent.BlockContext$.withBlockContext(BlockContext.scala:72)
at akka.dispatch.BatchingExecutor$Batch.run(BatchingExecutor.scala:58)
at akka.dispatch.TaskInvocation.run(AbstractDispatcher.scala:42)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:386)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: java.net.BindException: La dirección ya se está usando
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:444)
at sun.nio.ch.Net.bind(Net.java:436)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:214)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at org.jboss.netty.channel.socket.nio.NioServerBoss$RegisterTask.run(NioServerBoss.java:193)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.processTaskQueue(AbstractNioSelector.java:366)
at org.jboss.netty.channel.socket.nio.AbstractNioSelector.run(AbstractNioSelector.java:290)
at org.jboss.netty.channel.socket.nio.NioServerBoss.run(NioServerBoss.java:42)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Realizar test automatizados con varias JVM
Realizar test en los que se pruebe el funcionamiento distribuido.
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.