Hawk 4.3 转换器
转换器是最为常用的一种类型,当然它的使用也是最复杂的。
转换器有三种子类型:
- A:单文档->单文档:例如仅将某一列的字符提取出来
- B:单文档->多文档:典型的如
从爬虫转换,每一行url都可能生成20个甚至更多的文档 - C:多文档->单文档:很少见,需要时再进行介绍
如果你熟悉ODPS,A模式其实是UDF,B模式是UDAF。
绝大多数转换器都是A类型。但同一个转换器在不同的配置下,可能会有多种行为,例如从爬虫转换,如果选择的网页采集器为One(单文档)模式,则该转换器为A模式,若为List模式,则为B模式。
关于输入列和输出列
输入列,就是要输入这个模块的列,早期也称作原列名; 输出列,则指的是模块输出的列。 A模式下,如果新列名为空,则新列名等于原列名,直接修改在原始列上。
如果在b模式下,参考单转多文档的特别说明。
我承认我实在不会起名字,各种变量的名字和模块的名字设计的都不好,可惜一旦发布出去,就很难再修改了。在杭州喝了点酒,写文档晕乎乎的哈哈哈。
单转多文档的特别说明
当你使用List模式的爬虫,或单转多时,虽然生成了多个文档,但原始的数据(如URL)不见了。这是因为Hawk丢弃了这些列。
经过大量实践,如果不这么做,每个新数据后面,都会跟上原始的老数据,如果1转20,则老数据会重复生成20次,这是没有必要的。
当然,有时转换时需要包含原始数据的部分列,则可在转换器的新列名中填写要鲤鱼跳龙门的列的名称,中间用空格分割。
删除该列,添加新列,修改列名
向要删除的列,直接拖入删除该列,即可删掉。
由于删除之后,该工具就看不到了,要想修改可以在数据清洗的属性对话框中的工作列表里选择和修改。
修改列名:拖入的列是原始列,填写新列名后,数据就转换到了新列上去。直接在列上的文本框中修改列名,效果是类似的。
正则转换器,提取数字
需要列名,正则表达式,以及要匹配的第n个内容。
如果不填写新列名,则内容直接覆盖原始列。
提取数字是正则转换器的特例,它能够提取浮点或整数,也能包含正负数。
如果选择反向,则会返回倒数第n个内容。
如果没有发现匹配,则返回空。
字符分割,正则分割
需要列名,Hawk会通过字符或正则表达式分割目标列,返回第n个内容。
正则替换
需要列名,使用正则表达式替换目标文本。此工具非常有用,强烈建议学习正则表达式。
字符首尾抽取
当文本为CABD时,需要获取B,而B非常长,写正则表达式提取有很大困难时,可以使用本模块。
此时,首串填写A,尾串填写D,则Hawk就能将B夹逼出来。如果勾选包含首尾字符,则输出ABD,否则只有B。
注意,建议A和D在文本中是唯一的,否则抽取出来的B可能并不是你想要的。
该工具特别适合在抽取网页的某一特定内容时使用。
Python转换器
神器!神器!神器!
你可以编写多行的类似Python3风格的代码,支持中文变量,中文字符串也不需要在前面加u。
举几个例子:
- 将A列的内容,赋值到B列:
data[B]=data[A] - 将A列的内容删掉
del data[A] - 如果列名填写了A,则value代表A列的值,可以直接写
return int(value)+1
python转换器也有三种工作模式:
- 不进行转换: 直接将结果填入该单元格
- 单文档: 将得到的文档,横向拼接在原始文档右边
- 多文档: 此时转换器行为,特别类似cross模式的生成器。
注意:
- 你可以在文本框中定义函数,但不建议太过复杂
- 很难引入第三方库,这受限于ironpython的功能
- 通常需要包含返回值。
- data就是该行文档的默认命名,value是该单元格的默认命名,假设列名为A,则
data[A]==value
Json转换器
当输入字符是Json时,可以通过Json转换器转换其内容。
其工作模式和python转换器一样,此处不赘述。
常见的问题是,网页给出的json格式并不标准,此时需要通过其他工具,对字符串进行预处理,方可转换为json。
json转换器的转换结果,实际上是一个动态类型的python对象。例如如下json:
{
'key':[{}{}{}]
'value':
{
'key1':value
'key2':value
}
}
拖入json转换器到该列,如果工作模式是不进行转换,则你可以在转换结果列,拖入python转换器,脚本内容填写data[key],工作模式选择多文档,则key中的数组自动会被提取出来。
其他使用方法就不多讲了,可以多试验。python和json转换器配合使用,能够解决一大类ajax网页的问题。
当然,如果json非常复杂,是不建议直接用Hawk做数据清洗的,正确的做法是将json保存成文本,之后用其他工具或手工编写代码后处理。
XPath转换器
当输入的单元格内容为html文档,而又想提取其部分数据,用网页采集器又杀鸡用牛刀,则可以考虑使用它。
XPath语法可参考网上其他教程。选择提取多个数据,则处在单文档到多文档模式, 如果不勾选,则只会提取满足条件的第一个数据。
如果勾选提取正文,则XPath转换器会自动检索出页面中的正文内容。
清除空白符
默认能去掉文本前后的空白字符,也可以通过勾选内部选项,清除文本中间的空白符。当然使用正则替换也能实现类似的要求,只是本模块会更简单。
并行
该转换器在调试模式和串行执行模式不起任何作用,仅仅作为一个标志。它能够在并行模式下,给执行引擎一个并行分叉的标志。还能设置为每个子线程分配多少个种子文档。具体的并行思想,可参考其他章节。
从爬虫转换
由于从爬虫转换太过重要,我们单独将其拿出来说。详细信息请参考4.1节 从爬虫转换。
它是沟通网页采集器和数据清洗的桥梁。本质上说,网页采集器是针对获取网页而特别定制的数据清洗模块。
你需要填写爬虫选择,告诉它要调用哪个采集器。早期版本的HawK,会默认选择在算法模块的第一个网页采集器,但实践证明这样会导致问题,后来就取消了功能。
重试次数和错误后延时时间(单位为毫秒),可以指定采集器在发生失败时的行为。不过,网站一旦封锁,即使重试可能也不会带来什么效果。
而任务队列卷展栏的内容,可以让网页采集器抓取的内容插入到任务队列中,从而执行后续抓取。这能够构造出广度优先遍历抓取,但是,Hawk的这项功能是不完备的。不建议除了设计者本人的其他任何人使用。
至于更多细节,
合并多列
神器之一!
该模块可以将多个列合并成一个列。常见的如将page合并到url中,也可以通过文件名,合并出要保存的文件的位置,是使用次数最多的模块。
例如:
format= {0}+{1}+{2}
能把三个列的内容用加号拼接起来。{0}代表拖入的列名,其他{1}{2}则需要其他列的名字来指定,例如其他列分别为B和C,则:
其他列= B C (中间用空格分割,不支持方括号表达式)
这种字符串表示法,使用的是C#的string.format语法。
HTML字符转义,URL字符转义
当页面包含HTML时,一些字符可能已经被转义了,例如空格成了nsbp%
,就需要HTML字符转义,拖入到对应的列,将其解码,当然也可以编码。
URL字符转义也是一样的道理,只是会将其转换为URL编码。C#的HttpClient比python更加智能,默认对带特殊符号和中文的URL进行编码,所以这个模块用的并不多。
自增主键
可以添加新的一列,从1开始的自增主键。
Hawk 4.3 转换器的更多相关文章
- Hawk 6. 编译和扩展开发
Hawk是开源项目,因此任何人都可以为其贡献代码.作者也非常欢迎使用者能够扩展出更有用的插件. 编译 编译需要Visual Stuido,版本建议使用2015, 2010及以上没有经过测试,但应该可以 ...
- Hawk 4. 数据清洗
数据清洗模块,包括几十个子模块, 这些子模块包含四类:生成, 转换, 过滤和执行. 数据清洗可以通过组合多个不同的子模块,生成多样的功能,通过拖拽构造出一个工作流,它能够产生一个有限或无限的文档序列. ...
- Hawk 1.2 快速入门2 (大众点评18万美食数据)
本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...
- Hawk 数据抓取工具 使用说明(二)
1. 调试模式和执行模式 1.1.调试模式 系统能够通过拖拽构造工作流.在编辑流的过程中,处于调试模式,为了保证快速地计算和显示当前结果(只显示前20个数据,可在调试的采样量中修改),此时,所有执行器 ...
- Hawk 3.1 动态页面,ajax,瀑布流
不少朋友反映,Hawk的手气不错,好像没法处理动态页面.其实很容易,比其他软件都容易,让我慢慢道来. 1. 什么是动态页面 很多网站,在刷新的时候会返回页面的全部内容,但实际上只需要更新一部分,这样可 ...
- # Hawk:开源贡献计划,设计,反思
Hawk在发布之后,收到了不少朋友的感谢和使用反馈,沙漠君表示非常开心.软件肯定有很多的问题和不足,还有很多可扩展的空间,因此我希望更多的朋友,能够参与到改进Hawk的计划中来,为开源世界作出努力. ...
- Hawk: 无编程抓取淘女郎的所有高清照片
1.这是什么鬼? 哦?美女? 最近看了这一篇文章:http://cuiqingcai.com/1001.html 大概说的是用Python和Pyspider(这货好像是我的一位师兄写的,吓尿),抓取淘 ...
- Hawk: 20分钟无编程抓取大众点评17万数据
1. 主角出场:Hawk介绍 Hawk是沙漠之鹰开发的一款数据抓取和清洗工具,目前已经在Github开源.详细介绍可参考:http://www.cnblogs.com/buptzym/p/545419 ...
- 设计爬虫Hawk背后的故事
本文写于圣诞节北京下午慵懒的午后.本文偏技术向,不过应该大部分人能看懂. 五年之痒 2016年,能记入个人年终总结的事情没几件,其中一个便是开源了Hawk.我花不少时间优化和推广它,得到的评价还算比较 ...
随机推荐
- Python编码记录
字节流和字符串 当使用Python定义一个字符串时,实际会存储一个字节串: "abc"--[97][98][99] python2.x默认会把所有的字符串当做ASCII码来对待,但 ...
- javascript动画系列第三篇——碰撞检测
前面的话 前面分别介绍了拖拽模拟和磁性吸附,当可视区域内存在多个可拖拽元素,就出现碰撞检测的问题,这也是javascript动画的一个经典问题.本篇将详细介绍碰撞检测 原理介绍 碰撞检测的方法有很多, ...
- Sublime Text 3中文乱码解决方法以及安装包管理器方法
一般出现乱码是因为文本采用了GBK编码格式,Sublime Text默认不支持GBK编码. 安装包管理器 简单安装 使用Ctrl+`快捷键或者通过View->Show Console菜单打开命令 ...
- Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
Jquery Mobiscroll是一个用于触摸设备(Android phones, iPhone, iPad, Galaxy Tab)的日期和时间选择器jQuery插件.以及各种滑动插件 可以让用户 ...
- Linux主机上使用交叉编译移植u-boot到树莓派
0环境 Linux主机OS:Ubuntu14.04 64位,运行在wmware workstation 10虚拟机 树莓派版本:raspberry pi 2 B型. 树莓派OS: Debian Jes ...
- “RazorEngine.Templating.TemplateParsingException”类型的异常在 RazorEngine.NET4.0.dll 中发生,但未在用户代码中进行处理 其他信息: Expected model identifier.
这个问题是由于在cshtml中 引用了model这个单词 它可能和Model在解析时有冲突. 解决方法:把model换成别的单词就可以了.
- 高德地图api实现地址和经纬度的转换(python)
利用高德地图web服务api实现地理/逆地址编码 api使用具体方法请查看官方文档 文档网址:http://lbs.amap.com/api/webservice/guide/api/georegeo ...
- 茂名石化BPM应用实践 ——业务协同及服务共享平台建设和应用
一.茂名石化简介 茂名石化隶属于中国石油化工集团公司,创建于1955年,是国家"一五"期间156项重点项目之一.经过50多年的发展,茂名石化已成为我国生产规模最大的炼油化工企业之一 ...
- 清除打印机队列中无法清除的任务 & 清空打印池
故障现象典型表现为以下两种情况 1.当打印任务开始进行时,这些打印任务便被保存在打印作业列表(也称打印队列)内.如果打印机因意外暂停(如打印机未连接)而未完成打印任务,则该打印任务将列入打印队列,并且 ...
- 【说解】在shell中通过mkfifo创建命名管道来控制多个进程并发执行
背景: 工作中有两个异地机房需要传数据,数据全名很规范,在某个目录下命名为统一的前缀加上编号.如/path/from/file.{1..100}.而机房间的专线对单个scp进程的传输速度是有限制的,比 ...