在枚举(也可以叫列举)采集器的内建函数之前,先看下inc关键字,在供应,求购,商城等模块中均有此关键字,该关键字的作用在于加载外部的脚本文件,例如,在"Module/供应模块规则.zl"...
在枚举(也可以叫列举)采集器的内建函数之前,先看下inc关键字,在供应,求购,商城等模块中均有此关键字,该关键字的作用在于加载外部的脚本文件,例如,在"Module/供应模块规则.zl"中,开头的代码为:
inc 'sell_inc.zl';
................... //省略后面的代码
第一句通过inc来加载同一目录下的sell_inc.zl脚本文件,该脚本文件中定义了供应模块的各种采集相关的正则表达式规则,以及各种捕获采集字段的函数,例如:
................... //省略后面的代码
sell_title_pattern = '<title>([^<]+)</title>'; //内容页标题的规则
................... //省略后面的代码
fun sell_get_title() //从抓取的网页中获取标题字段
................... //省略后面的代码
return bltTrim(title); //返回标题,bltTrim内建函数在后面会提到,是用来去除字符串首尾空格的。
................... //省略后面的代码
endfun
................... //省略后面的代码
在sell_inc.zl中定义了sell_get_title函数后,在供应模块规则.zl中就只需直接调用sell_get_title函数即可:
................... //省略后面的代码
title = sell_get_title(); //匹配标题
................... //省略后面的代码
之所以将sell_get_title等函数定义在sell_inc.zl外部脚本中,是因为在其他的商城,团购等模块中也可以通过inc关键字来加载该脚本,也就可以调用其中的函数直接获取到标题等采集字段,从而实现了代码的重利用。
OK,言归正传,下面来看下内建函数,到目前v1.0.4版本为止一共有51个内建函数,这些内建函数大部分都是该采集器内部自定义的,除了少数几个如array数组函数外,其余的都是为了将zengl语法嵌入到采集器中额外添加的,在正式的zengl编程语言里是不存在这些函数的。
下面是内建函数的枚举加简要说明(这里为了方便说明,引入几个说明 类型:string代表字符串类型,int代表整数类型,float代表含有小数点的浮点类型,mix代表任意类型,arraytype代表数组类型,ref代表变量引用,但是在脚本中实际上是不存在这样的类型定义的,原因在前面的脚本语法中已经提到过,另外函数的参数名称可以在脚本中任意定义):
1) printf(string str,int color):第一个参数str表示要进行显示输出的字符串,第二个参数color是输出到日志面板的颜色,0表示黑色,1表示红色,2表示绿色。(在正式版的zengl编程语言中,printf只有一个参数,并且是输出到命令行的)
2) read():此内建函数在采集器中暂无作用,请勿使用,只是正式版本的zengl编程语言里在命令行下用于获取用户输入用的(不排除以后会对其进行修改,让其能用在采集器中,如弹出一个输入框,让用户输入数据等)。
3) bltRandom():该函数返回一个随机的大于等于0的整数,用法,例如在采集脚本中可以生成随机的文章浏览次数等:bltRandom()%1000 + 200生成一个200到1200之间的随机整数,在正式版的zengl中也有此函数,用法一致。
4) array(mix arg1 , mix arg2 , mix arg3 , ......):初始化数组函数,初始化一个数组,并使用提供的参数作为数组的成员,成员可以是任意类型如字符串,整数,浮点数,或者一个数组,或变量引用。和正式版中的用法一致。
5) bltGetUIntStr(int arg):将整数参数转为无符号整数的字符串形式如bltGetUIntStr(-1)返回的就是字符串'4294967295'和正式版中用法一致。
6) bltIntToStr(int arg1,int arg2,string arg3):将整数转为字符串的形式,例如bltIntToStr(25,5,'0')那么函数返回的结果就是字符串'00025',因为第二个参数5是指总宽度,第一个参数25的宽度只有2,小于5,所以左边会以第三个参数'0'补齐。和正式版中用法一致。
7) bltConvToInt(string | int | float arg):将参数转为整数形式,参数可以是字符串,浮点数或整数,和正式版中用法一致。
8) bltCurlGetUrl(string arg):利用curl抓取arg参数指向的网址的网页内容。参数arg为字符串类型,表示要抓取的页面的URL网址,该函数返回的是抓取的页面内容(页面内容属于字符串类型)。属于采集器专有内建函数(在正式版zengl编程语言中暂没加入)。
9) bltGetKeyWords(arraytype keywords,arraytype mustwords):获取当前采集分类的关键词信息,前面章节已经多次提到过,第一个参数keywords为数组类型,用于存放所有的关键词信息,第二个参数也是数组类型,用于存放关键词对应的必须包含词。该函数返回值为关键词的总个数,属于采集器专有内建函数。
10) bltCurlEncode(string arg):对字符串类型的参数进行URL编码,返回值为编码后的字符串,只有经过URL编码的字符串才能添加到url中进行进一步抓包工作,属于采集器专有内建函数。
11) bltRegexMatches(string pattern , int pattern_index , string content , arraytype results_array , int unique_Flag , int dotany_Flag): 捕获所有匹配正则表达式的内容,类似php的preg_match_all,参数pattern为正则表达式,参数pattern_index表示匹配第几个元组,参数content表示要进行匹配的内容,参数results_array数组中存放所有匹配的结果,参数unique_Flag判断是否需要对results_array数组进行唯一化处理,去除重复的元素,参数dotany_Flag用来表示规则中的小数点是否匹配包括换行符在内的所有符号。函数返回值为results_array数组的元素个数。至于pattern_index元组是正则表达式中的一个概念,请在搜索引擎中搜索正则表达式的相关资料。本函数属于采集器专有内建函数。
12) bltArrayInsertString(arraytype arg_array , string str , int pos):向数组中添加一个字符串。参数arg_array表示要进行操作的数组,参数str表示要插入到数组中的字符串,参数pos表示要插入的索引位置,0表示插入到开头,以此类推。函数返回值为插入元素后数组的新大小。本函数属于采集器专有内建函数。
13) bltRegexMatchFirst(string pattern , int pattern_index , string content , ref result , int dotany_Flag):匹配正则表达式,并将第一次匹配的结果存放到result引用的变量中,和bltRegexMatches的区别在于,bltRegexMatches会匹配所有的结果,而bltRegexMatchFirst只匹配第一次的结果。参数的含义请参考bltRegexMatches,需要注意的是result参数是一个变量的引用。该函数返回的值为第一次匹配的位置。返回-1表示匹配失败。本函数属于采集器专有内建函数。
14) bltRegexReplace(string pattern , string replace , string content , int dotany_Flag): 正则表达式替换函数,类似PHP的preg_replace,参数pattern表示要匹配的正则表达式,参数replace表示匹配后需要进行替换的字 符串,参数content表示要进行匹配和替换操作的内容,参数dotany_Flag表示正则表达式中的小数点是否匹配包括换行符在内的所有符号,函数返回值为匹配替换后的结果字符串。本函数属于采集器专有内建函数。
15) bltTrim(string arg):去除参数字符串的左右空格,类似PHP的trim,返回值为经过去除操作后的结果字符串。本函数属于采集器专有内建函数。
16) bltStrReplace(string arg1 , string replace , string content): 字符串替换函数,参数arg1表示要替换的部分,参数replace表示要替换的值,参数content表示要处理的字符串,返回值为经过替换后的字符串。 例如bltStrReplace('abc', 'hello','abc abc');得到的结果就是"hello hello"。本函数属于采集器专有内建函数。
17) bltCheckTitleMust(string title , string mustword):检测标题中是否包含必须词,参数title表示要进行检测的标题,参数mustword表示标题中必须包含的词,返回值1表示检测通过,返回0表示检测不通过,例如标题如果是"电梯安全知识",那么bltCheckTitleMust('电梯安全知识','安全')就会返回1,因为"电梯安全知识"里包含"安全"这个词,如果是bltCheckTitleMust('电梯安全知识','化妆')就会返回0,因为"电梯安全知识"里不包含"化妆"这个词。
另外该函数还支持"|"符号和"&"符号,例如:
电梯安全知识 检测 安全 通过
电梯安全知识 检测 化妆 不通过
电梯安全知识 检测 化妆|安全 通过(因为"|"表示或,即标题中如果包含化妆或安全则通过)
电梯安全知识 检测 化妆&安全 不通过(因为"&"表示且,即标题中必须既包含化妆又必须包含安全)
电梯安全知识 检测 电梯&安全&知识 通过 (因为标题中既包含电梯也包含安全还包含知识,所以检测通过)
电梯安全知识 检测 化妆|安全&电梯|服装 通过 (会先判断化妆|安全再判断电梯|服装最后再将两个结果进行&判断)
电梯安全知识 检测 化妆|安全&球鞋|服装 不通过 (因为球鞋|服装判断不通过,所以&判断时只要左右两边有一方没通过,那么整体上就没通过)
18) bltSqlTableExists(string table):在采集网站对应的sqlite本地数据库中查询某网站的某表是否存在,参数table是表名。返回值1表示存在,返回0表示不存在,本函数属于采集器专有内建函数。
19) bltSqlQuery(string sql):执行和数据库读取相关的查询sql语句,参数sql为要执行的数据库查询语句,例如bltSqlQuery('select * from article'),函数的返回值为1则表示执行成功,返回0表示执行失败,执行失败时,函数内部会自动将错误信息输出到日志面板中。本函数属于采集器专有内建函数。
20) bltSqlMoveToNext():执行完bltSqlQuery后,通过bltSqlMoveToNext来遍历结果集。返回1表示执行成功,返回0表示结果集游标已经到了末尾,即所有数据库结果都已经处理完了。本函数属于采集器专有内建函数。
21) bltSqlGetString(string colname):在执行完bltSqlQuery和bltSqlMoveToNext后,可以通过bltSqlGetString来获取当前游标指向的结果集记录中某列(或者说是某字段)的值,参数colname表示列名。返回值为该列的值的字符串格式。本函数属于采集器专有内建函数。
22) bltSqlRelease():在执行完bltSqlQuery后,系统会生成一个结果集,该结果集在用完后可以手动调用bltSqlRelease来进行释放,当然系统在稍后也会自动释放,不过手动释放属于立即释放,所以建议在查询完毕后,手动调用本函数释放一下,本函数属于采集器专有内建函数。
23) bltSqlExec(string sql):执行和数据库写入相关的sql语句,一些数据库的创建,插入,更新等写入数据库的操作,都可以使用bltSqlExec函数,前面的bltSqlQuery函数只能进行读取相关的操作。参数sql是要执行的语句,返回值1表示执行成功,返回0表示执行失败。本函数属于采集器专有内建函数。
24) bltSqlEscape(string str):将字符串进行sqlite格式的转义,参数str为要进行转义的字符串,只有经过转义后的字符串才不会破坏查询语句的执行。返回值为转义后的字符串。本函数属于采集器专有内建函数。
25) bltGetCatid():返回值为当前正在采集的分类ID,本函数属于采集器专有内建函数。
OK,本节先介绍这么多内建函数,下节继续,休息,休息一下,O(∩_∩)O~