跳转到主要内容

Scrapinghub HubStorage的客户端接口

项目描述

[警告] 此软件包已弃用,请使用 python-scrapinghub (>=1.9.0) 代替。

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

概述

此Python库可以通过 storage.scrapinghub.com 端点与蜘蛛、作业和抓取数据进行交互,请参阅 Scrapinghub API

需求

测试

运行测试需要hubstorage后端运行,以及python responses 库(见 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

推送带蜘蛛参数的工作

>>> 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

默认情况下,jobq.list()返回最后1000个结果的最大值。使用start参数可以启用分页

>>> jobs_metadata = project.jobq.list(start=1000)

有几个过滤器,如蜘蛛、状态、has_tag、lacks_tag、startts和endts。要获取按标签筛选的工作

>>> jobs_metadata = project.jobq.list(has_tag=['new', 'verified'], lacks_tag='obsolete')

标签列表具有OR功能,因此在上面的情况下,预期具有‘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蜘蛛存储哈希和时间戳对。使用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.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')]

项目详情


下载文件

下载适合您的平台的文件。如果您不确定选择哪一个,请了解更多关于安装包的信息。

源分发

hubstorage-0.23.6.tar.gz (31.2 kB 查看哈希值)

上传时间

构建版本

hubstorage-0.23.6-py2-none-any.whl (37.9 kB 查看哈希值)

上传时间 Python 2

由以下支持