service.py 1.87 KB
Newer Older
1
from datetime import datetime
2
from urllib.request import urlopen
3
from scrapyd_api import ScrapydAPI
4
from .models import Job
5 6 7 8


class Service:

9 10 11 12
    def __init__(self):
        self.api = ScrapydAPI()

    def update_jobs_status(self):
13
        try:
14
            jobs = self.api.list_jobs('exa')
15 16 17
            finished = jobs.get('finished')
            if finished:
                for i in finished:
18
                    Job.objects.filter(job_uuid=i['id'], status='RUN').update(status='FIN', end_time=i['end_time'])
19 20
        except:
            pass
21 22

    def run_job(self, job):
23
        job = Job.objects.get(pk=job)
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
24
        job.job_uuid = self._run(job)
25 26 27
        job.start_time = datetime.now()
        job.status = 'RUN'
        job.save()
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
28
        return job.json()
29 30 31

    def cancel_job(self, job):
        job = Job.objects.get(pk=job)
32
        self.api.cancel('exa', job.job_uuid)
33 34 35
        job.end_time = datetime.now()
        job.status = 'FIN'
        job.save()
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
36
        return job.json()
37 38 39 40 41

    def delete_job(self, job):
        job = Job.objects.get(pk=job)
        job.status = 'DEL'
        job.save()
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
42
        return job.json()
43

44 45 46 47 48 49 50 51
    def activate_job(self, job):
        job = Job.objects.get(pk=job)
        job.start_time = None
        job.end_time = None
        job.status = 'PEN'
        job.save()
        return job.json()

52 53
    def restart_job(self, job):
        job = Job.objects.get(pk=job)
Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
54
        job.job_uuid = self._run(job)
55 56 57 58 59 60
        job.start_time = datetime.now()
        job.end_time = None
        job.status = 'RUN'
        job.save()
        return job.json()

61 62
    def get_log(self, job):
        job = Job.objects.get(pk=job)
63
        url = 'http://127.0.0.1:6800/logs/exa/{}/{}.log'.format(job.spider.sp_name, job.job_uuid)
64 65 66
        response = urlopen(url)
        return response.read()

Vasyl Bodnaruk's avatar
Vasyl Bodnaruk committed
67 68
    def _run(self, job):
        return self.api.schedule('exa', job.spider.sp_name, query=job.query)
69