from __future__ import absolute_import
from requests.compat import urljoin
from .exceptions import NotFound, _wrap_http_errors
from .jobs import Jobs
from .utils import get_tags_for_update
[docs]
class Spiders(object):
"""Class to work with a collection of project spiders.
Not a public constructor: use :class:`~scrapinghub.client.projects.Project`
instance to get a :class:`Spiders` instance.
See :attr:`~scrapinghub.client.projects.Project.spiders` attribute.
:ivar project_id: string project id.
Usage::
>>> project.spiders
<scrapinghub.client.spiders.Spiders at 0x1049ca630>
"""
def __init__(self, client, project_id):
self.project_id = project_id
self._client = client
[docs]
def get(self, spider, **params):
"""Get a spider object for a given spider name.
The method gets/sets spider id (and checks if spider exists).
:param spider: a string spider name.
:return: a spider object.
:rtype: :class:`scrapinghub.client.spiders.Spider`
Usage::
>>> project.spiders.get('spider2')
<scrapinghub.client.spiders.Spider at 0x106ee3748>
>>> project.spiders.get('non-existing')
NotFound: Spider non-existing doesn't exist.
"""
project = self._client._hsclient.get_project(self.project_id)
spider_id = project.ids.spider(spider, **params)
if spider_id is None:
raise NotFound("Spider {} doesn't exist.".format(spider))
return Spider(self._client, self.project_id, spider_id, spider)
[docs]
def list(self):
"""Get a list of spiders for a project.
:return: a list of dictionaries with spiders metadata.
:rtype: :class:`list[dict]`
Usage::
>>> project.spiders.list()
[{'id': 'spider1', 'tags': [], 'type': 'manual', 'version': '123'},
{'id': 'spider2', 'tags': [], 'type': 'manual', 'version': '123'}]
"""
project = self._client._connection[self.project_id]
return project.spiders()
[docs]
def iter(self):
"""Iterate through a list of spiders for a project.
:return: an iterator over spiders list where each spider is represented
as a dict containing its metadata.
:rtype: :class:`collection.Iterable[dict]`
Provided for the sake of API consistency.
"""
return iter(self.list())
[docs]
class Spider(object):
"""Class representing a Spider object.
Not a public constructor: use :class:`Spiders` instance to get
a :class:`Spider` instance. See :meth:`Spiders.get` method.
:ivar project_id: a string project id.
:ivar key: a string key in format 'project_id/spider_id'.
:ivar name: a spider name string.
:ivar jobs: a collection of jobs, :class:`~scrapinghub.client.jobs.Jobs` object.
Usage::
>>> spider = project.spiders.get('spider1')
>>> spider.key
'123/1'
>>> spider.name
'spider1'
"""
def __init__(self, client, project_id, spider_id, spider):
self.project_id = project_id
self.key = '{}/{}'.format(str(project_id), str(spider_id))
self._id = str(spider_id)
self.name = spider
self.jobs = Jobs(client, project_id, self)
self._client = client