CrawlScript API


全局函数

CrawlScript具有一些可全局使用的函数。

1.print(object):object可以是任何对象,print(object)会显示object的toString()函数返回的结果。

2.uid():返回一个读一无二的字符串,常用于生成独一无二的文件名.

3.write(filepath,string):向路径为filepath的文件的末尾,写入string字符串.如果filepath对应的文件不存在,会自动新建文件,但必须保证文件所在的文件夹存在.

4.load(filepath):运行文件路径为filepath的脚本文件.

ECMA

CrawlScript是在ECMA标准的基础上设计的语言,是一种javascript,在语法上和网页开发中使用的javascript完全相同,但是并不支持网页开发中所特有的函数和对象,如document、alert()在CrawlScript中会失效.CrawlScript有自己的一套特有的函数和对象,详细请看下面的API.

$

$是CrawlScript最核心的一个对象,它封装了爬虫常用一些方法,为了简化操作,$也可以当一个函数使用.

$(url)

根据网页的url获取一个网页的DOM树(树根).


实例-显示网页的所有文字:
doc=$("http://www.baidu.com");
print(doc);

$(url,httpconfig)

根据网页的url和指定的配置httpconfig获取一个网页的DOM树(树根).

http是一个对象,有两种定义的方式:

1.用JSON定义:
httpconfig={"ip":"127.0.0.1","port":8087} 这里表示配置http请求的代理为("127.0.0.1",8087).

2.直接定义:
httpconfig=new Object();
httpconfig.ip="127.0.0.1";
httpconfig.port="8087";
httpconfig.agent="windows";
这里表示配置http请求的代理为("127.0.0.1",8087),并设置客户端为windows浏览器

DOM对象

CrawlScript中有4中DOM对象:文本元素(叶子节点),非文本元素(非叶子节点),网页(本质是非文本元素,DOM树的树根,具有一定的扩展功能),元素集合.为了简化操作,我们在脚本中使用这四种元素不做太大区分,微小的区分在后面的API中会描述

DOM对象最初都是由$(url)函数返回的,执行doc=$(url),doc为整个网页DOM树的树根(最顶层的非文本元素),执行doc.select(selector),doc.div(),doc.a()等函数,可以根据条件获得doc的子集.详细用法请看下面的API,下文中用doc代表一个已经生成的DOM对象.

doc.type()

返回当前DOM元素的类型:text(文本),element(非文本元素),document(网页),elements(element的集合).

doc.select(selector)

根据选择器selector返回doc中符合选择器条件的DOM元素集合。除了text类型的DOM元素之外,都可以使用.

selector是一个字符串,对DOM元素进行条件限制,例如"div>p"表示DOM元素是div里的p元素,"a[id=link]"表示DOM元素是id=link的a元素,CrawlScript中的selector和Jsoup中的selector完全等价,详细请看selector说明书.


实例-显示网页中所有超链接的链接的文本:
doc = $("http://www.baidu.com");
print(doc.select("a"));

doc.each(selector,func)

在一个DOM元素(非文本元素或者元素集合)doc中根据selector选择出满足条件的元素,将每个元素作为函数func的参数,执行func函数.func函数形式为function(element).除了text类型的DOM元素之外,都可以使用.


实例-显示网页中所有超链接的链接:
doc = $("http://www.baidu.com");
func = function( e ){
  print(e.attr( "href" ));
}
doc.each("a" , func);

doc.traverse(func)

在一个DOM元素(非文本元素)doc中按照后序遍历的顺序,分别以每个节点作为函数func的参数,执行func函数.func函数形式为function(node,type),type表示node的类型,type=0表示node是文本节点,type=1表示node是非文本节点.此方法使用于非文本元素(包括网页),即使用于element和document元素.

doc.div() doc.div(index)

doc.div()返回doc中所有的div元素组成的集合(elements类型),doc.div(index)表示由doc中第index个div元素(element类型)。此方法对element(document)和elements类型的元素适用.

还有一些类似的函数,下面API中不详细说明。doc.a(),doc.a(index),doc.ul(),doc.ul(index)......

由于doc.div()的返回值是element或elements,所以此类函数经常连续着使用,如:doc.div().p().a()

doc.size()

返回DOM元素集合doc中元素的数量.此方法只使用于元素集合(elements类型).