客户端界面
hubstorage的Python项目详细描述
[警告]此包已弃用,请改用python-scrapinghub(>;=1.9.0)。
注意
该模块是实验性的,其api可能会在没有事先通知的情况下更改。
概述
此python库可用于通过storage.scrapinghub.com终结点与蜘蛛、作业和擦写数据进行交互,请参见Scrapinghub API。
测试
运行测试需要运行hubstorage后端,
以及pythonresponses
库(请参见requirements-test.txt
)。
使用量
首先,使用您的api密钥进行授权:
>>> from hubstorage import HubstorageClient >>> hс = HubstorageClient(auth='apikey') >>> hc.server_timestamp() 1446222762611
项目
获取项目设置或作业摘要:
>>> project = hc.get_project('1111111') >>> project.settings['botgroups'] [u'botgroup1', ] >>> project.jobsummary() {u'finished': 6, u'has_capacity': True, u'pending': 0, u'project': 1111111, u'running': 0}
获取与其名称相关联的蜘蛛id:
>>> project.ids.spider('foo') 1
查看上一份工作摘要:
>>> summaries = project.spiders.lastjobsummary(count=3)
要获取每个蜘蛛的作业摘要:
>>> summary = project.spiders.lastjobsummary(spiderid='1')
工作
作业可以通过id直接检索(project-id/spider-id/job-id):
>>> job = hc.get_job('1111111/1/1') >>> job.key '1111111/1/1' >>> job.metadata['state'] u'finished'
创建新作业需要蜘蛛名:
>>> job = hc.push_job(projectid='1111111', spidername='foo') >>> job.key '1111111/1/1'
优先级可以介于0和4之间(从最低到最高),默认值为2。
以最高优先级从项目级别推送作业:
>>> job = project.push_job(spidername='foo', priority=4) >>> job.metadata['priority'] 4
使用spider参数推送作业:
>>> project.push_job(spidername='foo', spider_args={'arg1': 'foo', 'arg2': 'bar'})
通过调用request_cancel():
>>> job.request_cancel() >>> job.metadata['cancelled_by'] u'John'
删除作业:
>>> job.purged() >>> job.metadata['state'] u'deleted'
工作详细信息
作业详细信息可以在作业元数据中找到,它是scrapystats:
>>> job = hc.get_job('1111111/1/1') >>> job.metadata['version'] u'5123a86-master' >>> job.metadata['scrapystats'] ... u'downloader/response_count': 104, u'downloader/response_status_count/200': 104, u'finish_reason': u'finished', u'finish_time': 1447160494937, u'item_scraped_count': 50, u'log_count/DEBUG': 157, u'log_count/INFO': 1365, u'log_count/WARNING': 3, u'memusage/max': 182988800, u'memusage/startup': 62439424, ...
任何东西都可以存储在元数据中,下面是如何添加标记的示例:
>>> job.update_metadata({'tags': 'obsolete'})
工作
遍历每个项目的所有作业元数据(降序):
>>> jobs_metadata = project.jobq.list() >>> [j['key'] for j in jobs_metadata] ['1111111/1/3', '1111111/1/2', '1111111/1/1']
jobq元数据字段集不如job.metadata详细,但也很少包含新字段。 可以使用jobmeta参数请求其他字段。 如果使用了,则由用户列出所有必需的字段,因此除了请求的字段外,只会添加很少的默认字段。
>>> metadata = next(project.jobq.list()) >>> metadata.get('spider', 'missing') u'foo' >>> jobs_metadata = project.jobq.list(jobmeta=['scheduled_by', ]) >>> metadata = next(jobs_metadata) >>> metadata.get('scheduled_by', 'missing') u'John' >>> metadata.get('spider', 'missing') missing默认情况下,{t{5} $返回最大的最后1000个结果。可以使用start参数进行分页:
>>> jobs_metadata = project.jobq.list(start=1000)
有几个过滤器,如spider、state、has_tag、less_tag、startts和ends。 要获取按标记筛选的作业:
>>> jobs_metadata = project.jobq.list(has_tag=['new', 'verified'], lacks_tag='obsolete')
标记列表具有ORpower,因此在上述情况下,需要具有“new”或“verified”标记的作业。
要为每个蜘蛛获取特定数量的最后完成的作业:
>>> jobs_metadata = project.jobq.list(spider='foo', state='finished' count=3)
有4种可能的作业状态,可以用作按状态筛选的值:
- 挂起
- 运行
- 完成
- 删除
项目
迭代项目:
>>> items = job.items.iter_values() >>> for item in items: # do something, item is just a dict
日志
遍历10个第一个日志,例如:
>>> logs = job.logs.iter_values(count=10) >>> for log in logs: # do something, log is a dict with log level, message and time keys
集合
让我们为foo spider存储散列和时间戳对。使用Collections的通常工作流是:
>>> collections = project.collections >>> foo_store = collections.new_store('foo_store') >>> foo_store.set({'_key': '002d050ee3ff6192dcbecc4e4b4457d7', 'value': '1447221694537'}) >>> foo_store.count() 1 >>> foo_store.get('002d050ee3ff6192dcbecc4e4b4457d7') '1447221694537' >>> for result in foo_store.iter_values(): # do something with _key & value pair >>> foo_store.delete('002d050ee3ff6192dcbecc4e4b4457d7') >>> foo_store.count() 0
前沿
具有Frontier:
的典型工作流>>> frontier = project.frontier
向Frontier添加请求:
>>> frontier.add('test', 'example.com', [{'fp': '/some/path.html'}]) >>> frontier.flush() >>> frontier.newcount 1
添加带有附加参数的请求:
>>> frontier.add('test', 'example.com', [{'fp': '/'}, {'fp': 'page1.html', 'p': 1, 'qdata': {'depth': 1}}]) >>> frontier.flush() >>> frontier.newcount 2
从前线删除插槽example.com:
>>> frontier.delete_slot('test', 'example.com')
要检索给定插槽的请求:
>>> reqs = frontier.read('test', 'example.com')
删除一批请求:
>>> frontier.delete('test', 'example.com', '00013967d8af7b0001')
要检索给定插槽的指纹:
>>> fps = [req['requests'] for req in frontier.read('test', 'example.com')]