常用

从爬虫转换(CrawlerTF)

使用 网页采集器 获取网页数据,拖入的列需要为超链接

一般的get请求

一般情况下, 将从爬虫转换拖入到对应的URL列中,通过下拉菜单选择要调用的爬虫名称,即可完成所有的配置:

请求设置

本模块是沟通网页采集器和数据清洗的桥梁。本质上说,网页采集器是针对获取网页而特别定制的数据清洗模块

你需要填写爬虫选择,告诉它要调用哪个采集器。注意:

  • 早期版本的Hawk,会默认选择在算法模块的第一个网页采集器,但实践证明这样会导致问题,后来就取消了功能。

实现post请求

web请求中,有两种主要的请求类型:post和get。 使用POST能支持传输更多的数据。更多的细节,可以参考http协议的相关文档,网上汗牛充栋,这里就不多说了。

post请求时,Hawk要给服务器需要传递两个参数:url 和post。一般来说,在执行post请求时,url是稳定的,post值是动态改变的。

首先要配置调用的网页采集器为post模式(打开网页采集器,请求详情,模式->下拉菜单)。

之后,需要将从爬虫转换拖到要调用的url列上。如果没有url列,可以通过添加新列,生成要访问的url列。

之后,我们要将post数据传递到网页采集器中。你总是可以通过合并多列拼接或各种手段,生成要Post的数据列。之后,可以在从爬虫转换中的post数据中,填写[post列], 而post列就是包含post数据的列名。 注意:

  • Hawk使用方括号语法,来引用其他列的值作为当前的参数

Post数据(PostData):

  • 类型:String
  • 没有描述

代理配置(Proxy):

  • 类型:String
  • 没有描述

爬虫选择(CrawlerSelector):

  • 类型:可编辑选项
  • 填写采集器或模块的名称

分页(SplitPageTF)

根据总页数和每页数量进行分页操作,拖入列为总页数。 相比于使用Python转换器,可极大地简化操作。注意:

  • 早期版本的Hawk中,若希望对网页进行分页,需要拖入多个模块才能实现,非常繁琐。
  • 本模块在输入数量数,每页数量和起始值之后,即可自动创建步进整数。
  • 例如总数量270, 每页数量为20,起始值为1,则生成的列为1,2,3..14

最小值(MinValue):

  • 类型:String 默认值:1
  • 除了直接填写数值,还可通过方括号表达式从其他列传入

每页数量(ItemPerPage):

  • 类型:String 默认值:1
  • 除了直接填写数值,还可通过方括号表达式从其他列传入

转换为Json(JsonTF)

从字符串转换为json(数组或字典类型)

当输入字符串是Json时,可以通过Json转换器将文本转换为Json。其工作模式和Python转换器一样,此处不赘述。

json转换器的转换结果,实际上是一个动态类型的python对象。例如如下json:

{
'key':[{}{}{}]
'value':
{
'key1':value
'key2':value
}
}

拖入json转换器到该列,如果工作模式是不进行转换,则你可以在转换结果列,拖入Python转换器,脚本内容填写data[key],工作模式选择转换为列表,则key中的数组自动会被提取出来。

注意事项:

  1. python和json转换器配合使用,能够解决一大类ajax网页的问题。更详细的内容,可参考
  2. 网页的json格式并不标准,此时需要通过其他工具,对字符串进行预处理,方可转换为json。
  3. 如果json非常复杂,是不建议直接用Hawk做数据清洗的,正确的做法是将json保存成文本,之后用其他工具或手工编写代码后处理。

工作模式(ScriptWorkMode):

  • 类型:ScriptWorkMode 默认值:NoTransform *

多文档

生成多条数据(文档)

单文档

单文档

不进行转换


延时(DelayTF)

在工作流中插入延时,可休眠固定长度避免爬虫被封禁,单位为ms

在不同的位置插入延时有不同的行为,例如在模块A之前插入延时,则A模块每次执行前都会延时固定长度。 除了拖入延时,在串行模式下填入延时时间,则会在每个web请求前插入指定的延时,更加方便。

延时值(DelayTime):

  • 类型:String
  • 单位为毫秒,也可使用方括号语法,例如[a]表示从a列中读取延时长度

子任务-执行(EtlEX)

调用其他任务,作为执行器,一般位于任务的末尾。

子任务是Hawk中高级但却非常重要的功能,可以实现例如多级跳转,采集详情页等等的功能,非常强大。 所谓子任务,就是能先构造出一个任务,然后被其他任务调用。被调用的任务就是子任务。我们应该能够了解子任务其实就是函数,可以定义输入列和输出列,把整个子任务看成一个模块,从而方便重用。

使用子任务-执行的例子: 先设计构造获取某个页面全部图片的任务, 并创建主任务,在主任务中调用刚才创建的子任务。

添加到任务(AddTask):

  • 类型:Boolean 默认值:False
  • 勾选后,本子任务会添加到任务管理器中

子任务-选择(ETLSelector):

  • 类型:可编辑选项
  • 输入或选择调用的子任务的名称

调用范围(ETLRange):

  • 类型:String
  • 设定调用子任务的模块范围,例如2:30表示被调用任务的第2个到第30个子模块将会启用,其他模块忽略,2:-1表示从第2个到倒数第二个启用,符合python的slice语法,为空则默认全部调用

属性映射(MappingSet):

  • 类型:String
  • 源属性:目标属性列 多个映射中间用空格分割,例如A:B C:D, 表示主任务中的A,B属性列会以C,D的名称传递到子任务中