客户端界面

hubstorage的Python项目详细描述


[警告]此包已弃用,请改用python-scrapinghub(>;=1.9.0)。

https://badge.fury.io/py/hubstorage.pnghttps://travis-ci.org/scrapinghub/python-hubstorage.svg?branch=master

注意

该模块是实验性的,其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')]

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
amazon web services Java AWS s3:如何使用Md5预签名url设置和上载内容   twitter使用java从推文中排除一些单词   如何在GUI java中添加延迟时间   java程序,如何使用Outputstream发送两次消息   java为什么是javax。在将Yasson与JSONB一起使用时,Glassfish中的json需要作为依赖项吗?   如何从dist文件夹中读取文件   java如何获取与模式匹配的文件列表   java如何使用Intent从Android应用程序发送彩信?   java限制对Spring的依赖,同时又不丧失框架的功能   java是否将捕获异常报告给Firebase/Fabric等?   用jdbcjava实现mysql分页   给定URI的java注释检索   java是序列化/反序列化公共枚举的简单方法?   java如何使用jMockit模拟本机方法