抽取页面内容
gecco的内容抽取都是直接映射到java bean的属性中,利用注解可以方便的注入页面中的各种信息包括html页面内容、Ajax请求、javascript变量、request信息等
一、Html页面内容抽取
@HtmlField
html属性定义,表示该属性是通过html查找解析,在html的渲染器下使用
- cssPath:jquery风格的元素选择器,使用jsoup实现。jsoup在分析html方面提供了极大的便利。计划实现xpath风格的元素选择器。
@Href
表示该字段是一个链接类型的元素,jsoup会默认获取元素的href属性值。属性必须是String类型。
- value:默认获取href属性值,可以多选,按顺序查找
- click:表示是否点击打开,继续让爬虫抓取
@Image
表示该字段是一个图片类型的元素,jsoup会默认获取元素的src属性值。属性必须是String类型。
- value:默认获取src属性值,可以多选,按顺序查找
- download:表示是否需要将图片下载到本地(暂未实现)
@Attr
获取html元素的attribute。属性支持java基本类型的自动转换。
- value:表示属性名称
@Text
获取元素的text或者owntext。属性支持java基本类型的自动转换。
- own:是否获取owntext,默认为是
@Html
默认类型,可以不写,获取html元素的整个节点内容。属性必须是String类型。
二、页面中的Ajax请求
现在的页面通常都会有很多ajax请求,很多主题爬虫在针对这种请求一般是使用htmlunit等类似的渲染引擎,将页面所有的信息都渲染完毕后交给爬虫处理,gecco可以通过实现自定义的downloader类来实现类似的方式。不过该方式会对整个页面都进行渲染,效率较低,很多时候你可能只需要某一个ajax请求就可以了。gecco实现了模拟ajax请求的定义,如:
@Ajax(url="http://p.3.cn/prices/mgets?skuIds=J_{code}")
private JDPrice price;
上述代码通过ajax方式获得jd商品的价格,{code}表示request中的属性值,使用[...]可以引用已经解析出来的html页面中的属性值。全部代码可以参考源码中的src/test/java/com/geccocrawler/gecco/demo/ajax
三、json格式内容的抽取
有ajax请求涉及到json格式的内容抽取,gecco除了支持html的内容抽取,同时也支持json内容的抽取
@JSONPath
使用fastjson的jsonpath,jsonpath类似是一种对象查询语言,能方便的查询json中个字段的值,详情请查看fastjson-jsonpath
@JSONPath("$.p[0]")
private float price;
四、页面中的javascript变量抽取
gecco支持抽取页面中的javascript全局变量的内容抽取。
@JSVar
- var:表示变量名
- jsonpath:如果变量是json格式的数据,通过定义jsonpath抽取需要的内容,如果不是json格式的数据可以不填
五、request信息的注入
@Request
将httpRequest信息注入到java bean中。
@RequestParameter
将url中定义的变量注入到java bean中。