栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Gecco学习笔记(三)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Gecco学习笔记(三)

2021SC@SDUSC

简单说明一下Gecco中的公共注解说明

定义一个SpiderBean必须有的注解,告诉爬虫引擎什么样的url转换成该java bean,使用什么渲染器渲染,java bean渲染完成后传递给哪些管道过滤器继续处理

  • matchUrl:摒弃正则表达式的匹配方式,采用更容易理解的{value}方式,如:https://github.com/{user}/{project}。user和project变量将会在request中获取。
  • render:bean渲染类型,计划支持html、json、xml、rss
  • pipelines:bean渲染完成后,后续的管道过滤器

@Request

将请求的request注入到属性中,属性必须是HttpRequest类型。

@RequestParameter

将url中使用{}包围起来的变量注入到属性中,属性支持java基本类型的自动转换。 

  • value:url中的变量名

@FieldRenderName

属性的渲染有时会较复杂,不能用已有的注解描述,gecco爬虫支持属性渲染的自定义方式,自定义渲染器实现CustomFieldRender接口,并定义属性渲染器名称。

  • value:使用的自定义属性渲染器的名称

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

html页面上很多元素是通过ajax请求获取,gecco爬虫支持ajax请求。ajax请求会在html的基本元素渲染完成后调用,可以通过[value]获取当前已经渲染完成的属性值,通过{value}方式获取request的属性值。 

  • url:ajax请求地址,如:http://p.3.cn/prices/mgets?skuIds=J_[code]或者http://p.3.cn/prices/mgets?skuIds=J_{code}

JSON渲染器注解说明

json渲染器采用的fastjson。 ###@JSonPath 使用fastjson的jsonpath,jsonpath类似是一种对象查询语言,能方便的查询json中个字段的值,详情请查看fastjson-jsonpath

@JSonPath("$.p[0]")

private float price; 

Ajax例子

ajax例子请查看源码中的com.geccocrawler.gecco.demo.ajax。 

可扩展特性

一、Spider支持下载前后的自定义,实现接口BeforeDownload自定义下载前操作,实现接口AfterDownload自定义下载后操作,通过注解@SpiderName("com.geccocrawler.gecco.demo.MyGithub")关联到某个SpiderBean 

二、SpiderBean的属性渲染有时通过注解无法获取需要的数据,比如十分复杂的ajax请求,可以采用自定义属性渲染器的方式,实现接口CustomFieldRender,属性增加注解:@FieldRenderName("CustomFieldRenderName") 

三、结合spring开发pipeline 

实现SpringPipeLineFactory,例如:

@Service
  public class SpringPipelineFactory implements PipelineFactory, ApplicationContextAware {

  	private ApplicationContext applicationContext;

  	@Override
  	public void setApplicationContext(ApplicationContext applicationContext)
  			throws BeansException {
  		this.applicationContext = applicationContext;
  	}

  	@Override
  	public Pipeline getPipeline(String name) {
  		try {
  			Object bean = applicationContext.getBean(name);
  			if(bean instanceof Pipeline) {
  				return (Pipeline)bean;
  			}
  		} catch(NoSuchBeanDefinitionException ex) {
  			System.out.println("no such pipeline : " + name);
  		}
  		return null;
  	}
  }

并在GeccoEngine中设置

 @Resource(name="springPipelineFactory")
  private PipelineFactory springPipelineFactory;

  GeccoEngine.create().pipelineFactory(springPipelineFactory)...

在SpiderBean中引起SpringBean的pipeline的方式和之前没有区别

 @Service
  SpringPipeline impelments Pipeline...

  @Gecco(matchUrl="...", pipelines="springPipeline")
  TestSpiderBean implemnets HtmlBean...

 

 

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/362374.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号