Refactorizado Explorer para que el Explorer, y no el exploring_task, se encargue de postear las tareas de captura.

Creado una funcion independiente de creacion de capturas para que sea compartida entre todos aquellos servicios que las creen.
This commit is contained in:
pablomartincalvo 2018-09-21 18:19:33 +02:00
parent b77a4752b8
commit 1f372b85b6
4 changed files with 286 additions and 94 deletions

View file

@ -10,6 +10,7 @@ from random import randint
from core.mysql_wrapper import get_anunciosdb, get_tasksdb
from core.scrapping_utils import UrlAttack
from core.alerts import alert_master
from capturer.capturer import create_capturing_task
class Explorer():
@ -48,7 +49,14 @@ class Explorer():
current_task = ExploringTask(self.compose_listing_url)
current_task.explore()
if current_task.status == 'Referencias ready':
referencias = current_task.get_referencias()
for referencia in referencias:
create_capturing_task(referencia, self.tasksdb)
current_task._update_status(self, "Sent to queue")
continue
self.stop()
@ -59,10 +67,12 @@ class Explorer():
pass
def there_is_work(self):
#TODO Añadir que no se trabaja si se ha lanzado tarea en los ultimos 10 minutos
"""
Funcion que agrupa las condiciones que se deben cumplir para poder trabajar
"""
if self.check_if_recent_task():
return False
if not self.in_working_hours():
return False
@ -84,19 +94,6 @@ class Explorer():
sleep(Explorer.sleep_time_no_service)
self.db_retries = self.db_retries + 1
return False
def queue_is_up(self):
#TODO Comprobar que Redis esta vivo
while self.queue_retries <= self.max_queue_retries:
try:
#codigo que testea si redis esta vivo
self.queue_retries = 0
return True
except:
sleep(Explorer.sleep_time_no_service)
self.queue_retries = self.queue_retries + 1
return False
def in_working_hours(self):
@ -154,6 +151,19 @@ class Explorer():
"""
return (self.get_max_referencias_for_today() / 30) * 6
def check_if_recent_task(self):
"""
Mira si se ha creado alguna tarea recientemente
"""
query_statement = """ SELECT count(uuid)
FROM exploring_tasks_logs
WHERE status = 'Attacked'
AND write_time >= now() - INTERVAL 10 MINUTE
"""
cursor_result = self.tasksdb.query(query_statement)
return cursor_result.row_count
def compose_listing_url(self):
"""
Genera URLs de manera aleatoria
@ -169,7 +179,7 @@ class Explorer():
return url
class ExploringTask():
class ExploringTask:
def __init__(self, url):
self.anunciosdb = get_anunciosdb()
@ -192,8 +202,6 @@ class ExploringTask():
self._extract_referencias(attack.get_text())
if self.referencias:
self._update_status('Referencias ready')
self._post_tasks_to_queue()
self._update_status('Sent to Queue')
elif self.there_are_referencias:
self._update_status('Failure - No new referencias in HTML')
else:
@ -246,8 +254,7 @@ class ExploringTask():
for ad in ads:
if self._is_new_listing(ad["data-adid"]):
self.referencias.append(ad["data-adid"])
def _is_new_listing(self, referencia):
"""
Comprueba si el listing ya existe en la base de datos de anuncios
@ -263,12 +270,15 @@ class ExploringTask():
return False
else:
return True
def _post_tasks_to_queue(self):
#TODO Mandar las referencias a redis
pass
def get_referencias(self):
"""
Devuelve las referencias, si las hay
"""
if self.referencias:
return self.referencias
else:
return None