1. 介绍与开始

1.1. 简介

金色数据是面向市场提供集数据采集与数据融合的平台。

金色数据除了像上一代产品可以采集各种数据之外,还提供了新一代采集数据功能:1)不仅将独立的数据采集下来、还能将数据关联关系一并采下来,2)还能将采集的数据可追踪、可反复采集,而不担心重复数据的产生。

金色数据,还提供了数据融合功能。数据融合功能,可将数据以及数据之间的关联关系,直接拉入数据库应用表。

我们抓取数据的目的是应用,金色数据依据上述两大特色,可直接将网络上的数据,实时同步到你的数据库应用表中,也就是即抓即用。

1.2. 下载

当前软件版本:3.2.1

下载地址: 3.2.1 最新版

1.3. 运行环境

本软件需要JRE1.8及以上运行环境,JRE软件可以从 Java官网 下载。

本软件基于Java语言,所以可运行在Windows、Linux、Mac等操作系统上。

目前金色数据的数据库是基于MySQL数据库,所以你还需要准备一台可连接的MySQL数据库。如果你还没有,那么可到MySQL官网下载 : MySQL官网

具体Java以及MySQL下载和安装,可以看咐录。

1.4. 安装

下载金色数据软件后,可通过解压文件查看到软件文件。文件目录大致如下:

bin/        //脚本目录
   gen_spider.bat          //生成抓虫脚本
   gen_spider.sh
   goldadmin_passwd.bat   //重置管理员密码脚本
   goldadmin_passwd.sh
   setclasspath.bat
   setclasspath.sh
   setenv.bat
   setup.bat            //安装脚本
   setup.sh
conf/               //脚本安装后会将配制生成到这里
libs/
    templates/
    app.war
    install-guide.jar
    solr_data.zip
solr/
README.txt    //说明文件

因为金色数据可以运行在各操作系统上,以下分Windows下安装以及Linux下安装两小节细述,读者可以选择其一查看。

1.4.1. Windows 下安装

首先进入bin目录,双击运行setup.bat文件,启动安装程序,可以看到安装画面如下:

setup.bat

首先,选择安装语言,默认中文,按回车键就可以进行下一项:

接下来,则需要你配制GoldData数据库连接,如下图所示:

setup_step1
该数据库名必须已经创建,比如上图的数据库必须先被创建,才能测试连接成功)

再接下来,需要配制融合目标数据库连接。如果在“对于数据融合目标数据库,是否使用同样的数据库(n-否,y-是,默认:是)?”中选择“y”那么将使用之前相同的数据库。如果选择“n”,则将进行配制各连接项,如下图所示:

setup_step1

再接下来,我们需要配制solr安装目录以及所使用的端口号,一般默认就行。

然后需要输入金色数据管理平台的端口号以及超级管理员登录密码,一般默认就行。如下图所示:

setup_step2
如果金色数据要架设在公网访问时,请配制HTTPS方式访问,并确保密码要有足够的复杂度,以保证网络安全。

到这一步之后,程序将开始检查数据库中有没有以下划线开头的数据库表,如果有冲突则会提示,如果没有则将表写入到数据库当中。

setup_step3

除此之外,还会生成脚本文件到bin目录下,如下

setup_result

至此金色数据安装程序已经结束。

1.4.2. Linux 下安装

首先你需要解压软件到本地:

$ unzip golddata-{version}.zip -d golddata-{version}

然后,进入程序主目录,给脚本赋予可执行权限 ,并运行安装程序:

$ cd golddata-{version}
$ chmod u+x ./bin/*
$ ./bin/setup.sh

依据上述运行后,将启动安装画面。如下图所示:

setup.sh

当安装界面提示你所使用的语言时,请选择1,然后回车继续,此时安装界面应当将出现中文。当如果发现有乱码,你可选择2英语进行交互,或者调整你的linux客户端的语言编码显示。

接下来,则需要你配制GoldData数据库连接,如下图所示:

setup_step1
该数据库名必须已经创建,比如上图的数据库必须先被创建,才能测试连接成功)

再接下来,需要配制融合目标数据库连接。如果在“对于数据融合目标数据库,是否使用同样的数据库(n-否,y-是,默认:是)?”中选择“y”那么将使用之前相同的数据库。如果选择“n”,则将进行配制各连接项,如下图所示:

setup_step1

再接下来,我们需要配制solr安装目录以及所使用的端口号,一般默认就行。

然后需要输入金色数据管理平台的端口号以及超级管理员登录密码,一般默认就行。如下图所示:

setup_step2
如果金色数据要架设在公网访问时,请配制HTTPS方式访问,并确保密码要有中够的复杂度,以保证网络安全。

到这一步之后,程序将开始检查数据库中有没有以下划线开头的数据库表,如果有冲突则会提示,如果没有则将表写入到数据库当中。

setup_step3

除此之外,还会生成脚本文件到bin目录下,如下

setup_result

至此金色数据安装程序已经结束。

1.5. 升级

在启动bin/setup.bat或者bin/setup.sh时,将会检测当前机器有没有安装老版本的金色数据。如果你的机器已经装有老版本的金色数据,则会提示你是否会升级。如下图所示:

upgrade_1

当选择升级时,程序则开始备份老的金色数据文件打包放到/tmp目录下。然后将当前最新程序放置于老的目录上。然后再将数据库变动也写入数据库当中。

当最后显示“安装成功!按Enter键将退出安装程序!”,则表明升级成功。进入之前金色数据安装目录下,启动程序将发现程序已经升级成功了。

1.6. 启动金色数据平台

1.6.1. Windows 下启动

在Windows下,直接双击bin下startup.bat文件,就可启动金色数据平台。如下图所示:

startup

当看到窗口出现“Grails application runing at http://localhost:7979”时,说明已经启动成功!那么然后可以打开浏览器进行访问。如下图所示:

login

1.6.2. Linux 下启动

在Linux下,需要再次赋予可执行权限,然后执行./bin/startup.sh以启动金色数据平台。

$ chmod u+x ./bin/*
$ ./bin/startup.sh

当看到窗口出现“Grails application runing at http://localhost:7979”时,说明已经启动成功!那么然后可以打开浏览器进行访问。如下图所示:

login

1.6.3. 登录

输入超级管理员帐号"admin",以及安装时所设置的密码,以及验证码进行登录。如果前述输入正确,则进入主页。如下图所示:

main
如果登录时,勾选了“自动登录”选项,则下次打开地址时,将不用再进行登录,会自动进入主页。这个功能请不要再公共机器上使用。

1.6.4. 退出登录

主界面右上角,点击您的用户名,将弹出菜单,里面有个"Logout"按扭。点击它后,将会退出登录!如下图所示:

logout

1.7. 抓取器客户端

在此小节,我们将介绍抓取器客户端。一个是生成抓取器客户端,一个是部署抓取器客户端。

1.7.1. 生成抓取器客户端

首先,我们进入程序主目录,并赋予bin/目录下所有文件为可执行程序权限,然后运行./bin/gen_spider.sh。如下:

$ cd golddata-{version}
$ chmod u+x ./bin/*
$ ./bin/gen_spider.sh
如果在Windows系统下,则只需运行gen_spider.bat文件即可启动生成抓取器程序。

依据上述运行后,将启动安装画面。如下图所示:

gen_spider1

当提示你所使用的语言时,请选择1,然后回车继续,此时安装界面应当将出现中文。当如果发现有乱码,你可选择2英语进行交互,或者调整你的linux客户端的语言编码显示。

接下来将会询问是否重用之前的数据库连接,如果不使用,将会重新让你输入数据库连接信息。

当数据库连接信息配制好后,则会询问抓取器客户端实例数量,默认为1,这里填写数量即可。

接着需要输入抓取器客户端实例通用名称,以及实例端口号、以及生成路径。如下图所示:

gen_spider2

如果生成的实例数量大于1时,还将询问端口号是否使用一样,还是递增。如下图所示:

gen_spider3

接着,将会看到生成结果。如下图所示:

gen_spider4

当最后显示“生成成功!按Enter键将退出安装程序!”,则表明生成成功。

1.7.2. 部署抓取器客户端

生成抓取器客户端 之后,接下来我们就可以部署抓取器客户端了。

首先进入生成路径之下,我们先进行打包,以下以linux下为例,打包成tar.gz格式:

$ tar -czf spider_kitty_1.tar.gz *

然后将打包文件放置于目标机器中解压。

$ tar -xzf spider_kitty_1.tar.gz

接下来,我们给bin目录下文件添加可执行权限,以及运行./bin/启动抓取器程序。

$ chmod a+x bin/*
$ ./bin/startup.sh

此时,我们将可以在命令行下可看到程序输出,类似如下画面,则表示启动成功!

gen_spider5
对于抓取数据内容以及动作如开始,停止等,则由金色数据后台集中控制。

1.8. 许可证

金色数据采集功能,可以不用购买许可证免费使用。但是需要用到数据融合时,你则需要购买许可证。 许可证可以到官网 https://golddata.100shouhou.com 上购买。

当你已经购买了许可证时,请到主界面注册许可证。

有关许可证的操作,都需要你使用超级管理员帐号"admin"才能操作。

1.8.1. 注册许可证

主界面右上角,选择“帮助”,将弹出菜单。

license_1

选择其中的“注册”,将弹出注册许可证对话框。如下图所示:

license_2

请将客服人员给你的代码,以及密钥,然后点击“Ok”进行注册。如果代码以及密钥输入正确,那么将提示注册成功!底部状态栏许可证提示将消失。

1.8.2. 注销许可证

当你想在另外一台机器上安装金色数据,并且想将许可证转移过去,那么你可能需要从当前机器上注销该许可证,特别是你购买的许可证只允许一台机器使用的情况下。注销许可证很简单。

主界面右上角,选择“帮助”,将弹出菜单。

license_1

选择“注销本机许可证”,将会弹出“确认注销许可证”提示。选择“Ok”即会注销。

license_3

1.9. 学习建议

数据采集与融合本是还是一些比较专业的事情,市面一些产品宣称可视化采集,但用起来你会感觉很鸡肋,那些可视化往往难解决实际当中的问题,所以通常你还是需要学习其规则然后才能使用。也因为如此,我们干脆放弃那种“可视化”采集,以及基于XPATH,或者无头浏览器技术方案。简而采用CSS择选器以及JavaScript语言脚本规则,以及可视化辅助工具来帮助你编写规则,一方面让那些已经对CSS以及JavaScript有所了解的人们可以上手即用,另一方面又能快速深入解决实际应用需求。

你可以跟着本文档以及提供的视频学习,可以初步了解采集与融合这些功能。但为了让金色数据能够更好的帮助你实际的工作内容,我们这里给出一些建议。我们需要你准备一些这方面的基础:HTML标签,以及CSS相关选择器,JavaScript基础,正则表达式。

以下给出一些学习链接:

html:

CSS:

JavaScript:

2. 采集管理

在本章中,将就数据采集功能进行介绍。这里会涉及到网站管理,数据集管理,规则管理,抓取器管理,数据管理,网页管理。

2.1. 网站管理

网站管理,主要对需要做采集的网站,做个统一管理,同时对采集器客户端(也即爬虫)抓取此网站时统一设置HTTP信息头。

点击左边菜单,查看“采集管理-→网站管理”,将可以打开网站管理子页面,如下图所示:

website1

2.1.1. 添加网站

添加网站,需要填入名称,地址(也即网址)信息,而附注是可选填。

2.1.2. 修改网站

修改网站,请输入需要修改的名称,地址(也即网址)信息,而附注是可选填。

2.1.3. 删除网站

删除网站,将提示是否删除,如果同意,则删除该条目,否则反之。

2.1.4. 采集信息头设置

可以在此设定这个网站,所使用的HTTP信息头。HTTP信息头,以名称与值两个相对应的内容。有时我们采集的网站需要登录,你则需要填入cookie名称,以及相对值。常用的HTTP信息头如下:

名称 说明

User-Agent

客户端信息,可以用来模拟浏览器、以及移动客户端信息

Cookie

一般是记录用户标识,一般可以用于存取目标网站用户登录信息

Accept

可以接受内容类型,一般默认为 */* 就好

Accept-Encoding

接收内容编码信息,可以写比如 gzip,deflate,br

Accept-Language

接收内容语言信息,一般可以写为 zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7

httpheader

2.1.5. 设置半自动登录

对于一些网站的内容需要登录才能采集其数据时,之前可以将拿到登录后的Cookie信息直接放到采集信息头去采集。自版本2.3.1 后开始支持半自动登录。半自动登录功能是通过编写登录脚本,以及检查登录脚本等来控制登录流程。

如果未登录,系统将会进行登录操作,这时如需要输入验证码等内容时,可以人工干预,比如回复邮件或者在后台录入,然后继续运行登录脚本直至或取了登录令牌(如Cookie)。如果使用了图片这样的识别接口,这整个登录将是自动的。

点击相应站点的“设置半自动登录”,进入到设置半自动登录页面,如下图所示:

websitelogin1

输入项

说明

检查登录

是否运行半自动登录和检查登录

登录脚本

该脚本用于执行站点登录操作,具体见 半自动登录_登录脚本变量

检查登录

该脚本将会在下载页面后运行,具体见 半自动登录_检查脚本变量

登录间隔

设置运行登录脚本的最小间隔,默认单位为秒

邮件通知

设置登录需要输入的通知邮箱,多个邮箱名请以英文逗号相隔

要想得到邮件通知和接收邮件回复,还需要设置smtp与imap服务器及帐号的设置,且都只支持SSL方式。请到“系统管理》系统设置”,找到相应属性去设置。属性说明如下图表所示:

属性名 说明

smtp.host

邮件smtp主机,如`smtp.office365.com

smtp.port

邮件smtp端口号,默认是587

smtp.user

邮件smtp用户名

smtp.pass

邮件smtp密码

imap.host

邮件imap主机,如:outlook.office365.com

imap.port

邮件imap端口号,默认是993

imap.user

邮件imap用户名

imap.pass

邮件imap密码

2.1.6. 站点变量管理

站点变量主要提供抓取脚本使用。站点变量值可以是加密和非加密类型,所以站点变量设计的目的是为了储存帐号密码信息,以供脚本使用。在抓取脚本里可以统一通过 vars 变量来获取 。

2.2. 数据集管理

数据集,主要将一系列字段,比如商品名称、价格、厂家这些数据项的一个组合,称之为数据集。一条数据集是可以单一页面上的数据项采集而来,也可以是跨多个页面的数据项采集而来。

点击左边菜单,查看“采集管理-→数据集管理”,将可以打开数据集管理子页面,如下图所示:

dataset

2.2.1. 添加数据集

dataset_add

添加数据集,需要填入名称,标签(标签,最好是字母相关,拼音或者英文都可)。

融合方式

融合方式有三种:

方式 说明

非自动融合

采集下来的数据将不自动进行融合作业,需要自行开启融合

按抓取数量开始融合

这个将以 抓取数量 里的数值为准,如果抓取到N条,将进行融合操作

抓取完毕再融

当数据源的数据抓取完毕后,才开始进行融合作业

融合重置

融合重置是指融合索引从什么位置开始融合。这里给出三种方式:从当前位置融合(融合继续)还是从头开始融合(融合重新开始),或者还是定位重置到前置时间内融合数据的起始位置(融合重新前置时间)。

当选为“融合重新前置时间”,则会出现前置时间(单位:分钟)字段,请输入合法值就可。

2.2.2. 修改数据集

修改数据集,请输入需要修改的名称、标签、融合方式以及融合重置字段。

2.2.3. 删除数据集

删除数据集,将提示是否删除,如果同意,则删除该条目,否则反之。

2.3. 抓取器管理

这里将部署的抓取器列表进行管理。在此可以集中控制各个抓取器动作,比如“开始”、“停止”、“设置抓取站点”、“设置定时”,“重置站点”等。

点击左边菜单,查看“采集管理-→抓取器管理”,将可以打开抓取器管理子页面,如下图所示:

spiders

对于抓取器操作之前,请将相应的抓取器客户端启动,对于生成和部署抓取器客户端请看 这里

2.3.1. 开始抓取

点击“开始”,抓取器将会进入运行状态。此时,如果该抓取器已经启动,那么将会进行实际抓取;如果该抓取器还没有启动,那么请启动该抓取器执行抓取。

2.3.2. 停止抓取

点击“停止”,抓取器将会进入停止状态。如果当抓取完成时,则进入抓取完成状态。

2.3.3. 设置抓取站点

当点击“设置抓取站点”前,请先确保该抓取器客户端状态处于停止或者完成状态。当选择抓取站点时,可以同时选择多个抓取站点。如下图所示:

spiders

当设置多个抓取站点时,则依次进行站点数据抓取,也就是抓取完毕一个站点数据,则进入下一个站点数据抓取。

2.3.4. 设置定时

当点击“设置定时”时,将可以进行定时抓取。如下图所示:

spiders

对于CRON表达式,是一个非常简明的语法,用来设定何时启动抓取,其语法详见 定时调度规则 .

抓取行为,默认有两项:“从头开始”,是指重新抓取,会将过去的抓取地址删除,以便重新抓取;而对于“继续”则是指从当前位置开始继续抓取。

2.3.5. 重置站点

当点击“重置站点”时,将会提示是否确认重置抓取站点。如果重置抓取站点,将会重新开始抓取。

2.3.6. 设置其它

当点击“设置其它”时,将会弹出对话框。在该对话框里,“最大深度”,表示抓取网页深度,如果是-1 则表示无穷尽。

2.3.7. 删除抓取器

当点击“删除”时,将会提示是否删除。如果选择删除,则会删除该抓取器记录。

2.4. 规则管理

为了简化配制规则,在金色数据平台里,抓取规则和数据抽取、变换规则都是融为一体的。这些规则指明了数据将如何抓取和抽取出来。

点击左边菜单,查看“采集管理-→规则管理”,将可以打开规则管理子页面,如下图所示:

rule

在3.0.0版本之后,规则还分为两种引擎:快速精准引擎和仿真驱动引擎。快速模式只支持web,通过规则循环迭代采集想要的网页链接以及内容,不用额外访问不需要的内容。而仿真模式则除了支持web,还支持手机app数据采集。仿真模式是通过Gold脚本框架来操纵浏览器以及手机模拟器或者真机来实现数据采集的。 详细内容请见:GoldData [仿真采集脚本框架]

2.4.1. 添加规则

添加规则时,需要填写以下字段。

  1. 名称

    规则名称,该名称需要唯一。

  2. 网站名称

    选择所属抓取网站名称。

  3. 入口地址

    抓取网站入口起始地址。如果有多个地址,请以英文逗号相隔。

  4. 规则内容

    规则具体内容,此规则内容包括抓取规则和抽取数据规则。为便于书写规则,此规则内容采用 Hjson格式。对于规则具体内容,将会在 可视化编辑规则 介绍。

2.4.2. 修改规则

点击修改,将可以进入修改规则。对于规则具体内容,将会在 可视化编辑规则 介绍。

2.4.3. 删除规则

点删除,将会询问是否删除该规则,如果选择删除,则会删除该规则。当然删除规则请注意是否影响现有正工作的抓取器客户端,以及数据完整,否则将出现意想不到的结果。

2.5. 网页管理

网页管理,是指一系列抓取器客户端,通过规则获取一系列的抓取网页地址列表。在这里面可以进行相应的删除并重新抓取。

2.6. 数据管理

数据管理,是指一系列抓取器客户端,通过规则抓取网页,并根据规则获取到的目标数据,进行列表展示。在此处,你可以分数据集来查询数据列表内容。

2.6.1. 导出数据

还可以导出数据内容,如果数据条目数过多,还将会压缩打包下载。导出时,可以选择对哪些字段进行导出,不同的数据集,将会有不同的字段提供选择。如下图所示:

data1

选择之后,点击“0k”,将会查询并下载。如果数据条目内容少,将直接下载为excel数据表格文件。打开该数据表格文件,将有如类似下图所示:

data2

如果数据条目内容过多,还将会自动压缩打包下载。

2.7. 可视化编辑规则

为了方便讲解可视化编辑规则,在此我们以抓取slate.com新闻为例。

首先我们点击可视化编辑器的“+”号按扭,将会出现如下所示内容:

rule

(1) 添加规则条目,可以添加多个

(2) 填写测试样例URL地址

(3) 展开/合并规则条目内容

(4) 测试该规则条目抓取

(5) 删除当前规则条目

我们在(2)处填写 "https://slate.com/culture", 然后点击(3)展开条目内容。如下图所示:

rule

(6) 添加URL匹配,可以添加多个。

(7) 填写匹配URL,此处需使用正则表达式,如果表达式正确且匹配,则会变绿色。关于正则表达式,可以查看 此处

(8) 删除当前匹配

(9) 添加字段集,可以添加多个字段集。

当URL匹配填写好后,接下来点击(9)添加字段集。如下图所示:

rule

(10) 展开/合并字段集

(11) 删除当前字段集

(12) 选择当前字段集是否是数据集,如果选择否,则表明当前抓取结果是一系列链接,则后面配制字段时,则必须要有href名称的字段。如果选择是,则表明当前抓取结果是数据集,则必须要有名称为sn的字段。

(13) 节点选择类型。如果当前内容是HTML文档,则应选择HTML,否则选择非HTML。对于HTML,无需在(14)处编写JavaScript,而对于非HTML,则需要在(14)处编写JavaScript。

(14) 节点内容。对于HTML而言,需要指明抓取数据的开始节点。而对于非HTML,需要编写JavaScript,将数据自行填充到字段中。

在此处,我们需要抓取https://slate.com/culture下的“Recently in Culture”栏目下的链接。如下图所示:

rule

我们可以分析得到节点内容配制如下:

[data-via="recirc_recent"] > a

然后对于非数据集式字段集时,则需要添加名称为href的字段,我们点击下边的“+”即(15)处, 则会出现添加字段对话框。如下图所示:

rule

黄色序号说明:

(1) 填写字段名称

(2) 填写字段显示名称

(3) 填写CSS3选择表达式用来选择节点,具体用法 见此。如果不是html则无需填写此字段

(4) 填写所选元素的属性,如果是选择元素的内容,则属性内容可保留为空白。对于链接属性来说时,如果需要绝对URL地址时,可以加上前缀“abs:”。

(5) 如果通过(3)和(4)还不能处理目标数据,则可以使用JavaScript来处理字段最终想要的值。

(6) 类型是可选的,表明该字段的类型。比如标明该字段是图片时,则会在“数据管理-→数据列表”显示该数据集时,显示该字段,将以图片的方式来显示。

(7) 是否列表显示。如果选择是,则会在“数据管理-→数据列表”显示该数据集时,显示该字段。

(8) 是否文件存储。一般选择为否即可。当选择为是时,将会把该字段内容当作为链接,并下载该链接内容,并存储起来。

然后在此添加了href字段,如下图所示:

rule

(16) 重新编辑该字段

(17) 删除该字段。

最后,我们可以测试当前配制是否正确,我们点击(4)处进行样例测试。此时,将会弹出测试结果,如下图所示:

rule

在以上,我们看到了非数据集规则编辑。接下来,我们讲解数据集规则编辑。我们将会使用culturenews数据集,添加编号、标题、图片、链接等字段

点击(9)处,我们可以在规则1处添加字段集1,此时我们选择是数据集,并选择相对应的数据集是culturenews,当然此数据集需要提前创建。如下图所示:

rule

然后再点击(4)处进行样例测试。则会得到类似如下结果:

rule

2.7.1. "fake:"协议地址

我们可以在URL地址加上前缀"fake:",则金色数据自身不会发送HTTP请求,而是由你来决定发送。一般这么做是由于金色数据自身默认是发送GET请求,而你需要其它类型的请求或者是需要其它内容的的地址,需要用户自己发送ajax请求(通过`$ajax`或`$ajax2` 函数)。

2.7.2. 文件上传配制

在上例中,我们的图片,是一个URL地址,我们需要下载该URL地址的内容,即文件内容,放到自己的存储介质当中。那么我们需要进行文件上传配制。

在上例中,我们需要将图片存到本地路径下,则重新编辑图片字段。然后在“是否文件存储”处选择是,然后选择文件存储配制选择S1,访问地址Js保留为空。如下图所示:

rule
你需要提前进行文件上传配制。请见 “系统管理”>"文件存储配制管理"。

2.8. 源码编辑规则

有些特别情况下,源码编辑效率可能更好。我们可以根据前述配制,然后切换源码标签页下,则得到如下内容:

[
  {
    //样例
    __sample: https://slate.com/culture
    //URL匹配
    match0: https\:\/\/slate.com\/culture
    //字段集0
    fields0:
    {
      //节点内容
      __node: '''[data-via="recirc_recent"] > a'''
      //字段href
      href:
      {
        //表达式
        expr: a
        //属性
        attr: abs:href
        //JavaScript
        js: ""
        //字段显示名称
        __label: 链接
        //是否列表显示
        __showOnList: false
        //类型
        __type: ""
        //是否下载
        down: "0"
        //访问地址Js
        accessPathJs: ""
        //上传文件配制
        uploadConf: s1
      }
    }
    fields1:
    {
      __model: true
      __dataset: culturenews
      __node: '''[data-via="recirc_recent"] > a'''
      sn:
      {
        expr: a
        attr: abs:href
        js: md5(source)
        __label: 编号
        __showOnList: true
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
      img:
      {
        expr: img
        attr: data-normal
        js: ""
        __label: 图片
        __showOnList: true
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
      title:
      {
        expr: .topic-story__hed
        attr: ""
        js: ""
        __label: 标题
        __showOnList: true
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
    }
  }
]

2.9. 本章总结

在此章中,我们先后讲解了网站管理、数据集管理、抓取器管理、规则管理、网页管理、数据管理及导出、以及可视化编辑规则。通过这些章节的了解,你将可以很好进行网页数据抓取以及导出。

接下来我们讲解数据融合,这也是金色数据平台最具有价值的数据交换/同步功能。

3. 融合管理

融合管理是金色数据最强大的功能之一,可以将抓取到的数据集,通过映射,可以将任何数据融合到已存在的数据库应用表当中。

3.1. 编辑映射

融合映射,是指数据集到数据应用表之间建立映射关系。

在映射列表页面里,我们选择相应的数据集,以及希望数据融合到目标数据表。然后点击“添加”按扭,将提示是否添加为映射关系。如果确认继续,将会创建映射关系。当如果失败,将会提示失败信息。如下图所示:

map1

创建之后,然后需要点击“编辑映射”链接,进入编辑映射页面。

map2

(1) 可以选择融合方式,手动还是自动。如果是手动,则意味着人工去一条条的融合。而自动则是机器根据规则一条条的自动融合。

(2) 关联数据方式,则表示数据集中的一条数据如何关联到数据表中的一条记录。在这里提供了三种方式:一、关联字段,二、搜索solr索引,三、不关联,数据追加。

第一种方式,则是根据关联表中的字段,一般是ID字段,对应到数据集的字段,比如一般sn字段。

第二种方式,则需要在solr服务中先对相关数据库表进行索引,然后依据搜索字段以及相应的相似度权重计算相似度,以及融合阀值来进行数据融合。

第三种方式,则直接将数据集当中的数据以追加的方式融合到数库表当中。

(3) 融合阀值,该值范围在0-1.0之间,只有当相似度高于或者等于该值时才融合数据。该内容,只有当关联数据方式为 搜索solr索引时 才有效。

(4) 融合并发数量,是指融合方式在自动融合情况下,融合并发数量,也即融合线程数量,一般情况是该值越大,融合速度越快。

这四项修改之后,应该点击“保存”按扭,则将会将相应配制保存起来。

(5) 编辑融合脚本,主要用于当前数据集记录是否应该融合。点击编辑融合脚本,将会弹出对话框。如下图所示:

map3

其中融合之前脚本,用于编辑决定当前数据集是否参与融合,脚本返回内容必须是true或者false。如果脚本内容为空,则默认为true,表示当前数据集参与融合。而融合之后脚本,则用于决定是否当前融合结果参与写进表,脚本返回内容必须是true或者false。如果脚本内容为空,则默认为true,表示融合数据写入到表。

(6) 编辑字段映射,编辑数据表字段,与之来自对应的数据集中的字段或者数据。点击之后,弹出对话框如下所示:

map4

黄色序号释义如下:

(1) 当前编辑的表字段,该文本框不可修改。

(2) 融合是否必须,是指当该表字段获取后的值,如果是空或者null时,是否参与融合。如果是必须,但该例融合值为空或者null时,则数据集这条记录将跳过融合。

(3) 相似度权重,是指有当关联数据方式为搜索solr索引时才有效。当在solr索引中搜索数据时,会计算该表的字段值以及当前数据集中该字段值的相似度,并乘以相似度权重,以及所有其它字段相似值之和。如果大于融合阀值时,则数据表相应记录与当前数据集记录才会进入到融合流程。

(4) 对应方式,这里提供5种:一、数据集字段;二、JavaScript;三、搜索匹配;四、SN关联表ID;五、数据表

其中第一种数据集字段,是指直接对应数据集字段,在(5)处数据集字段内容中直接填写数据集字段名称即可。

第二种JavaScript,则是指通过JavaScript返回值来作为该当前字段融合值。需要在(5)处数据集字段内容中填写相关内容。比如像创建日期,可以用"formatDate(new JDate(),'yyyy-MM-dd HH:mm:ss')"即可。

第三种搜索匹配,则是通过搜索solr索引,找出相关值作为当前字段融合值。需要在(5)处数据集字段内容中填写相关内容。

第四种 SN关联表ID,则是指通过已有的关联找出相关值作为当前字段融合值。需要在(5)处数据集字段内容中填写相关内容。

第五种数据表,则是指通过其它数据表找出相关值作为当前字段融合值。需要在(5)处数据集字段内容中填写相关内容。

(6)是否文件存储,如果当前字段融合值是文件URL绝对地址,如果需要下载其内容当作文件并存储到自己所拥有的存储介质当中时,请选择是。如果选择否,则什么也不做。

你需要提前进行文件上传配制。请见 “系统管理”>"文件存储配制管理"。

3.2. 编辑融合搜索

编辑融合搜索,是指融合方式为搜索solr索引时,将数据集哪些字段数据参与搜索。在操作该内容时,请将solr服务启动,且将想关数据表进行索引。

map5

3.3. 融合作业

点击打开“融合作业”子页面,将看到如下融合操作:开始融合、停止融合、重置融合,手动作业、切换运行模式、设置融合位移、移除异常融合数据。

fuse1

3.3.1. 开始融合

当点击“开始融合”后,融合状态将变为运行中状态。如果 融合运行到完成时,则会进入完成状态。

3.3.2. 停止融合

当点击“停止融合”后,融合状态将变为停止状态。

3.3.3. 重置融合

当点击“重置融合”时,将会提示“真的要重置作业吗”。如果点击“OK”时,将会回到开始位置重新融合,也即融合位移会变为0。

3.3.4. 切换运行模式

当点击“切换运行模式”时,将会改变融合模式,比如正常切换为异常,或者异常切换为正常。

3.3.5. 设置融合位移

当点击“设置融合位移”时,将会提示输入融合位移位置。

3.3.6. 移除异常融合数据

当点击“移除异常融合数据”时,将提示“确认要删除吗”。如果确认删除,将会删除异常融合数据。

3.3.7. 手动融合

当点击“手动融合”,将会进入“手动融合”子页面,具体内容请看 手动融合

3.4. 手动融合

当点击“手动融合”之前,应确保当前融合方式手动,而非自动。

fuse2

(1) 刷新,将重新刷新当前该子页面数据。

(2) 使用数据集字段值,则将当前数据集中的字段值全作为融合值。

(3)使用关联值 ,则将当前关联值全作为融合值 。

(4)上一条,将视图移到前一条融合记录

(5)下一条,将数据移到后一条融合记录

(6) 提交且下一条,则将融合值(即合并结果)写入数据库表中,且将融合位移+1。并刷新当前子页面数据。

(7)跳过且下一条,则仅将融合位移+1,并刷新当前子页面数据。

(8)将数据集当前字段值移到合并结果中即(9)处。

(9)合并结果,可以任意编辑其内容。

(10)将当前关联数据值移到合并结果中即(9)处。

3.5. 删除融合

当删除融合时,将提示确认是否删除。如果选择删除注意当前融合工作状态,否则将会出现异常状态。

3.6. 本章总结

本章先后介绍了融合映射及字段映射,以及融合作业等内容。通过此章,你将能够将抓取到的数据融合到数据表当中。

4. 数据表管理

在此,我们将看到数据库应用表,并可以查看应用表数据记录,并且能将数据应用表数据进行索引,并放到solr服务索引服务当中,以备数据融合使用。 如下图所示:

table

4.1. 运行SQL语句

点击“运行SQL语句”,将会弹出运行SQL语句对话框。如下图所示:

table

输入SQL语句之后,然后点击“OK”,将会执行SQL语句。如果执行SQL失败,将会提示错误!

4.2. 查看记录

点击“查看记录”链接,将会打开数据库表记录列表子页面。

4.3. 配制索引

在使用任何索引功能之前,请确保solr服务已经开启。点击“配制索引”链接,将打开配制索引子页面。如下图所示:

table

(1) 添加自关联字段,用于级联关联的融合搜索。

(2) 初始化索引 ,也即将该表的字段在solr服务中创建和配制相应索引,以便搜索融合时使用。

(3) 用于编辑和修改索引选项。比如是否存储,是否索引,以及更改索引类型。

4.3.1. 索引类型

在金色数据当中,索引只分为两类,字符串型或者文本型。字符串型,不会分词,只会整词搜索。而对于文本型,则会分词,可以模糊搜索匹配。

4.3.2. 添加自关联字段

自关联字段,是用于一类级联关联字段的solr融合搜索。该自关联字段,并不会在实际表中添加,而只是存在于solr索引表中。

table

(1) 字段名称,自定义。 (2) 父字段,当前表的关联父记录的字段 (3) 对应字段,名称字段,或者说明字段。 (4) 索引类型,字符串型,不会分词,只会整词搜索。而对于文本型,则会分词,可以模糊搜索匹配。 (5) 索引,只有索引后,该字段才能用于搜索。 (6) 存储,只有存储后,才能将该字段值完整取出。

对于自关联字段,索引类型应当为文本型,而且应当索引,而对于存储可以根据需要设置。

4.3.3. 初始化索引

当点击“初始化索引”按扭后,将会向solr服务配制该表相对应的字段索引。至此,就可以开始用于融合搜索。

4.4. 开始索引

当点击“开始索引”后,金色数据将会将数据表中的记录写入solr索引当中。

只有当表已经初始化索引后,才能使用“开始索引”功能。

4.5. 停止索引

当点击“停止索引”后,将会停止向solr服务写入索引 。

4.6. 删除索引

当点击“删除索引”后,将会从solr服务中删除该表字段对应的索引。

4.7. 本章总结

本章 先后介绍了数据库表的使用和查看,以及如何创建solr索引为融合搜索所用。

5. 应用管理

金色数据平台提供了API访问抓取的数据。该API借鉴了OAUTh2.0 规范,实现一套API授权机制.API的使用方法和接口说明可以在http://<金色数据管理平台地址>/open 查看。如下图所示:

app
API的使用方法和接口说明地址,与你安装部署金色数据管理平台相关,是你访问管理平台的地址。

在此,我们需要对API访问的客户端需要先分配相应的AppId和AppKey,这样客户端才能访问API。在金色数据管理平台上,我们可以添加多个应用,这样就可以在不同的客户端实时应用金色数据所抓取的数据。

app

5.1. 添加应用

点击“添加”按扭,将会打开添加应用对话框。该对话框,需要你输入应用名称。然后点击"OK",将会生成新应用。如果操作失败,则提示错误。如下图所示

app

每个产生的应用都会有AppId 以及AppKey。 生成之后,应当将该应用的AppId以及AppKey给到相应的客户端。

5.2. 修改应用

点击“修改”链接,将会弹出编辑应用对话框。在这里你将可以修改应用名称。如下图所示:

app

5.3. 更新AppKey

点击“更新AppKey”链接,将会弹出确认对话框。如果点击“OK”,将会出现新的AppKey。如下图所示:

app

5.4. 删除应用

点击“删除”链接,将会弹出确认对话框。如果点击“OK”,将会删除当前应用。如下图所示:

app

5.5. 本章总结

本章先后介绍了API,以及应用创建等内容。通过本章以及接口文档,你将可以在其它系统通过API来访问金色数据平台所抓取的数据。

6. 系统管理

系统管理里面,包括系统设置,以及个人管理,还有文件存储配制管理。

6.1. 系统设置

在系统设置里,你可以设置各个参数,来调整系统运行的行为。如下图所示:

sys
设置项说明
  1. console.proxy

    设置系统默认代理。

  2. heroku.enable

    表示激活heroku上的容器,只有当你将抓取客户端部署到heroku上才有效。

  3. stopOnUrlError

    URL错误停止抓取器,为-1时为不停止,默认值 为-1。

  4. stopOnEmpty

    抓取数据为空时n次停止抓取器,为-1时则不停止,默认值 为-1。

  5. sampleOnEmpty

    抓取数据为空时n次采样,为-1时,则不采样,默认值 为-1。

6.2. 个人管理

在个人管理子页面,将可以修改个人昵称,以及密码。如下图所示:

sys

6.2.1. 修改密码

点击“修改密码”,将会进入修改密码子页面。如下图所示:

sys

如果修改密码,你将要填入当前登录所使用的密码,以及你需要设置的新密码。点击“确定”后,如果提示失败,请检查原因再进行修改。

6.3. 文件存储配制管理

文件存储配制管理,是用于配制存储抓取的图片视频等文件资源。在金色数据里,文件存储支持LOCAL(本地),或者FTP、SFTP、WEBDAV,你可以依据需要灵活选择。

sys

6.3.1. 添加文件存储配制

点击“添加”按扭,将进入添加文件存储配制子页面。如下图所示:

sys

在金色数据里,支持四种文件存储传输协议:LOCAL(本地)、FTP、SFTP、WEBDAV。

sys

(1) 配制名称,需唯一。

(2) 协议选择

(3) 保存基础路径。文件的存储路径=基础路径+文件路径

(4) 访问基础地址,可以为空。文件访问地址=访问基础地址+文件路径

LOCAL(本地)

这种方式,就是存储文件到本地。这种方式快捷和简单,只有上面的基础配制项。

FTP

这种方式,就是存储文件到FTP服务器。

其中配制项如下:

sys

(1) 主机地址,即FTP服务器IP地址。

(2) 端口号,FTP服务器端口号,一般默认21。

(3) 用户名,FTP帐号用户名。

(4) 密码, FTP帐号密码。

(5) FTP传输数据模式。默认应该选择被动模式,这样可以避免数据被阻塞。

SFTP

SFTP 是SSH 文件传输协议,SSH 是一种加密和安全通信的协议。机器只要开通SSH服务器即可,一般linux系统 都提供支持。

sys

(1) 主机地址,即SSH服务器IP 地址。

(2) 端口号,SSH服务器端口号,一般默认22。

(3) 用户名,SSH帐号用户名。

(4) 密码, SSH帐号密码。

WEBDAV

webdav 是一种基于HTTP(S)的文件传输协议。一般web服务器都提供支持和搭建,比如nginx,tomcat。

sys

(1) URL地址,Webdav服务访问地址。

(2) 用户名, webdav服务帐号用户名。

(3) 密码, webdav服务帐号密码。

6.3.2. 编辑文件存储配制

点击“编辑”链接,可以打开修改文件存储配制子页面。如下图所示:

sys

6.3.3. 删除文件存储配制

点击“删除”链接,则会弹出确认删除对话框。如果点击“OK”,则会删除该条配制。如下图所示:

sys

6.4. 本章总结

在本章,你了解到了系统管理这块可以针对一些系统和个人事项进行设置。还有文件存储配制这样的设置和管理。

7. 权限管理

权限管理,是系统管理员的操作,超级管理员(admin)帐号将对权限管理这个模块永远可见。以供超级管理员用户进行管理。 权限管理将主要是对于管理平台的帐户、菜单,以及特定操作进行权限控制。

7.1. 管理员管理

打开管理员管理子页面,在这里将可以添加、编辑、禁用管理员。如下图所示:

admin

7.1.1. 添加管理员

点击“添加管理员”,将打开添加管理员子页面。如下图所示:

admin

(1) 用户名, 帐号名,需要在系统中唯一。

(2) 真实姓名,可选。

(3) 密码,填写密码,最好8位及8位以上。

(4) 确认密码需与(3)密码项相同。

(5) 用户角色,是多项选择,可以选择多个角色。角色可以添加,请见 添加角色

7.1.2. 编辑管理员

点击“修改”链接,将会打开修改管理员子页面。如下图所示:

admin

7.1.3. 禁用管理员

点击“禁用”链接,将会改变管理员帐号帐态,变为禁用状态。当然可以将禁用状态改回为可用状态。

7.2. 角色管理

打开角色管理子页面,在这里将可以添加、编辑、删除角色和分配菜单/权限。如下图所示:

admin

7.2.1. 添加角色

点击“添加角色”,将打开添加角色子页面。如下图所示:

admin

(1) 角色名称,一般拼音和英文输入即可。角色名称输入之后,不可修改。 (2) 角色显示名称,一般用中文输入即可。

7.2.2. 编辑角色

点击“编辑角色”,将打开编辑角色子页面。如下图所示:

admin

7.2.3. 删除角色

点击“删除”链接,将会弹出确认对话框。如果点击“OK”,将会将该角色进行删除。如果删除失败,将提示失败信息。如下图所示:

admin

7.2.4. 分配菜单和权限

点击“分配菜单和权限”链接,将会打开分配菜单和权限子页面。

admin

选择该角色应该有的菜单和权限,然后点击“确认分配”按扭。将会给该角色赋予菜单和权限。

7.3. 本章总结

在这章,你可以给角色分配菜单和权限,然后再将角色指派给指定的管理员。

8. 仿真采集脚本框架

8.1. 介绍

GoldData仿真采集脚本框架,支持浏览器和移动APP采集,是专为采集而设计的。是集驱动访问、流程控制、选择器、UI交互、代理与MITM、数据集、关键词存储为一体并极力简化代码量的框架。且我们的代理与MITM工具提供拦截http(s),socks协议,可以完成市面99.9%的网站和手机App采集。

第一、我们对代码做了大量的语法糖。比如我们将webdriver以及Appium中的选择器,变成JQuery式的链式调用。如:

//创建IE浏览器驱动
__.IE()
//创建Chrome浏览器驱动
__.chrome()
//创建安卓驱动
__.android('com.example.news','.Activity')
//抽取内容
var ret=$id("article").css("table").html()
//或者
ret=$xpath("//table/tr").css("td.single").html()
//或者
$css("table").css("tr").name("btn").click()

第二、我们创建了采集流程框架。因为使用仿真抓取,我们需要在一次打开的浏览器中,也就是一个会话里采集数据,并且可以接续上一次采集,并且能够随时暂停、停止、并能提供输入介入,如果遇到异常还能退回合理的地方。最重要的是提供了一个层次分明的代码,可以便于阅读、修改和增强脚本。

Gold({
    main:function(){
        __.chrome();
    },
    list:function(){
        var kw=$kw('region')
        var str=null
        while((str=kw.next())){
             //创建浏览器新标签页,并将驱动自动切换到该标签页
            __switch.newWindow('http://www.example.com/page/'+kw)
            var ret=forward('page'))
             if(ret){
                //...
             }
             kw.submit(str)
             //关闭当前标签页
            __switch.close();

        }
    },
    page:function(){
        var item={}
        item.name=$css('#name').text()
        if(!item.name){
            backward('list')
            return;
        }
        item.sn=md5(name)
        $dataset('shop').add(item)
    }
})

第三、我们添加和集成了代理和MITM工具,并且努力让其支持http(s)协议外,还添加了对socks协议支持。让这些协议都可以做到修改请求与响应功能。 这大大增强了采集能力与速度。

//获取代理表里的地址
var proxydb=__proxy.db('cate1')
//创建代理
__proxy.createServer(true,proxydb.last().url).start(0);
//添加拦截器,比如将不需要请求的内容去掉。
__proxy.addFilter(<client2Proxy>,<proxy2Server>,<server2proxy>,<proxy2client>)
//创建启动带有代理的Google Chrome浏览器
__.chrome(__proxy.get())

第四、我们添加了关键词、数据集访问与存储功能,以及waitForInput等等内容,让采集人员可以专注采集业务,而无需关注存储。

//访问关键词
$kw("city").add('New York')
//访问数据集
$dataset('area').add({sn:md5(url),name:'New York'});

第五,我们可以联机测试,边写代码边进行测试,极大提高编写脚本的效率。

第六、还可结合GoldData平台,提供定时调度,分布式采集、以及数据融合功能,将数据与数据关系一步到位采集和融合到你的数据应用表中。

8.2. 入手

可以先看一个简单样例代码,如下:

 Gold({
      //入口函数
      main:function(){
          __.chrome()
          forward('list') //跳转到list函数
       },
       list:function(){
            __.get('http://www.example.com/')
            println("css访问标题:"+$css("h1").html())
            println("xpath访问标题:"+$xpath('//h1').html())
       },
       page:function(){

       }

})

main()是入口函数,上述代码首先会执行main函数。在main函数中创建浏览器,及一些准备工作写在这里。然后通过forward('list'),跳到list函数执行。list函数里让浏览器请求网页,然后通过$css(),和$xpath()来抽取网页内容。

而另外两个函数list()与page(),是用户自定义的.可通过forward(String processName)函数来跳入,也可以通过backward(String processName)函数来回撤到某个采集过程。对于forward与backward函数含义如下:

boolean forward(String processName):用于递进到某个采集过程。返回值为false时,则表明有回撤动作。如果返回为true,则表明此处没有回撒动作。回撤往往是因为这个回撒过程的中间过程是不可逆的,有依赖关系的。比如因为中间页面依赖前一页的会话参数,且无法重复访问。

void backward(String processName):用于回撤到指定的某个采集过程。

8.3. 驱动下载和安装

对于Web网页仿真采集,我们主要集成Webdriver工具。而对于手机APP采集,我们选择了Appium工具。Web网页采集,我们目前提供集成IE浏览器和chrome浏览器。而手机我们选择了提供Android支持。

要想创建运行驱动,首先需要下载相应驱动,并放置于抓取器客户主目录的extras文件夹下。

8.3.1. IE驱动

可以从 https://selenium-release.storage.googleapis.com/index.html 下载。 下载之后解压到extras文件夹里。

然后还需要对系统进行配制设置,才可以正常使用。如下:

1、Windows 7或Windows Vista系统上的IE7及以上浏览哭,你需要设置每个区的保护模式设置为一样。这个设置可以是都开启,或者都是关闭状态。

从浏览器的“工具”菜单上,选择“Internt选项”,弹出对话框。然后选择“安全”选项卡,并分别点击其中的“Internet”,"本地Internet","受信任的站点","受限制的站点",分别将“启用保护模式”的复选框都进行钩选,或者去掉钩选。如下图所示:

IE

2、另外对于IE10及更高版本浏览器,“增强保护模式”必须禁用。这个选项在“Internet属性”对话框里的“高级”选项卡里,如下图所示:

IE

3、浏览器缩放级别必须是100%,否则鼠标事件将不能正确响应。

4、对于Windows 10,你还需要在显示器设置里设置“更改文本、应用等项目的大小”设置为100%

IE

5、对于IE11,你还需要设置一条注册器条目,让驱动可以连接到IE浏览器实例。对于32位系统,这个键位置是`HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE`, 对于64位系统,这个键位置是`HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_BFCACHE`。如果FEATURE_BFCACHE不存在,你则需要创建它。在这个键下,创建一个名为`iexplore.exe`,类型为`DWORD`,值为0。

8.3.2. chrome驱动

chrome驱动,需要根据Google浏览器的版本来选择下载。如果浏览器版本是74.0.3729.131,那么你需要下载版本为74.0.3729的chrome驱动。 版本选择详细请见 这里

可以从 https://chromedriver.storage.googleapis.com/index.html 下载。 下载之后解压到extras文件夹里。

8.3.3. 手机安桌驱动

对于手机安桌驱动,需要分两部分内容下载:一个是android studio,一个是appium。

1、下载安装android studio.

下载之后,可以直接双击安装。具体可以见这里的教程: https://developer.android.com/studio/install?hl=zh-cn

安装好之后,需要设置环境变量。

1)Windows 点击桌面上的“电脑”,右键点击弹出菜单,选择“属性”,弹出系统对话框,选择“高级系统设置”,然后再选择“环境变量” 需要在控制面板上设置ANDROID_HOME,以及PATH环境变量,如下所示:

android
android

2)Linux

需要编辑环境变量ANDROID_HOME以及PATH

export ANDROID_HOME=<Android安装目录>

export PATH=$ANDROIDHOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools:$PATH

2、下载安装appium

在上述之后,、需要使用SDK管理器(SDK manager)安装你期望版本的SDK。你就可以创建安桌虚拟机,如果你打算使用真机采集数据,那么虚拟机可以不用创建。

然后可以去下载appium桌面软件(appium-desktop),可以从 该地址 https://github.com/appium/appium-desktop/releases 找到下载。

下载之后,双击安装即可。

安装完之后,启动appium,可以看到如下图所示:

android

8.4. 创建驱动

打开GoldData仿真脚本编辑窗口,可以使用"__"(或者别称helpers,是 DriversHelper 类型对象),来创建。如下图所示:

chrome

运行测试,将会看到浏览器被打开,且还有个文本输入框。如下图所示:

chrome

上一行“.chrome()”,就会创建浏览器,将会看浏览器被打开。然后执行".waitForInput()",默认会打开一个输入框,并等待输入,只能输入内容且点击提交才会往下执行。在此主要是做演示使用,以免脚本执行完浏览器将会迅速关闭。

然后可以使用"__.get(url)",让浏览器访问网页,如下图所示:

__.chrome()
__.get('http://people.cn/')
__.waitForInput({label:'测试',type:0,content:'测试打开Chrome浏览器'})
chrome

8.5. __switch(切换管理)

__switch是 SwitchHelper 对象。该对象管理Window、IFrame、Frame、及Alert切换。 典型用法如下:

__.chrome()
//打开新标签页面,并访问url
__switch.newWindow('http://www.gov.cn/shuju/index.htm')
__.waitFor(5)
//切到第一个标签页显示
__switch.toFirstWindow()
//关闭第一个标签页
__switch.close()
__.waitForInput({label:'测试',type:0,content:'测试打开Chrome浏览器'})
chrome

8.6. __proxy(访问代理)

__proxy是 ProxyHelper 对象。该对象主要提供代理以及MITM服务,以及代理切换和代理数据访问功能。

8.6.1. 创建代理服务

典型用例1:

//创建代理服务器,端口号使用临时随机
__proxy.createServer(true,'socks://localhost:1080').start(0)
//创建chrome驱动,并设置代理
__.chrome(__proxy.get())

__.get('http://www.google.com/')
//访问输入框,聚焦、敲入"hello",提交并搜索
$css("input[name=q]").click().sendKeys("hello").get(0).submit()
__.waitForInput({label:'测试',type:0,content:'测试打开Chrome浏览器'})
chrome

8.6.2. 访问代理数据库

使用"__proxy.db('cate1')"函数将会返回一个代理数据库实例,类型是 ProxydbHelper

典型用例2:

var proxydb=__proxy.db('cate1')

__proxy.createServer(true,proxydb.next().url).start(0)

__.chrome(__proxy.get())

8.7. 等待

等待,一般用于含有ajax的页面,或者需要等待输入的页面。

8.7.1. 线程等待

示例:

//等待5秒
__.waitFor(5)

8.7.2. 条件等待

只有当条件满足为true时,才往下执行。 示例:

__.chrome()
__.get('http://www.gov.cn/')
//等待5秒
__.waitFor(5,function(){
    return $css('body').length>0
})

8.7.3. 输入等待

只有当有输入时,才往下执行。

示例:

__.chrome()
__.get('http://www.gov.cn/')
//等待5秒
var input=__.waitForInput({label:'测试',type:0,content:'测试打开Chrome浏览器',default:'默认值'})
println("输入内容是:"+input)

8.8. 选择器

在GoldData仿真采集器里,有三大类选择器(但这些选择器调用都会返回一个 SelectHelper 类 ):

一、$(html,baseUri) 或者$$(cssSelector)函数是指JSOUP类型的选择器 这种是静态html文本选择。

二、$css()、$id()、$name()、$xpath()、$link()这种是基于WebDriver的选择, 当然可以用在手机APP选择。

三、$ui()这种是基于安桌UiSelector的选择器,用于移动端手机APP选择。

8.8.1. $(html,baseUri) 或者$$(cssSelector)

示例:

__.chrome()
__.get('http://www.gov.cn/')

//第一种,将当前内容变为静态url,然后再用$()
var html=$select().html();
var h1=$(html,__.url()).select('body h1').html()

//第二中,直接使用$$(cssSelector)
h1=$$('body h1').html()

示例:

__.chrome()
__.get('http://www.gov.cn/')
//使用链接文本,查找链接,并点击。
$link("新闻",true).click()
var input=__.waitForInput({label:'测试',type:0,content:'测试打开Chrome浏览器',default:'默认值'})

8.8.3. UiSelector

UiSelector 是专门用于移动安桌App的选择器。下面是一个操作手机APP计算器的例子。

示例:

__.android('com.android.bbkcalculator','.Calculator')

//选择8
$ui('$resourceIdMatches(".*digit8")').click()
//选择x
$ui('$resourceIdMatches(".*mul")').click()
//选取2
$ui('$resourceIdMatches(".*digit2")').click()
//选择=
$ui('$resourceIdMatches(".*equal")').click()
//获取结果
var text=$ui('$resourceIdMatches(".*edit_result_text")').text()

println("text:"+text)
var input=__.waitForInput({label:'测试',type:0,content:'结果是'+text,default:'默认值'})

8.9. $actions(动作)

动作,主要用于Web或者WebView,该函数主要返回 Actions 类。

典型示例如下:

__.chrome()
__.get('http://www.gov.cn/')
var ele=$link('新闻',true).get(0)
//点击新闻链接
$actions().click(ele).perform()

var input=__.waitForInput({label:'测试',type:0,content:'测试动作',default:'默认值'})

8.10. __scroll(滚动)

__scroll是 ScrollHelper 对象。该对象主要提供元素滚动功能,主要用于Web及WebView。

典型示例如下:

__.chrome()
__.get('http://www.gov.cn/')
//将督查栏目滚动到可视区域。
__scroll.scrollIntoView($link('督查',false).get(0))

var input=__.waitForInput({label:'测试',type:0,content:'测试动作',default:'默认值'})

8.11. __navi(导航)

__navi是 NavigateHelper 对象。该对象主要提供导航功能。

典型示例如下:

__.chrome()
__.get('http://www.gov.cn/')
var url=$link('新闻',false).$().select("a").attr("abs:href");
__.get(url);

__.waitFor(5)
//返回第一个请求URL页面
__navi.back()

var input=__.waitForInput({label:'测试',type:0,content:'测试动作',default:'默认值'})

8.12. __swipe(刷屏动作)

__swipe是 SwipeHelper 对象。该对象主要提供移动App刷屏动作。

典型示例如下:

//翻页获取通讯录所有列表
__.android('com.android.contacts','.activities.PeopleActivity')
var row=$ui('$resourceId("android:id/list")').get(0)
var list=[];
var idList=[];
function getItem(ele){
    ele.click();
    var name= $id("com.android.contacts:id/large_title").text()
    var phone= $id("com.android.contacts:id/header").text()
    __navi.back();
    return {id:name+phone,name:name,phone:phone};
}
function getRows(){
    return $bind(row).id("com.android.contacts:id/cliv_name_textview");
}
while(true){
    var eles=getRows().get();
    var item=null;
    var firstItem=null;
    var isrepeat=false;
    var aa=[];
    eles.forEach(function(e){aa.push(e);})
    aa.reverse().forEach(function(ele){
        if(isrepeat) return;
       item=getItem(ele);
       if(!firstItem){
           firstItem=item;
       }
       if(idList.indexOf(item.id)==-1){
         idList.push(item.id);
         list.push(item);
       }else{
           isrepeat=true;
       }
    })
    __.waitFor(2);
    //滚动列表
    __swipe.scrollDown();
    eles=getRows()
    if(getItem(eles.get(eles.length-1)).id==firstItem.id){
        break;
    }
}
list.forEach(function(item){
    println("name:"+item.name+",phone:"+item.phone);
})
var input=__.waitForInput({label:'测试',type:0,content:'测试滚动动作',default:'默认值'})

8.13. WebView(移动App)

一般来说,WebView只有当调试功能打开时,才能抓取页面,但多数市面上的App调式状态都是关闭的(当然技术上用Xposed重新打开)。

对于采集数据而言更好的方式则是从内置的代理响应流中获取,如 __proxy.addFilter(client2Proxy,proxy2server,server2proxy,proxy2client) 。对于如何获取Html结构,这里推荐使用fiddler,或者 weinre, spy-debugger

8.14. 中继代理(移动App)

移动App还无法直接单独给某个App设置代理,需要你手动设置一个前置代理。但在GoldData里可以再通过中继代理,去动态改变代理地址。

典型示例如下:

//获取代理数据库
var proxydb=__proxy.db('cate2')

__proxy.createServer(true,proxydb.next().url)
//开启代理服务器,手机上手动设置代理 <采集器客户端IP>:9999
__proxy.createServer(true,proxydb.next().url).start(9999);
__.android('com.android.contacts','.activities.PeopleActivity')
......
__.get(<地址>)

//手动切换代理
__.change(proxydb.next().url)

__.get(<地址>)

8.15. 关键词管理

关键词可以通过 $kw("<cate>") 函数获取,该函数有一个参数,是关键词分类,需要到相应的站点下先定义关键词分类。该函数返回 KwHelper 类型。

典型示例如下:

//创建代理服务器,端口号使用临时随机
__proxy.createServer(true,'socks://localhost:1080').start(0)
//创建chrome驱动,并设置代理
__.chrome(__proxy.get())

__.get('http://www.google.com/')

var kwCursor=$kw("tech")
var kw=null
while((kw=kwCursor)!=null){
    $css("input[name=q]").click().sendKeys(kw).get(0).submit()
     __.waitFor(5)
     __navi.back()
     kwCursor.submit(kw);
}
__.waitForInput({label:'测试',type:0,content:'测试关键词'})

8.16. 数据集操作

数据集操作可以使用$dataset('<dataset>') 函数。该函数带有一个参数就是数据集名称,调用后将返回 DatasetHelper 类。该函数将有一系列方法如存储、获取数据集方法。使用该方法时要提前定议数据集字段!

典型用法如下:

__.chrome()
__.get('http://www.gov.cn')

$$(".h206 a").forEach(function(e){
   var item={}
   item.url= e.attr("abs:href")
   //对于数据集,必须要有sn字段
   item.sn=md5(item.url)
   item.title=e.text();
   //存储到dataset当中.
   $dataset("topnews").add(item);
});
__.waitForInput({label:'测试',type:0,content:'测试$dataset'})

8.17. 链接操作

链接操作可以使用$href() 函数。该函数调用后将返回 HrefHelper 类。该函数主要是存储链接功能。要说明的是,只存储符合条件(规则必须已经定义)的链接。

典型用法如下:

__.chrome()
__.get('http://www.gov.cn')

$$(".h206 a").forEach(function(e){
   var href= e.attr("abs:href")
   //存储链接
   $href().add(href);
});
__.waitForInput({label:'测试',type:0,content:'测试$href'})

8.18. 站点变量

站点变量可以使用vars来引用。对于站点变量可以在 站点变量管理 里设置。

使用方法法如下:

var content=vars.username +':'+vars.password;

__.waitForInput({label:'测试',type:0,content:'content:'+content})

8.19. 邮件通知

$mailTo是一个发送邮件通知的函数。在发送邮件通知之前,需要确保邮箱在系统设置里已经配制。

邮件函数参数列表如下:

字段

类型

说明

to

String 或者List

指定接收者

subject

String

邮件标题

content

Map

邮件内容

返回值是个Map,包括以下字段:

字段

类型

说明

status

boolean

true为成功,false为失败

message

String

发送错误消息

使用示例如下:

$mailTo({to:'test@qq.com',subject:'邮件标题',content:'邮件内容'})

8.20. 窗口管理

窗口管理对象通过"__window"来使用,该对象是 WindowHelper 类。其典型示例如下:

__.chrome()
//窗口最大化。
__window.max()

//展示图片
__.waitForInput({label:'测试',type:1,content:'test'})

8.21. JavaAuto自动化工具

在3.2.0中,开始引入Java里的Robot来强化自动化能力,修补Webdriver在一些非Web方面的不足。通过 JavaAuto,可以操作鼠标和键盘,来执行一些自动化工作。使用示例如下:

//获取JavaAuto对象
var auto=__.auto()
//截屏
var shotContent=auto.screenshot()

//展示图片
__.waitForInput({label:'测试',type:1,content:shotContent})

8.22. AutoIt与AutoItX自动化工具

AutoIt是一个Windows下的窗口自动化工具,仅在Windows下才能运行。在3.2.0中,为了增强某些特殊的自动化能力(例如对Windows com组件),所以开始支持AutoIt的调用接口,并集成了AutoItX工具。

8.22.1. AutoIt

首先,你需要将AutoIt 下载和安装到本地。然后通过SciTE Script Editor编辑自动化脚本,然后再通过Aut2exe.exe,将脚本变为exe文件。

有了exe文件,然后可以通过仿真脚本里的 `__.exec(String…​ command)`函数来执行命令。如下所示:

__.exec('E://fileupload.exe')

8.22.2. AutoItX3

首先,你需要去官网下载 AutoItX3。 如果你用的的64位Java虚拟机,那么你需要使用64位的注册,否则32位注册。注册方法分别如下:

X64

C:\Windows\SysWOW64\regsvr32.exe AutoItX3_x64.dll

X86

C:\Windows\system32\regsvr32.exe AutoItX3.dll

注册之后,就可以在仿真脚本里操作了。在仿真脚本里可以通过 __.autoIt() 方法返回一个 AutoItX 对象。 示例如下:

var autox=__.autoIt()

autox.run('notepad.exe','c://',9)

__.waitForInput({label:'测试',type:0,content:'autoX test'})

9. 参考

9.1. CSS3选择器入门

金色数据利用css非常强大和灵活的语法查找匹配HTML元素是非常棒的。金色数据里的CSS3节点选择器,实际上是使用JSoup组件的节点选择器解析器,因此与Jsoup对CSS3支持是一致的。

9.1.1. 基础选择器

  1. *

    任意元素。例如 *

  2. tag

    通过标签名称tag查找元素。例如 a

  3. ns|tag

    在命称空间里的标签查找元素。例如 fb|name 查找`<fb:name>`元素

  4. #id

    通过元素ID查找元素。例如:#logo

  5. .class

    通过class名称查找元素。例如: .masthead

  6. [attr]

    通过属性查找元素。例如 [href]

  7. [^attr]

    带有属性名称前缀的元素。例如: [^data-] 查找 带有`data-`属性前缀的元素

  8. [attr=value]

    带有属性值的元素。例如`[width=500](或者可以引起来,[]`)

  9. [attr^=value],[attr$=value],[attr*=value]

    带有属性前缀、后缀,含有指定值的元素。例如:[href*=/path/]

  10. [attr~=regex]

    带有属性值匹配那正则表达式的元素。例如:img[src~=(?i)\.(png|jpg?g)]

9.1.2. 联合选择器

  1. el#id

    查找el元素,其ID为id。例如 div#logo

  2. el.class

    查找el元素,其含有类class。例如 div.masthead

  3. el[attr]

    查找el元素,其带有属性attr。例如 a[href] , a[href].masthead

  4. ancestor child

    带有祖先元素ancestor 且有后代child的元素。例如 .body p 将会查找 p 元素,且其带有祖先元素 .body

  5. parent > child

    直接有指定的父元素parent的子元素child。例如 div.content > p

  6. siblingA + siblingB

    查找兄弟B元素,其有直接前置兄弟元素A。例如 div.head+div

  7. siblingA ~ siblingX

    查找兄弟X元素,其有前置兄弟元素A。例如 h1 ~ p

  8. e1,e1,e1

    组合多个选择器,查找 匹配以上任意被选择到的元素。例如 div.masthead, div.logo

9.1.3. 假类选择器

  1. :lt(n)

    查找元素,其元素在兄弟元素中索引于小于n。例如: td:lt(3),查找每行的前三个单元格。

  2. :gt(n)

    查找元素,其元素在兄弟元素中索引于大于n。例如: td:gt(1),查找单元格,这些单元格的索引要大于1

  3. :eq(n)

    查找元素,其索引等于n。例如: td:eq(0),查找 每行的第一个单元格

  4. :has(selector)

    查找元素,其至少含有匹配selector。例如: div:has(p) ,查找div元素,该元素含有p元素。

  5. :not(selector)

    查找元素,其不含有匹配selector。例如: div:not(:has(div)) 查找div元素,其不含有div子元素

  6. :contains(text)

    查找元素,其含有指定的文本。这个文本不分大小写。例如: p.contains(jsoup) 查找p元素,其含有文本’jsoup'

  7. matches(regex)

    查找元素,其文本匹配指定的正则表达式。 例如: td:matches(\\d+) 查找单元格,其含有数字。

  8. containsOwn(text)

    查找元素,其直接含有指定的文本。 例如: p:containsOwn(jsoup) 查找p元素,其自身含有文本’jsoup'

  9. :matchesOwn(regex)

    查找元素,其自身文本匹配指定的正则表达式。 td:matchesOwn(\\d+) 查找表格,其直接含有数字。

9.1.4. 结构化的假类选择器

  1. :root

    查找文档中的根元素,通常在HTML里,这通常是html元素。

  2. :nth-child(an+b)

    查找元素,其子元素索引是an+b的被选中。 例如: tr:nth-child(2n+1) 查找表格的每个奇数行。

  3. :first-child

    查找元素中的第一个子元素。 例如:div> p:first-child

  4. :last-child

    查找元素中的最后一个子元素。例如: ol > li:last-child

9.1.5. 更多内容

更多请参考 Jsoup文档

9.2. JavaScript入门

JavaScript 是世界上最流行的脚本语言。JavaScript 是一种轻量级的编程语言,很容易学习。

在这里我们做些简单介绍,更多内容可以看 这里

9.2.1. 声明(创建)JS变量

JS变量用`var`关键词声明,如下所示:

var c=1;
var b=2;
var xx=c/b;

这就与代数学一样类似,在上例中,我们使用c来保存值 1。在JavaScript中,这些等式左边的内容,被称之为变量。

变量就是存储数据的容器
JavaScript变量必须以字母或$或_开头
数据类型

在JavaScript中变量有很多种类型,但目前,我们只关注三种类型,数字 和 字符串,以及布尔类型。

字符串类型的文本,通常需要双引号或者单引号包围。而数字则不必。如下所示:

var c=1;
var b="Hello World!"

而布尔类型,只能有两个值 :true或 false。如下所示:

var c=true
var b=false

9.2.2. JS运算符

运算符 = 用于给 JavaScript 变量赋值。算术运算符 + 用于把值加起来。如下所示:

var c=3
var b=c+5

上述语解码器执行后,b的值 是8。

表格 1. JavaScript 算术运算符

运算符

描述

例子

结果

+

x=1+1

x=2

-

x=2-1

x=1

*

x=2*3

x=6

/

x=6/2

x=3

%

求余数(保留整数)

x=3%2

x=1

++

累加

x=1; ++x

x=2

 — 

递减

x=2;--x

x=1

+运算符还可以将字符串变量加起来,其实意是指连接起来。如下所示:

var c='Hello '
var b=c+'world'

上述语句执行后,b 的值 是 Hello world

9.2.3. JS条件语句

比较运算符

比较运算符在逻辑语句中使用,以测定变量或值是否相等。

给定x=9 下面的表格用以解释比较运算符:

运算符

描述

例子

==

等于

x==9为true

===

全等(值和类型)

x===9 为true

!=

不等于

x!=9 为false

>

大于

x>8 为true

<

小于

x<8 为false

>=

大于或者等于

x>=9 为true

小于或者等于

x⇐9 为true

逻辑运算符

逻辑运算符用于测定变量或值之间的逻辑。

给定 x=5 以及 y=2,下表解释了逻辑运算符:

运算符

描述

例子

&&

( x < 10 && y>2) 为false

||

(x==3 || y==3) 为false

!

!(x==y)为true

if语句

只有当指定条件为 true 时,该语句才会执行代码。如下所示:

if(weather=='sunny'){
  console.log('Good weather')
}

如果上述weather为’sunny’时,则会输出"Good weather"。

if…​else语句

请使用 if…​.else 语句在条件为 true 时执行代码,在条件为 false 时执行其他代码。如下所示:

if(weather=='sunny'){
  console.log('Good weather')
}else{
  console.log('Bad weather')
}

如果上述weather为’sunny’时,则会输出"Good weather"。否则,输出"Bad weather"。

If…​else if…​else 语句

使用 if…​.else if…​else 语句来选择多个代码块之一来执行。如下所示:

if(weather=='sunny'){
  console.log('Good weather')
}else if(weather=='cloudy'){
  console.log('Not bad weather')
}else{
  console.log('Bad weather')
}

如果上述weather为’sunny’时,则会输出"Good weather",如果为’cloudy',则会输出’Not bad weather',否则输出"Bad weather"。

9.2.4. JS循环控制

如果您希望一遍又一遍地运行相同的代码,那么我们需要JS提供的循环语句。JavaScript 支持不同类型的循环:for( 循环代码块一定的次数), while(当指定的条件为 true 时循环指定的代码块),

for循环

for 循环是您在希望创建循环时常会用到的工具。

下面是 for 循环的语法:

for (statement 1; statement 2; statement 3){
  被执行的代码块
}
statement 1

在循环(代码块)开始前执行,只执行一次。

statement 2

定义运行循环(代码块)的条件

statement 3

在循环(代码块)已被执行之后执行

示例如下:

for (var i=0; i<5; i++){
  console.log('runs at '+i)
}
while循环

while 循环会在指定条件为真时循环执行代码块。示例如下:

while (i<5){
  console.log('runs at '+i)
  i++;
}

如果 想跳出循环,则可以使用break关键词。示例如下:

while (i<5){
  console.log('runs at '+i)
  if( i<3){
    break;
  }
  i++;
}

9.2.5. JS注释

JavaScript 不会执行注释。我们可以添加注释来对 JavaScript 进行解释,或者提高代码的可读性。单行注释以 // 开头。多行注释以 /* 开始,以 */ 结尾。如下所示:

//这是单行注释
/*
 这是多行
 注释

*/
console.log("注释不会被JavaScript执行。")

9.2.6. JS函数

函数可被调用时执行的可重复使用的代码块。

函数语法
function func1(arg1,arg2){
 //code block...
}

当调用该函数时,会执行函数内的代码。

在调用函数时,您可以向其传递值,这些值被称为参数。这些参数可以在函数中使用。如下所示

func1(arg1,arg2)

函数示例如下:

function add(a,b){
 return a+b;
}

var ret=add(2,3)
console.log(ret);

上述代码运行输出ret的值 5

带有返回值的函数

有时,我们会希望函数将值返回调用它的地方。通过使用 return 语句就可以实现。在使用 return 语句时,函数会停止执行,并返回指定的值。如下所示:

function add(a,b){

 return 3;
}

上面的函数会返回值 3

9.2.7. JavaScript 对象

JavaScript 中的所有事物都是对象:字符串、数值、数组、函数…​

此外,JavaScript 允许自定义对象。

JavaScript 对象

JavaScript 提供多个内建对象,比如 String、Date、Array 等等。对象只是带有属性和方法的特殊数据类型。

访问对象的属性

属性是与对象相关的值。使用语法是`objectName.propertyName`。示例如下:

var message="Hello World";
var x=message.length;

在这个例子使用了 String 对象的 length 属性来获得字符串的长度。上述代码执行后将会得到x的值为`11`

访问对象的方法

方法是能够在对象上执行的动作。你可以通过`objectName.methodName()`来调用方法。示例如下:

var message="Hello world!";
var x=message.toUpperCase();

这个例子使用了 String 对象的 toUpperCase() 方法来将文本转换为大写,代码执行后,x的值将是 HELLO WORLD!

创建 JavaScript 对象

通过 JavaScript,您能够定义并创建自己的对象。 创建新对象有两种不同的方法:1、定义并创建对象的实例;2、使用函数来定义对象,然后创建新的对象实例。

通过实例创建

person=new Object();
person.surname="Wang";
person.name="Blue";

这个例子创建了对象的一个新实例,并向其添加了2个属性,surname和name。

另一种形式创建对象,即文本方式:

person={surname:"Wang",name:"Blue"};

通过实例创建

function person(surname,name){
    this.surname=surname
    this.name=name
    //可以添加方法
   this.changeName=function(newName){
      this.name=newName
   }
}
var a1=new person('Wang','Blue')

9.2.8. JS内置对象

Number对象

JavaScript中,只有一种数字类型。Number对象的属性和方法请参考 这里

String对象

字符串对象用于处理已有的字符块。String对象的属性和方法请参考 这里

Date对象

Date 对象用于处理日期和时间。Date对象的属性和方法请参考 这里

Array对象

数组对象的作用是:使用单独的变量名来存储一系列的值。Array对象的属性和方法请参考 这里

Boolean对象

Boolean对象用于将非逻辑值转换为逻辑值(true 或者 false)。Boolean对象的属性和方法请参考 这里

Math对象

Math(算数)对象的作用是:执行常见的算数任务。。Math对象的属性和方法请参考 这里

9.3. 正则表达式入门

正则表达式,主要是用于处理搜索匹配字符串,极为强大重要的工具。

在JS里的正则表达有两种方法可以创建正则表达式对象。

9.3.1. 创建正则表达式对象

直接文本法
    /pattern/修饰符
创建RegExp对象法
    new RegExp(pattern, 修饰符);
参数

参数pattern是一个字符串,指定了正则表达式的模式或其他正则表达式。

修饰符

 

修饰符 描述

i

执行对大小写不敏感的匹配。

g

执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。

m

执行多行匹配。

9.3.2. 有关正则表达式方法

RegExp对象方法

 

方法

描述

compile

编译正则表达式。

exec

检索字符串中指定的值。返回找到的值,并确定其位置。

test

检索字符串中指定的值。返回 true 或 false。

支持正则表达式的 String 对象的方法

 

方法 描述

search

search 检索与正则表达式相匹配的值。

match

找到一个或多个正则表达式的匹配。

replace

替换与正则表达式匹配的子串。

split

把字符串分割为字符串数组。

9.3.3. 有关正则表达式模式

方括号

方括号用于查找某个范围内的字符:

表达式

描述

[abc]

查找方括号之间的任何字符。

[^abc]

查找任何不在方括号之间的字符。

[0-9]

查找任何从 0 至 9 的数字。

[a-z]

查找任何从小写 a 到小写 z 的字符。

[A-Z]

查找任何从大写 A 到大写 Z 的字符。

[A-z]

查找任何从大写 A 到小写 z 的字符。

[adgk]

查找给定集合内的任何字符。

(red|blue|green)

查找任何指定的选项。

元字符

元字符(Metacharacter)是拥有特殊含义的字符:

元字符

描述

.

查找单个字符,除了换行和行结束符。

\w

查找单词字符。

\W

查找非单词字符。

\d

查找数字。

\D

查找非数字字符。

\s

查找空白字符。

\S

查找非空白字符。

\n

查找换行符。

\t

查找制表符。

\uxxxx

查找以十六进制数 xxxx 规定的 Unicode 字符。

量词

 

量词

描述

n+

匹配任何包含至少一个 n 的字符串。

n*

匹配任何包含零个或多个 n 的字符串。

n?

匹配任何包含零个或一个 n 的字符串。

n{X}

匹配包含 X 个 n 的序列的字符串。

n{X,Y}

匹配包含 X 或 Y 个 n 的序列的字符串。

n{X,}

匹配包含至少 X 个 n 的序列的字符串。

n$

匹配任何结尾为 n 的字符串。

^n

匹配任何开头为 n 的字符串。

9.3.4. RegExp 对象的使用说明

使用 test()

用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。

例子:

var patt = /f/;
patt.test("The best things in life are free!");

上例中含有‘f’,所以上述结果输出为`true`.

使用 exec()

用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

例子:

/f/.exec("The best things in life are free!");

上例中含有‘f’,所以上述结果输出为`f`.

9.3.5. 字符串中有关正则方法,使用说明

search()

用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。

例子:

var str = "Look and feel ";

var idx=str.search(/and/i)

输出结果为 5

replace()

用于在字符串中用一些字符替换另一些字符,或替换一个与正则表达式匹配的子串。

var str = "Look and feel ";

var newstr=str.replace(/and/i,"or");

输出结果为 Look or feel

9.3.6. 更多内容

更多内容请参考 正则表达式,来自MDN

9.4. Hjson

JSON是易于人类阅读但难书写的格式。Hjson是对于JSON的一种语法扩展。Hjson主要用于将JSON格式数据传递到机器之前方便人类阅读和编辑的格式。

每一键值对,都是一新行,无需逗号分隔。
{
  first: 1
  second: 2
}
还允许注解。
{
  # 单行注释

  // 单行注释

  /* 多行注释
     多行注释 */}
}
指定字符串值,可以无需引号,这时每行只允许一个值且没有逗号。
{
  JSON: "a string"
  Hjson: a string
  RegEx: \s+
}
多行字符串
{
  md:
    '''
    第一行
    第二行
    '''
}
更多内容

请参考 Hjson官网

9.5. 金色数据JS全局内置函数和变量

9.5.1. $(html,baseUri) :

返回JSoup库中的Document对象。使用此对象则可以对参数html进行CSS3选择器筛选。

参数说明:

html : html文本,一般为需要解析的HTML网页

baseUri: URL地址,一般是用来计算HTML网页里的相对链接,来转换成绝对链接。

9.5.2. $ajax(url,args):

发送http请求,并返回数据。

参数说明:

url : String,网页地址

args : Map,请求参数对象。具体内容如下:

参数 类型 说明

method

String

HTTP请求方法,默认`GET`

headers

Map

HTTP请求头,形式为key-value对象

encoding

Boolean

是否解码,默认true

proxy

String

代理地址, 代理支持三种类型:http,https,socks.

data

String

发送的数据,形式为a1=b&b1=3

该函数调用后,返回内容如下 :

参数 类型 说明

status

int

http响应状态码,200为正确响应o

headers

Map

http响应头

cookie

String

Cookie

content

byte[] or String

如果请求设定编码将返回String内容,否则byte[].

9.5.3. $ajax2(url)

返回 GoldSpider 对象,该函数主要是用于取代$ajax

参数说明:

url : String,网页地址

9.5.4. url(string)

返回 URL 对象,此函数主要是解析URL内容提供方便。

参数说明:

string : String,网页地址

9.5.5. md5(string)

返回字符串经md5编码的结果字符串。

参数说明:

string : String,内容

9.5.6. formatDate(date,pattern)

根据pattern格式化日期。

参数说明:

date : Date,日期

pattern : String,模式,比如yyyy-年,MM-月,dd-日,HH-时,mm-分,ss-秒。更多模式内容请参考 SimpleDateFormat

9.5.7. parseDate(date,pattern)

根据pattern解析字符串日期成 Date 对象。

date : String, 字符串日期

pattern : String,模式,比如yyyy-年,MM-月,dd-日,HH-时,mm-分,ss-秒。更多模式内容请参考 SimpleDateFormat

9.5.8. LOG(level,message)

输出日志,主要用于调试脚本

level : 可以是ERROR,WARN,INFO,DEBUG

message : 输出消息

返回 Cookie 操作对象.用于编解码cookie。

9.5.10. 内置类型

可以使用new关键字创建的对象

Map

其属性和方法可以参考 Map

JDate

其属性和方法可以参考 Date

9.6. 脚本变量

9.6.1. 节点脚本变量

节点脚本,用于将文件内容解析成一个或多个数据集,然后放入out变量中。

查看 全局内置函数和变量, 以下是节点内容特有变量:

html

String,下载的文件文本内容

baseUri

String,当前URL

headers

Map,当前响应头

status

int,当前响应码

String, 服务器返回的Cookie

fields

Map,规则字段

out

List,输出数据集

request

SpiderRequest,当前爬虫请求对象

vars

Map,站点变量

9.6.2. 字段脚本变量

该脚本用于编辑该字段值,脚本返回内容即是该字段的新值。

查看 全局内置函数和变量, 以下是该脚本特有变量:

source

String,该字段内容值 ,如果该字段未配制表达式expr,则该变量不可用。

item

Map,其它字段键值对,如果该字段配制了表达式expr,则该变量不可用。

eleIdx

int,匹配元素当前索引

html

String,下载的文件文本内容

baseUri

String,当前URL

headers

Map,当前响应头

status

int,当前响应码

String,当前响应Cookie

fields

Map,规则字段

out

List,输出数据集

request

SpiderRequest,当前爬虫请求对象

vars

Map,站点变量

9.6.3. 抓取下载访问脚本变量

该脚本主要用于重命名文件下载之后存储路径,其返回值即是将要存储的路径。但如果返回为空时,则取使用URL相对原路径为储存路径,如果返回值为-1时,则表示不下载和存储。

查看 全局内置函数和变量, 以下是该脚本特有变量:

source

String,该字段内容值 ,一般是文件下载地址。

item

Map,其它字段键值对。

9.6.4. 融合关联字段脚本变量

该脚本用于编辑关联数据方式中的关联字段,脚本返回内容即是关联数据集。

查看 全局内置函数和变量, 以下是该脚本特有变量:

dataset

Map,需要融合的数据集。

offset

int,当前数据集所对应的偏移量。

9.6.5. 融合之前脚本变量

该脚本用于编辑决定当前数据集是否参与融合,脚本返回内容必须是true或者false。如果脚本内容为空,则默认为true,表示当前数据集参与融合。

查看 全局内置函数和变量, 以下是该脚本特有变量:

dataset

Map,需要融合的数据集。

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

offset

int,当前数据集所对应的偏移量。

9.6.6. 融合之后脚本变量

该脚本用于编辑决定是否当前融合结果参与写进表,脚本返回内容必须是true或者false。如果脚本内容为空,则默认为true,表示融合数据写入到表。

查看 全局内置函数和变量, 以下是该脚本特有变量:

dataset

Map,需要融合的数据集。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

mergedDataset

Map, 融合后的数据

updateRow

Map,要更新到数据库表中的内容记录

dbRow

Map,相对应的数据库表记录,如果为新增,该内容可能为null(空)。

offset

int,当前数据集所对应的偏移量。

Map $mailTo(Map)

发送邮件函数。

邮件参数列表如下:

字段

类型

说明

to

String 或者List

指定接收者

subject

String

邮件标题

content

Map

邮件内容

返回值是个Map,包括以下字段:

字段

类型

说明

status

boolean

true为成功,false为失败

message

String

发送错误消息

9.6.7. 融合下载访问脚本变量

该脚本主要用于重命名文件下载之后存储路径,其返回值即是将要存储的路径。但如果返回为空时,则取使用URL相对原路径为储存路径,如果返回值为-1时,则表示不下载和存储。

查看 全局内置函数和变量, 以下是该脚本特有变量:

source

String,该字段内容值 ,一般是文件下载地址。

entity

Map,需要融合的数据集。

mergedDataset

Map, 融合后的数据

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

9.6.8. 融合字段方式JavaScript脚本变量

该脚本用于编辑融合的相应值。

查看 全局内置函数和变量, 以下是该脚本特有变量:

entity

Map,需要融合的数据集。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

offset

int,当前数据集所对应的偏移量。

9.6.9. 融合字段方式搜索匹配脚本变量

注:使用此融合时注意开启solr服务。

此脚本采用hjson格式。

所有属性列表如下:

属性

类型

说明

index

String

搜索表,一般与数据库表名相同

field

String

查询搜索表字段,如果为空,则直接在搜索表所有字段上查找。

get

String

返回字段

display

String

显示字段

by

String

根据数据集哪个字段进行查找

js

String

查找搜索表前的JS,该js返回值,将是搜索表查找关键词。具体见下面 搜索表之前JS

afterJs

String

查找搜索表后的JS,该JS返回值,将是搜索表查找结果的前述相关get值。具体见下面 搜索表之后JS

similarity

Double

相似度范围,0-1之间,只有当在此或此之上时才返回搜索表结果。

afterJs2

String

该JS将在afterJs之后执行,该JS返回值,需要返回Map,该Map将需要含两个键calcValue,calcValueDisplay。具体见下面 搜索表之后JS2

搜索表之前JS

该js返回值,将是搜索表查找关键词。

查看 全局内置函数和变量, 以下是该脚本特有变量:

by

String,搜索内容。

entity

Map,需要融合的数据集。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

offset

int,当前数据集所对应的偏移量。

搜索表之后JS

该JS将是用于修正搜索表结果内容,该JS返回值,将是搜索表结果内容.

查看 全局内置函数和变量, 以下是该脚本特有变量:

entity

Map,需要融合的数据集。 === search Map,搜索表结果内容。

offset

int,当前数据集所对应的偏移量。

搜索表之后JS2

该JS需要返回Map,该Map将重写calcValue和calcValueDisplay值。

查看 全局内置函数和变量, 以下是该脚本特有变量:

by

String,搜索内容。

entity

Map,需要融合的数据集。

searchByField

Map,搜索表的结果内容。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

calcValue

String,搜索表结果值

calcValueDisplay

String,搜索表结果值显示

offset

int,当前数据集所对应的偏移量。

9.6.10. 融合字段方式SN关联脚本变量

此脚本采用hjson格式。

所有属性列表如下:

属性

类型

说明

table

String

数据库表

dataset

String

数据集名称

get

String

返回字段

display

String

显示字段

by

String

根据数据集哪个字段进行查找,这里是固定值sn.

js

String

查找数据库表前的JS,该js返回值,将是数据库表查找关键词。具体见下面 搜索表之前JS

afterJs

String

返回值Map将需要含两个键calcValue,calcValueDisplay。具体见下面 搜索表之后JS

搜索表之前JS

该js返回值,将是数据库表查找关键词。

查看 全局内置函数和变量, 以下是该脚本特有变量:

by

String,搜索内容。

entity

Map,需要融合的数据集。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

offset

int,当前数据集所对应的偏移量。

搜索表之后JS

该JS需要返回Map,该Map将重写calcValue和calcValueDisplay值。

查看 全局内置函数和变量, 以下是该脚本特有变量:

by

String,搜索内容。

entity

Map,需要融合的数据集。

searchByField

Map,数据库表的结果内容。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

calcValue

String,搜索表结果值

calcValueDisplay

String,搜索表结果值显示

offset

int,当前数据集所对应的偏移量。

9.6.11. 融合字段方式数据表关联脚本变量

此脚本采用hjson格式。

所有属性列表如下:

属性

类型

说明

table

String

数据库表

col

String

在哪个数据表字段查找

get

String

返回字段

display

String

显示字段

by

String

根据数据集哪个字段进行查找

js

String

查找数据库表前的JS,该js返回值,将是数据库表查找关键词。具体见下面 搜索表之前JS

afterJs

String

返回值Map将需要含两个键calcValue,calcValueDisplay。具体见下面 搜索表之后JS

搜索表之前JS

该js返回值,将是数据库表查找关键词。

查看 全局内置函数和变量, 以下是该脚本特有变量:

by

String,搜索内容。

entity

Map,需要融合的数据集。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

offset

int,当前数据集所对应的偏移量。

搜索表之后JS

该JS需要返回Map,该Map将重写calcValue和calcValueDisplay值。

查看 全局内置函数和变量, 以下是该脚本特有变量:

by

String,搜索内容。

entity

Map,需要融合的数据集。

searchByField

Map,数据库表的结果内容。

search

Object,与之相匹配内容。

属性表

字段

类型

说明

similar

double

匹配内容的相似度,值范围在0-1之间,数值越大,相似度越高。

item

Map

匹配内容

calcValue

String,数据库表结果值

calcValueDisplay

String,数据库表结果值显示

offset

int,当前数据集所对应的偏移量。

9.6.12. 半自动登录_登录脚本变量

该脚本主要用于执行登录,其返回值即是登录结果。

查看 全局内置函数和变量, 以下是该脚本特有变量和函数:

site

所属站点,类型为 SpiderSite

String waitForInput(Map)

等待输入函数,返回值为字符串。调用该函数将会发邮件通知,你可以回复邮件,或者打开“采集管理》网站管理”,点击该站点的“录入等待输入”。直到你回复邮件,或者输入内容后,该函数才会继续执行以返回输入的内容。如下图所示:

wait_1

该函数的参数

字段 说明

label

String,名称

type

int,0—​文字,1—​图片

content

内容,如果是文字,类型是字符串,如果是图片,类型是byte[]

返回值

该JS需要返回Map类型的数据,需要包括以下字段:

字段 说明

status

int,状态,为1表示登录成功,0表示失败

headers

Map,返回新的HTTP头。这里一般应该返回新的Cookie。

9.6.13. 半自动登录_检查脚本变量

该脚本是抓取器在抓取网页后执行。该脚本主要用于检查当前是否登录了,其返回值是检查结果,boolean类型,返回true说明已经登录,false表明未登录。

查看 全局内置函数和变量, 以下是该脚本特有变量:

request

SpiderRequest,当前爬虫请求对象

baseUri

String,当前请求URL

html

String,网页内容

headers

Map,当前响应头

String,当前响应Cookie

status

int,当前响应码

9.7. 定时调度规则

为了保持统一强大灵活的定时调度功能,我们采用致的unix下的cron调度语法。

一个cron表达式,是由空白分隔的6到7个字段组成。字段可以包括任何可以被允许的值,并一些特定的字符形成一个字段。如以下表格所示:

字段名 是否必须 允许的值 允许的特定字符 说明

0-59

, - * /

0-59

, - * /

0-23

, - * /

日期

1-31

, - * ? / L

1-12

, - * /

星期

1-7

, - * ? / L #

星期是星期日开始,星期日是1,星期六是7

空值或1970-2099

, - * /

特定字符意义

字符

说明

*

“所有值”,用于在一个字段内选择所有值,例如在分钟字段中表示每一分钟

?

"没有特定的值",表示当两个字段中的其中一个允许,而不是另一个字段时有用。通常这情况发生在指定日期和星期两个字段时遇到,比如我想要在每月的10日触发事件,但不担心那一天是星期几。那么我将会把"10" 放在日期字段上,且"?"放在星期字段上。具体内容见后面的示例。

-

用于指定范围。比如"10-12"在 时 这个字段上时意思是 10时,11时,12 时。

,

用于指定额外的值 。例如"1,3,5"在星期这个字段上,意思是"星期日,星期二,星期四"

/

用于指定增量。例如,"0/15"在 秒 这个字段上表示"0秒,15秒,30秒,45 秒";"5/15"在秒这个字段上则表示"5秒,20秒,35秒,50秒"。

L

,意味最后(Last),当出现在日期字段时,则意味着这个月的最后一天;当出现在星期字段时,则表示星期六。在日期字段时,你还可指定偏移,比如"L-3",表示这个月倒数第3天。在星期字段时,如果在一个数字后面,则表示这个月的最后一个星期X,例如 "6L"表示"这个月的最后一个星期五"。

#

这表示这个月的第几个星期X。例如 "6#3"表示这个月的第3个星期五,"2#1"表示这个月第一个星期一。

cron表达式可以是看起来这样简单:* * * * ? *

以下是一些示例,请作为参考:

表达式

说明

0 0 12 * * ?

每天的中午12点触发

0 15 10 ? * *

每天上午10:15触发

0 15 10 * * ?

每天上午10:15触发

0 15 10 * * ? *

每天上午10:15触发

0 15 10 * * ? 2050

在2050这一年每天上午10:15触发

0 * 14 * * ?

每天从下午14:00-15:00期间每一分钟触发

0 0/5 14,18 * * ?

每天下午14:00-15:00和18:00-19:00期间,每5分钟解发一次

0 0-5 14 * * ?

每天下午14:00-14:05期间,每分钟解发一次

9.8. 金色数据对象

9.8.1. SpiderRequest

属性
字段 类型 说明

url

String

请求地址

depth

int

当前url所处深度

headers

Map

请求HTTP报头

params

Map

请求参数

9.8.2. SpiderSite

属性
字段 类型 说明

name

String

站点名称

url

String

站点URL

note

String

站点说明

chkSess

int

检查登录,0-否 1-是

sessStatus

int

登录状态,0-未登录 1-已登录 2-等待输入

9.8.3. GoldSpider

HTTP请求和内容抽取器。

属性
方法
名称 说明

GoldSpider setUrl(String url)

设置URL

GoldSpider setMethod(String method)

设置请求HTTP方法

GoldSpider setHeaders(Map headers)

设置请求HTTP报头

GoldSpider addHeader(String key,String val)

添加请求HTTP报头

GoldSpider setData(String data)

设置请求数据

GoldSpider setProxy(String proxy)

设置请求代理

GoldSpider request()

发送请求

byte[] getBodyAsBytes()

以字节数据方式返回内容

String getBodyAsString()

以字符串方式返回内容

<T> T getBodyAsType(Class<T> type)

以指定类型返回内容

GoldSpider setRule(String rule)

设置抽取规则

List<Map> extractList()

根据规则 抽取内容形成多个Map,以List返回

<T> List<T> extractList(Class<T> clzz)

根据规则 抽取内容形成多个指定类型,以List返回

Map extractFirst()

根据规则 抽取内容形成多个Map,并返回第一个。

<T> T extractFirstAsType(Class<T> clzz)

根据规则 抽取内容形成多个指定类型,并返回第一个。

Cookie操作对象。

属性
方法
名称 说明

String encode(Map m){

将Map变为Cookie字符串形式

Map decode(String c)

将字符串形式的Cookie转换成key-value形式的Map

9.8.5. DriversHelper

这个类是被作为全局变量“helpers”,别名“__”来使用。

属性
主要方法
方法 说明

DriversHelper waitFor(int seconds)

等待seconds秒

DriversHelper globalWaitFor(int seconds)

相当于WebDriver的ImplicitWait,设置全局等待时间,也就是检查元素超时时间。

Boolean waitFor(int seconds, Function<? super WebDriver, Boolean> isTrue)

相当于WebDriver的ExplicitWait,设置检查isTrue函数为真的等待时间。如果等等超时,则会返回false,否则返回true。

Boolean waitFor(int seconds,int pollSeconds,Function<? super WebDriver,Boolean> isTrue)

相当于WebDriver的FluentWait,seconds设置等待时间,pollSeconds是轮询检查时间。如果等等超时,则会返回false,否则返回true。

String waitForInput(Map map,boolean isMailSend=false)

该方法会弹出输入对话框,且会挂起并等待输入,直到有输入时才会往下执行。map有四个参数,label表示标签,type表示类型(0—​文字 1—​图片),content(当为文字时,类型是字符串,如果为图片是则是字节数组byte[])为内容,default(给出默认输入值)为默认输入值,可选。isMailSend表示是否还同时发送邮件。

Object exec(String script,Object…​ args)

在页面中执行JavaScript,并返回执行结果。script — 脚本内容,args — 参数。

WebDriver getWebDriver()

返回 WebDriver对象

Object screenshot(int type=1)

给浏览器执行截屏,并返回执行结果。type表是输出类型,如果为0,则是字节数组;如果为1,则是Base64字符串;如果为2,则是File对象。type默认值为1。

DriversHelper get(String url)

让WebDriver访问Url。

String url()

返回当前驱动URL

WebDriver chrome(Map<String,Object> map=[:], List<String> arguments=[], List<String> extensions=[], List<String> encodedExtensions=[], Map<String,Object> exprOptions=[:] )

创建chrome浏览器驱动。map — 用于填充DesiredCapabilities, argument — 参数列表,extensions — 启动扩展,encodedExtensions — 编码后的扩展,

exprOptions  — 设置chrome提供的体验选项。以上所有选项都是可选。

WebDriver chrome( Proxy proxy, Map<String,Object> map=[:], List<String> arguments=[], List<String> extensions=[], List<String> encodedExtensions=[], Map<String,Object> exprOptions=[:] )

创建chrome浏览器驱动。proxy — 代理对象。其它选项同上,且都是可选。

WebDriver IE(Map<String,Object> map=[:])

创建IE浏览器驱动,map — 用于填充DesiredCapabilities,且是可选。

WebDriver IE( Proxy proxy, Map<String,Object> map=[:])

创建IE浏览器驱动。proxy — 代理对象。其它选项同上,且都是可选。

AndroidDriver android(String appPackage,String appActivity, String endport='127.0.0.1:4723',Map<String,Object> map=[:])

创建安卓驱动。appPackage — 应用程序包名, appActivity — 应用程序入口类,endpoint — appium服务端口,默认"127.0.0.1:4723",map - 用于填充DesiredCapabilities,且是可选。

AndroidDriver android(String endport='127.0.0.1:4723',Map<String,Object> map=[:])

创建安卓驱动。endpoint — appium服务端口,默认"127.0.0.1:4723",map - 用于填充DesiredCapabilities,且是可选。

DriversHelper checkStop()

检查抓取器是否停止,如果停止,则抛出InterruptedException异常。

DriversHelper release()

释放WebDriver,以及代理服务等资源。

9.8.6. SwitchHelper

切换管理类,该类管理Window、IFrame、Frame、及Alert切换,以及移动WebView的切换。

属性
主要方法
方法 说明

String curWindow()

返回当前窗口手柄

WebDriver toWindow(String nameOrHandle)

通过手柄切换到这个窗口

WebDriver toWindow(int idx)

通过索引切换到这个窗口

WebDriver toFirstWindow()

切换到第一个窗口

WebDriver toLastWindow()

切换到最一个窗口

WebDriver newWindow(WebElement link,boolean switchTo=true)

通过链接打开新窗口,switchTo为true,表示切换到新窗口,switchTo为false,则不切换。

WebDriver newWindow(String url,boolean switchTo=true)

通过url打开新窗口,switchTo为true,表示切换到新窗口,switchTo为false,则不切换。

SwitchHelper close()

关闭当前窗口,如果是最后一个窗口,则会退出驱动。

List<String> findWindows(String urlRegex)

通过url正则表达式返回窗口列表

WebDriver toFrame(String nameOrId)

将driver切换到指定的Frame或iframe中。nameOrId,指定Frame或iframe的name或者id。

WebDriver toFrame(int idx)

将driver切换到指定的Frame或iframe中。idx是Frame或iframe的索引,索引从0开始

Alert toAlert()

将driver切换到指定的Alert。

LinkedHashSet<String> windows()

返回所有窗口列表

WebDriver toMainFrame()

将driver切换到最后一个主窗口。

Set<String> contexts()

返回所有的contexts。

AppiumDriver toContext(String name)

将driver切换到指定的context。

AppiumDriver toFirstContext()

将driver切换到第一个context。

AppiumDriver toLastContext()

将driver切换到最后一个context。

9.8.7. ProxyHelper

代理类,可以开启代理服务,也可指定上由代理。

属性
主要方法
方法 说明

ProxyHelper createServer(boolean trustAllServers=true,String upstream_endpoint=null)

创建代理服务器。trustAllServers为true,则表示相信上游所有证书包括不受信任的,如果为false,则表示只相信上游受信任的证书。upstream_endpoint上游代理地址,支持http(s),以及socks协议,格式就是:"<protoType>://<ip>:<port>",如:"socks://localhost:1080"。如果需要在过程中动态切换上游代理,那么需要在此处先设置上游代理。

ProxyHelper start(int port=0)

启动代理服务器,如果port为0,则会随机启动一个端口号

Object get()

返回真正代理服务器对象。

ProxyHelper change(String upstream_endpoint)

切换上游代理,支持http(s),socks协议。

def relayTo(String remoteProxy,String remoteProxyUpstream)

切换远程中继代理上游代理,remoteProxy远程代理地址,remoteProxyUpstream要切换的上游代理地址。

ProxyHelper addFilter(Function client2Proxy=null,Function proxy2Server=null,Function server2proxy=null,Function proxy2client=null)

添加拦截。

client2Proxy,客户端到代理端 proxy2Server,代理端到服务器端 server2proxy,服务器端到代理端 proxy2client,代理端到客户端

def enableHar(String…​ types)

使har哪些类型被记录,分别有 REQUEST_HEADERS、REQUEST_COOKIES、REQUEST_CONTENT、 REQUEST_BINARY_CONTENT、RESPONSE_HEADERS、RESPONSE_COOKIES、RESPONSE_CONTENT、RESPONSE_BINARY_CONTENT

def disableHar(String…​ types)

使har哪些类型被禁止记录。

ProxyHelper har( BiFunction<List<HarPage>,List<HarEntry>,Void> func)

接受记录内容。参数接受函数,该函数将有两个参数,一个 [_HarPage] 类型,一个是 [_HarEntry] 类型。

ProxydbHelper db(String tag)

返回 ProxydbHelper 代理数据库对象。tag是标签,该标签使用是可以随意命名的。

ProxydbHelper db(String tag,String criteria)

返回 ProxydbHelper 代理数据库对象。 tag是标签,该标签使用是可以随意命名的。criteria是查询条件,条件字段可以见 代理地址属性 (注:但不可用url属性),比如"country='CN'",则返回代理区域为CN的代理数据库。

HarPage
属性
字段 类型 说明

id

String

id

title

String

标题

startedDateTime

Date

请求开始时间

comment

Map

评论

HarEntry
属性
字段 类型 说明

pageref

String

页引用

request

HarRequest

请求对象

response

HarResponse

响应对象

serverIPAddress

HarResponse

服务器IP地址

startedDateTime

Date

请求开始时间

comment

Map

评论

HarRequest

请求对象

属性
字段 类型 说明

method

String

请求方法

url

String

请求地址

httpVersion

String

http版本

cookies

HarCookie

cookie信息

headers

List<Map>

头部信息

queryString

List<Map>

查询字符串

comment

Map

评论

HarResponse

响应对象

属性
字段 类型 说明

status

int

响应状态

statusText

String

响应文本

cookies

List<HarCookie>

cookie信息

headers

List<Map>

header信息

comment

Map

评论

HarCookie

Cookie信息

属性
字段 类型 说明

name

String

名称

value

String

path

String

路径

domain

String

expires

Date

过期时间

9.8.8. ProxydbHelper

代理类,可以开启代理服务,也可指定上由代理。

属性
主要方法

方法

说明

Map next()

返回下一个代理地址,具体内容见 代理地址属性

Map first()

返回第一个代理地址,具体内容见 代理地址属性

Map last()

返回上一个使用过的代理地址,如果没有,则返回第一个代理地址。具体返回内容见 代理地址属性

def reset()

重置使用过的代理地址

add(Map map)

添加新代理地址,具体参数见 代理地址属性

代理地址属性
字段 类型 说明

ip

String

IP地址

port

int

端口号

type

String

类型,类型可能有三种值:http,https,socks。

anon

Integer

是否匿名,0 不匿名,1匿名

region

String

区域

city

String

城市

speed

int

速度,单位:毫秒

succ_num

int

成功数量

req_num

int

请求次数

last_req

int

最近请求结果,0失败 1成功

succ_rate

float

请求成功概率

status

int

状态 0不可用1可用

last_updated

Date

更新时间

date_created

Date

创建时间

url

String

代理地址,只读属性

9.8.9. SelectHelper

选择器类,专门用于选择网页,以及手机app里的元素。

属性

length: 返回选择器当前选中的元素个数,该属性为只读。

主要方法
方法 说明

SelectHelper bind(WebElement element)

绑定元素。

SelectHelper binds(List<WebElement> element)

绑定一批元素

SelectHelper id(String id)

通过id属性查找元素,在移动端是指resource-id属性。

SelectHelper name(String id)

通过name属性查找元素

SelectHelper css(String cssSelector)

使用CSS查找元素

SelectHelper xpath(String xpath)

使用XPath查找元素

SelectHelper link(String text,boolean isPartial=true);

使用链接文本查找链接元素,如果isPartial为true,则是指定含有text的链接,否则则是指链接文本是text的元素。默读为true。

SelectHelper ui(String uiSelectorText)

使用安桌UiSelector方式来查找元素。使用时可以将“new UiSelector().”转换成$,可用方法详细见 UiSelector 类。

SelectHelper $(String cssSelector)

使用Jsoup来查找元素。 请见 Element

SelectHelper $()

转换为Jsoup元素。 请见 Element

int size()

返回选择器当前选中的元素个数

List<WebElement> get()

返回选择器当前选中的元素列表。

WebElement get(int idx)

返回选择器当前选中元素列表指定索引为idx的元素。

String html()

返回选择元素的HTML内容

String text()

返回元素指定的文本。

SelectHelper click()

点击选择的元素。

SelectHelper sendKeys(CharSequence…​ keysToSend)

向选中的元素,敲入文本keysToSend。

Actions actions()

返回操作 Actions ,模拟复杂的用户操作,用于替代键盘和鼠标事件。

boolean selectByText(String text)

以选项文本的方法选中下拉框。如果返回false,表示未选中,如果返回true,则表示选中。

boolean selectByIndex(int idx)

以选项索引下标的方法选中下拉框。如果返回false,表示未选中,如果返回true,则表示选中。

boolean selectByValue(String val)

以选项的value值选中下拉框。如果返回false,表示未选中,如果返回true,则表示选中。

SelectHelper scrollIntoView(boolean alignTop=true)

将选中的元素滚动到可视范围内。alignTop为true表示元素上边缘出现即可,为false时则表示元素下边缘出现即可。只能用于Web或者WebView。

boolean isVisibleInView()

判断选中元素是否在可视范围内,如果是返回true,否则返回false。只能用于Web或者WebView。

boolean isDisplayed()

判断选中的元素是否显示。

Point getCenter()

返回元素的中心点。

TouchAction touch()

返回Touch动作 TouchAction ,该方法只用用于移动端App。

MultiTouchAction multiTouch()

返回多点Touch动作 MultiTouchAction ,该方法只用用于移动端App。

9.8.10. Actions

该类用于模拟复杂的用户操作,用于替代键盘和鼠标事件。详细也可见其 官网文档

属性
主要方法
方法 说明

Actions keyDown(CharSequence key)

添加指定字符键按下动作。key是有关SHIFT,ALT,CONTROL的字符,可以使用$key('SHIFT')来使用,详见 Keys 类。

Actions keyDown(WebElement target, CharSequence key)

添加指定字符键在目标元素按下动作。key是有关SHIFT,ALT,CONTROL的字符,可以使用$key('SHIFT')来使用,详见 Keys 类。

Actions keyUp(CharSequence key)

添加指定字符键抬起动作。key是有关SHIFT,ALT,CONTROL的字符,可以使用$key('SHIFT')来使用,详见 Keys 类。

Actions keyUp(WebElement target, CharSequence key)

添加指定字符键在目标元素抬起动作。key是有关SHIFT,ALT,CONTROL的字符,可以使用$key('SHIFT')来使用,详见 Keys 类。

Actions sendKeys(CharSequence…​ keys)

发送指定按键。

Actions sendKeys(WebElement target, CharSequence…​ keys)

向目标元素发送指定按键。

Actions clickAndHold(WebElement target)

移动鼠标到目标元素,并点击和持有。

Actions clickAndHold()

用鼠标点击并持有

Actions release(WebElement target)

在目标元素上释放鼠标。

Actions release()

释放鼠标

Actions click(WebElement target)

点击目标元素

Actions click()

点击元素

Actions doubleClick(WebElement target)

双击目标元素

Actions doubleClick()

双击

Actions moveToElement(WebElement target)

移动到目标元素

Actions moveToElement(WebElement target, int xOffset, int yOffset)

移动到目标元素,并相对目标元素左上角偏移位置。xOffset—​x轴相对偏移,yOffset—​y轴相对偏移

Actions moveByOffset(int xOffset, int yOffset)

移动鼠标偏移距离

Actions contextClick(WebElement target)

右键单击目标元素

Actions contextClick()

右键单击

Actions dragAndDrop(WebElement source, WebElement target)

拖动元素source到目标元素target

Actions dragAndDropBy(WebElement source, int xOffset, int yOffset)

拖动元素source到指定偏移距离xOffset和yOffset

Actions pause(long pause)

停留pause毫秒。

Action build()

合并动作,用于执行。

void perform()

执行动作。

9.8.11. Keys

是有关键盘按键的类。在GoldData中使用如$key('SHIFT')方式来引用。

属性

NULL,CANCEL,HELP,BACK_SPACE,TAB,CLEAR,RETURN,ENTER,SHIFT,LEFT_SHIFT,CONTROL,LEFT_CONTROL,ALT,LEFT_ALT,PAUSE,ESCAPE,SPACE,PAGE_UP,PAGE_DOWN,END,HOME,LEFT,ARROW_LEFT,UP,ARROW_UP,RIGHT,ARROW_RIGHT,DOWN,ARROW_DOWN,INSERT,DELETE,SEMICOLON,EQUALS,NUMPAD0,NUMPAD1,NUMPAD2,NUMPAD3,NUMPAD4,NUMPAD5,NUMPAD6,NUMPAD7,NUMPAD8,NUMPAD9,MULTIPLY,ADD,SEPARATOR,SUBTRACT,DECIMAL,DIVIDE,F1,F2,F3,F4,F5,F6,F7,F8,F9,F10,F11,F12,META,COMMAND,ZENKAKU_HANKAKU,

主要方法

方法

说明

static String chord(CharSequence…​ value)

多个健被同时按下的健

9.8.12. UiSelector

移动安桌UiSelector 选择类。具体也可见其 官网

使用方法:

在GoldData仿真脚本中,可以不用使用全名来访问这个选择器,例如:

$ui('new UiSelector().text("Search")')

可以简化成:

$ui('$text("Search")')

以下所有方法都可以通过将“new UiSelector().”,替换成 “$”来访问。

属性
主要方法

方法

说明

UiSelector checkable(boolean val)

设置搜索条件为可选择的元素。

UiSelector checked(boolean val)

设置搜索条件为被当前选中的元素

UiSelector childSelector(UiSelector selector)

添加一个子选择搜索条件

UiSelector className(String className)

设置搜索条件为匹配class属性的元素(例如,“android.widget.Button”)。

UiSelector classNameMatches(String regex)

设置搜索条件为正则表达式匹配class属性的元素

UiSelector clickable(boolean val)

设置搜索条件为可点击的元素。

UiSelector description(String desc)

设置搜索条件为匹配content-description属性的元素。

UiSelector descriptionMatches(String regex)

设置搜索条件为正则匹配content-description属性的元素。

UiSelector descriptionStartsWith(String desc)

设置搜索条件为开头匹配content-description属性的元素。

UiSelector enabled(boolean val)

设置搜索条件为可用(enabled)的元素。

UiSelector focusable(boolean val)

设置搜索条件为可聚焦的元素。

UiSelector focusable(boolean val)

设置搜索条件为当前聚焦的元素。

UiSelector fromParent(UiSelector selector)

添加子搜索条件到当前。此搜索条件从父元素开始搜索。

UiSelector index(int index)

设置搜索条件为匹配指定索引的元素。

UiSelector instance(int instance)

设置搜索条件为匹配指定索引的实例元素。

UiSelector longClickable(boolean val)

设置搜索条件为可长点击的元素。

UiSelector resourceId(String id)

设置搜索条件匹配resource ID的元素。

UiSelector resourceIdMatches(String regex)

设置搜索条件正则匹配resource ID的元素

UiSelector scrollable(boolean val)

设置搜索条件为可滚动的元素。

UiSelector selected(boolean val)

设置搜索条件为当前选中的元素。

UiSelector text(String text)

设置搜索条件为当前显示文本为text的元素。

UiSelector textContains(String text)

设置搜索条件为当前显示文本包含text的元素。

UiSelector textMatches(String regex)

设置搜索条件为当前显示文本正则匹配的元素。

UiSelector textStartsWith(String text)

设置搜索条件为当前显示文本以text开头的元素。

9.8.13. TouchAction

该类用于模拟复杂的移动安卓触碰动作。详细也可见其 官网文档

在GoldData中,使用方法如下:

var digit8=$ui('$resourceIdMatches(".*digit8")').get(0)
$touch().tap(digit8).perform()
属性
主要方法

方法

说明

TouchAction press(WebElement el)

在指定元素的中心位置按下

TouchAction press(int x, int y)

在屏幕的绝对位置(x,y)按下

TouchAction press(WebElement el, int x, int y)

在相对指定的元素位置(x,y)按下

TouchAction release()

释放动作(比如按下的动作)

TouchAction moveTo(WebElement el)

移动touch动作到指定的元素

TouchAction moveTo(int x, int y)

移动touch动作相对屏幕位置(x,y)

TouchAction moveTo(WebElement el, int x, int y)

移动touch动作相对指定元素位置(x,y)

TouchAction tap(WebElement el)

触碰指定元素el

TouchAction tap(int x, int y)

触碰在相对屏幕位置(x,y)

TouchAction tap(WebElement el, int x, int y)

触碰在相对指定元素位置(x,y)

TouchAction waitAction(int ms)

等待ms毫秒

TouchAction longPress(WebElement el)

长按指定元素

TouchAction longPress(WebElement el, int duration)

长按指定元素 duration毫秒

TouchAction longPress(int x, int y)

长按在相对屏幕位置(x,y)

TouchAction longPress(WebElement el, int x, int y)

长按在相对指定元素位置(x,y)

TouchAction perform()

执行元素动作

9.8.14. MultiTouchAction

该类用于模拟复杂的移动安卓多点触碰动作。详细也可见其 官网文档

在GoldData中,使用方法如下:

var action1=$touch().press(10,10).moveTo(10,100).release();
var action2=$touch().press(20,20).moveTo(20,200).release();
$multiTouch().add(action1).add(action2).perform()
属性
主要方法

方法

说明

MultiTouchAction add(TouchAction action)

添加touch动作

MultiTouchAction perform()

执行动作

9.8.15. ScrollHelper

滚动器类,专门用于Web及WebView 。

属性
主要方法
方法 说明

ScrollHelper hscroll(int xstep=100,Function isTrue)

当函数Function 条件为真时,横向滚动,直到条件为false。

ScrollHelper vscroll(int ystep=100,Function isTrue)

当函数Function 条件为真时,纵向滚动,直到条件为false。

ScrollHelper scrollIntoView(WebElement element,boolean alignTop=true)

将指定元素滚动到可视范围内。alignTop为true表示元素上边缘在可视范围即可,当为false时,表示下边缘。

ScrollHelper scroll(int xstep, int ystep, Function isTrue)

当函数Function 条件为真时执行滚动,同时横向、纵向滚动,直到条件为false。函数还将接收参数,有关当前滚动的距离{x,y}

ScrollHelper scrollBy(int xOffset,int yOffset)

同时横向、纵向滚动偏移量(xOffset,yOffset)

ScrollHelper scrollTo(int x,int y)

同时横向、纵向滚动到位置(x,y)

导航类。

属性
主要方法
方法 说明

NavigateHelper back()

执行退回动作

NavigateHelper forward()

执行向前动作。

9.8.17. SwipeHelper

该类主要提供移动APP刷屏动作。

属性
主要方法
方法 说明

SwipeHelper swipeRL(double x1=0.90,double y1=0.5,double x2=0.10,double y2=0.5)

从右向左刷。

SwipeHelper swipeLR(double x1=0.3,double y1=0.5,double x2=0.66,double y2=0.5)

从左向右刷。

SwipeHelper scrollDown(int x=5,double y1=0.33,double y2=0.66)

从上往下滚动

SwipeHelper scrollUp(int x=5,double y1=0.66,double y2=0.33)

从下往上滚动

SwipeHelper scrollDown(int x=5,double y1=0.33,double y2=0.66,Function isTrue)

从上往下滚动,直到条件不为真时。

SwipeHelper scrollUp(int x=5,double y1=0.66,double y2=0.33,Function isTrue)

从下往上滚动,直到条件不为真时。

9.8.18. KwHelper

该类主要提供关键词管理功能。包括关键词获取、添加、删除、提交等功能。

属性
主要方法
方法 说明

int resume()

修复上次未抓取完毕的关键词

int reset(List<String> kwList)

将关键词设置为未抓取

int resetAll()

将所有关键词设置为未抓取

int size()

统计关键词数量

int add(String kw)

添加关键词

int add(List<String> kwList)

添加关键词

int del(String kw)

删除关键词

int del(List<String> kwList)

删除关键词列表

int delAll()

删除所有关键词

String next()

下一个关键词

boolean submit(String kw)

提交关键词。 返回false时表示失败,为true时为成功。

9.8.19. DatasetHelper

该类主要提供数据集存取功能。包括添加、获取等功能。

属性
主要方法
方法 说明

void add(Map item)

添加数据集

void add(List<Map> list)

添加数据集列表

Map get(String sn)

根据数据集sn,获取数据集字段

9.8.20. HrefHelper

该类主要提供链接存取功能。包括添加等功能。

属性
主要方法
方法 说明

void add(String href)

添加链接。如果系统已有的链接,将不会重复存储

void add(List<String> hrefs)

添加链接列表。如果系统已有的链接,将不会重复存储

9.8.21. WindowHelper

该类主要提供窗口放大、全屏功能等。

属性
主要方法
方法 说明

WindowHelper max()

窗口最大化

WindowHelper full()

窗口全屏

WindowHelper setLocation(int x,int y)

设置窗口位置

WindowHelper setSize(int w,int h)

设置窗口大小

int getLocation()

获取窗口位置

int[] getSize()

获取窗口大小

9.8.22. JavaAuto

属性
主要方法
方法 说明

JavaAuto setSpeed(double spd)

设置鼠标和键盘控制速度。其值必须在0.00~1.00之间

JavaAuto send(String str)

敲入内容str。

JavaAuto keyDown(String str)

按键按下,特殊键可以以大括号代替,如 {CTRL}

JavaAuto keyUp(String str)

按键抬起,特殊键可以以大括号代替,如 {CTRL}

JavaAuto keyPress(String str)

按键按下抬起,相当于 keyDown 然后keyUp。

JavaAuto keyCombo(String…​ keys)

键联合按,例如"Ctrl+Alt+Delete",这些键必须以多个参数出现。

JavaAuto mouseMove(int xFinal, int yFinal)

鼠标移动xFinal,yFinal处

JavaAuto mouseClick(String button, int x, int y)

鼠标点击。button可以是"left","right","middle"下的其中一个。 x与y表是点击的坐标的x,y值 。

JavaAuto mouseDown(String button)

鼠标按下,button同上。

JavaAuto mouseUp(String button)

鼠标抬起,button同上。

JavaAuto mouseClickDrag(String button, int x1, int y1, int x2, int y2)

鼠标按下拖曳,从(x1,y1)到(x2,y2)处。

JavaAuto mouseScrollUp()

鼠标向上滚动

JavaAuto mouseScrollDown()

鼠标向下滚动

byte[] screenshot()

截屏

byte[] screenshot(int x1, int y1, int x2, int y2)

截屏

boolean open(String path)

打开程序

int[] cursorGetPos()

得到当前鼠标位置

int pixelGetColor(int x, int y)

得到指定位置(x,y)的颜色值

int[] intGetRGB(int i)

根据颜色值,得到R、G、B值

int[] pixelSearch(int colorInt, int x1, int y1, int x2, int y2,int speed)

在指定区域搜索指定颜色值,返回第一个位置。如果未找到将返回[-1,-1]值 。

int[] pixelSearch(int colorInt)

整个屏幕搜索指定颜色值。

9.8.23. AutoItX

属性
常量

SW_MAXIMIZE SW_HIDE SW_RESTORE SW_SHOW SW_SHOWDEFAULT SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWMINNOACTIVE SW_SHOWNA SW_SHOWNOACTIVATE SW_SHOWNORMAL OPT_CARET_COORD_MODE OPT_MOUSE_CLICK_DELAY OPT_MOUSE_CLICK_DOWN_DELAY OPT_MOUSE_CLICK_DRAG_DELAY OPT_MOUSE_COORD_MODE OPT_PIXEL_COORD_MODE OPT_SEND_ATTACH_MODE OPT_SEND_CAPSLOCK_MODE OPT_SEND_KEY_DELAY OPT_SEND_KEY_DOWN_DELAY OPT_WIN_DETECT_HIDDEN_TEXT OPT_WIN_SEARCH_CHILDREN OPT_WIN_TEXT_MATCH_MODE OPT_WIN_TITLE_MATCH_MODE OPT_WIN_WAIT_DELAY

主要方法
方法 说明

String clipGet()

获取剪切板内容

AutoItX clipPut(String value)

设置剪切板内容

AutoItX send(String keys)

向激活的窗口敲入内容

AutoItX mouseClick(String button, int clicks, int speed)

鼠标点击,button值可以是left,right,middle

AutoItX mouseClickDrag(String button, int x, int y, int x2, int y2, int speed)

鼠标点击拖曳

AutoItX mouseDown(String button)

鼠标按下,button值可以是left,right,middle

boolean mouseMove(int x, int y, int speed)

鼠标移动到(x,y),speed为速度,值范围0~100

AutoItX mouseUp(String button)

鼠标抬起

int run(String filename)

运行指定程序

int run(String filename, String workingDirectory, int flag)

运行指定程序。flag参数可以通过常量和$ATX函数来引用,例如:run('notepad.exe','c://',$ATX('SW_RESTORE'));

boolean controlClick(String title, String text, String controlID, String button, int clicks, int x, int y)

点击控件

boolean controlClick(String title, String text, String controlID)

点击控件

AutoItX controlCommandShowDropdown(String title, String text, String control)

显示控件下拉

AutoItX controlCommandHideDropDown(String title, String text, String control)

隐藏控件下拉

AutoItX controlCommandCheck(String title, String text, String control)

选中控件

AutoItX controlCommandUncheck(String title, String text, String control)

取消选中控件

AutoItX controlCommandEditPaste(String title, String text, String control, String string)

在光标处粘贴内容

boolean controlCommandIsVisible(String title, String text, String control)

指定控件是否可视

boolean controlCommandIsChecked(String title, String text, String control)

指定控件是否选中

boolean controlCommandIsEnabled(String title, String text, String control)

指定控件是否可用

AutoItX controlCommandTabLeft(String title, String text, String control)

切换到下一个tab页

AutoItX controlCommandTabRight(String title, String text, String control)

切换到上一个标签

boolean controlDisable(String title, String text, String control)

设置控件失效

boolean controlEnable(String title, String text, String control)

设置控件有效

boolean controlFocus(String title, String text, String control)

设置控件聚焦

String controlGetHandle(String title, String text, String controlID)

获取控件内部句柄

AutoItX winActivate(String title, String text)

激活窗口

AutoItX winActivate(String title)

激活窗口

AutoItX winClose(String title, String text)

关闭窗口

AutoItX winClose(String title)

关闭窗口

boolean winWaitActive(String title, String text, int timeout)

等待窗口激活,timeout单位为秒

boolean winWaitActive(String title, String text)

等待窗口激活

9.9. JSOUP对象

9.9.1. Element

属性
主要方法
方法 说明

String text​()

返回当前元素以及子元素的文本。空白将会消除。 例如:给定HTML内容“<p>Hello <b>there</b> now! </p>, ”, p.text() 将返回"Hello there now!"

String wholeText()

返回当前元素以及子元素的文本。并且保留空白和换行。

String ownText()

返回仅当前元素的文本。

String val()

返回表单元素(input,textarea等)的值。

String html​()

返回当前元素(input,textarea等)的内部HTML内容。

String outerHtml​()

返回当前元素(input,textarea等)的外层HTML内容。

String attr​(String attributeKey)

返回当前元素attributeKey属性值. 如果想从相对URL中获得绝对URL,可以给属性加上"abs"前缀。例如: var url=a.attr("abs:href")

Elements select(String cssQuery)

查询返回匹配cssQuery的元素。例如:

el.select("a[href]") - 将返回所有链接(带有href属性的所有a标签)

el.select("a[href]") - 将返回所有链接(带有href属性的所有a标签)

Element selectFirst(String cssQuery)

查询返回匹配cssQuery的第一个元素。

boolean is(String cssQuery)

检测当前元素是否匹配cssQuery查询。

boolean hasAttr​(String attributeKey)

检测当前元素是否有attributeKey属性。

boolean hasClass​(String className)

检测当前元素是否含有className。

Elements siblingElements​()

返回兄弟节点元素。

Element nextElementSibling​()

返回下一个兄弟节点元素。

Element previousElementSibling​()

返回上一个兄弟节点元素。

int elementSiblingIndex​()

返回当前元素在兄弟节点列表中的列表索引。例如,如果是第一个元素,则返回0

Element lastElementSibling​()

返回当前元素的最后一个兄弟节点元素

更多属性和方法请参考: JSoup Element

9.9.2. Document

继承 Element对象。

属性
主要方法
方法 说明

Element body()

返回HTML内容的body元素对象。

Elements select(String cssQuery)

查询返回匹配cssQuery的元素。