文档章节

GECCO(易用的轻量化的网络爬虫)

xtuhcy
 xtuhcy
发布于 2016/01/05 17:34
字数 1854
阅读 767
收藏 1

GECCO(易用的轻量化的网络爬虫)

####初衷

现在开发应用已经离不开爬虫,网络信息浩如烟海,对互联网的信息加以利用是如今所有应用程序都必须要掌握的技术。了解过现在的一些爬虫软件,python语言编写的爬虫框架scrapy得到了较为广泛的应用。gecco的设计和架构受到了scrapy一些启发,结合java语言的特点,形成了如下软件框架。易用是gecco框架首要目标,只要有一些java开发基础,会写jquery的选择器,就能轻松配置爬虫。 ##结构图 架构图 ##基本构件介绍 ###GeccoEngine 是爬虫引擎,每个爬虫引擎最好独立进程,在分布式爬虫场景下,可以单独分配一台爬虫服务器。引擎包括Scheduler、Downloader、Spider、SpiderBeanFactory4个主要模块 ###Scheduler 需要下载的请求都放在这里管理,可以认为这里是一个队列,保存了所有待抓取的请求。系统默认采用FIFO的方式管理请求。 ###Downloader 下载器,负责将Scheduler里的请求下载下来,系统默认采用Unirest作为下载引擎。 ###Spider 一个爬虫引擎可以包含多个爬虫,每个爬虫可以认为是一个单独线程,爬虫会从Scheduler中获取需要待抓取的请求。爬虫的任务就是下载网页并渲染相应的JavaBean。 ###SpiderBeanFactory SpiderBean是爬虫渲染的JavaBean的统一接口类,所有Bean均继承该接口。SpiderBeanFactroy会根据请求的url地址,匹配相应的SpiderBean,同时生成该SpiderBean的上下文SpiderBeanContext. SpiderBeanContext包括需要该SpiderBean的渲染类(目前支持HTML、JSON两种Bean的渲染方式)、下载前处理类、下载后处理类以及渲染完成后对SpiderBean的后续处理Pipeline。

##Download

<dependency>
    <groupId>com.geccocrawler</groupId>
    <artifactId>gecco</artifactId>
    <version>1.0.1</version>
</dependency>

##QuikStart

###配置需要渲染的SpiderBean

@Gecco(matchUrl="https://github.com/{user}/{project}", pipelines="consolePipeline")
public class MyGithub implements HtmlBean {

	private static final long serialVersionUID = -7127412585200687225L;
	
	@RequestParameter("user")
	private String user;
	
	@RequestParameter("project")
	private String project;
	
	@HtmlField(cssPath=".repository-meta-content")
	private String title;
	
	@Text
	@HtmlField(cssPath=".pagehead-actions li:nth-child(2) .social-count")
	private int star;
	
	@Text
	@HtmlField(cssPath=".pagehead-actions li:nth-child(3) .social-count")
	private int fork;
	
	@HtmlField(cssPath=".entry-content")
	private String readme;

	public String getReadme() {
		return readme;
	}

	public void setReadme(String readme) {
		this.readme = readme;
	}

	public String getUser() {
		return user;
	}

	public void setUser(String user) {
		this.user = user;
	}

	public String getProject() {
		return project;
	}

	public void setProject(String project) {
		this.project = project;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public int getStar() {
		return star;
	}

	public void setStar(int star) {
		this.star = star;
	}

	public int getFork() {
		return fork;
	}

	public void setFork(int fork) {
		this.fork = fork;
	}
}

###启动爬虫引擎

public static void main(String[] args) {
	GeccoEngine.create()
	.classpath("com.geccocrawler.gecco.demo")
	//爬虫userAgent设置
	.userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.85 Safari/537.36")
	//开始抓取的页面地址
	.start("https://github.com/xtuhcy/gecco")
	//开启几个爬虫线程
	.thread(1)
	//单个爬虫每次抓取完一个请求后的间隔时间
	.interval(2000)
	.run();
}

##公共注解说明 ###@Gecco

定义一个SpiderBean必须有的注解,告诉爬虫引擎什么样的url转换成该java bean,使用什么渲染器渲染,java 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的属性值。

##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<? extends SpiderBean> getPipeline(String name) {
      		try {
      			Object bean = applicationContext.getBean(name);
      			if(bean instanceof Pipeline) {
      				return (Pipeline<? extends SpiderBean>)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...
    

© 著作权归作者所有

共有 人打赏支持
xtuhcy

xtuhcy

粉丝 105
博文 17
码字总数 20302
作品 1
北京
后端工程师
私信 提问
加载中

评论(5)

吃肉De包子
请问@Ajax怎么发post请求?
xtuhcy
xtuhcy

引用来自“request”的评论

13又被@了,必须支持一下
欢迎pull request,多多的star
request
request
13又被@了,必须支持一下
xtuhcy
xtuhcy

引用来自“gecco”的评论

13和我名字一样啊。赶快来支持一下。

真巧,哈哈
Gecco
Gecco
13和我名字一样啊。赶快来支持一下。
易用的轻量化的网络爬虫--GECCO

Gecco是什么 Gecco是一款用java语言开发的轻量化的易用的网络爬虫。Gecco整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等优秀框架,让您只需要配置一些jquery风格的选择器...

xtuhcy
2016/02/19
12.2K
21
gecco 1.0.5 发布,轻量化网络爬虫

gecco 1.0.5 发布了,gecco 是易用的轻量化网络爬虫。 主要改进: 1、修复redirect的相对url的bug 2、增加了支持htmlunit的插件 3、增加抓取JD全部商品的demo 下载地址: Source code (zip) ...

oschina
2016/03/07
3.5K
3
Gecco 1.1.3 发布,易用的轻量化爬虫

Gecco 1.1.3 发布了,该版本改进内容包括: 处理jsonp的时候,分号问题修复 2.支持自定义下载重试次数定义,GeccoEngine.retry(count) 3.HttpClientDownloader支持response的Set Cookie自动存...

xtuhcy
2016/05/31
2.3K
9
gecco 1.0.8 发布,易用的轻量化爬虫

gecco 1.0.8 发布了。 1.0.8版本主要做了如下修改: GeccoEngine增加loop方法,支持不循环抓取。gecco默认将改为采用不循环抓取 2.支持移动端的UserAgent,通过GeccoEngine.mobile(true)设置...

xtuhcy
2016/03/30
405
0
gecco 1.0.9 发布,易用的轻量化爬虫

gecco 1.0.9 发布了。 1.0.9版本主要做了如下修改: 1、@Image注解增加图片自动下载到本地的方法@Image(download="d:/gecco/jd/img") 2、GeccoEngine改为线程方式,通过start()支持非阻塞方式...

xtuhcy
2016/04/13
1K
5

没有更多内容

加载失败,请刷新页面

加载更多

Confluence 6 自定义你的空间

通过对你的空间进行界面的自定义能够让你的空间更加出类拔萃。 如果你具有空间管理员权限,你可以修改你空间的颜色配色,添加你自己的空间标识,选择是否在你空间中显示边栏。或者你可以进入...

honeymose
40分钟前
1
0
Ubuntu18.04 安装MySQL

1.安装MySQL sudo apt-get install mysql-server 2.配置MySQL sudo mysql_secure_installation 3.设置MySQL非root用户 设置原因:配置过程为系统root权限,在构建MySQL连接时出现错误:ERROR...

AI_SKI
今天
3
0
3.6 rc脚本(start方法) 3.7 rc脚本(stop和status方法) 3.8 rc脚本(以daemon方式启动)

3.6-3.7 rc脚本(start、stop和status方法) #!/usr/bin/env python# -*- coding: utf-8 -*-# [@Version](https://my.oschina.net/u/931210) : python 2.7# [@Time](https://my.oschina.......

隐匿的蚂蚁
今天
3
0
Cnn学习相关博客

CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行...

-九天-
昨天
5
0
flutter 底部输入框 聊天输入框 Flexible

想在页面底部放个输入框,结果键盘一直遮住了,原来是布局问题 Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text("评论"), ...

大灰狼wow
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部