什么是Gecco ?

Gecco 是一款用java语言开发的轻量化的易用的网络爬虫,整合了jsoup、httpclient、fastjson、spring、htmlunit、redission等优秀框架。

为什么使用Gecco?

我是在码云上面搜了java爬虫框架,结果如下

前三个都有试过,但是远远没有Gecco的API简洁,上手简单。最重要的一点是:它跟我学过的Python的爬虫框架Scrapy用法很相似。

看图,不多说。

接下来我们上手吧

开源地址

官网文档

依赖

目前最新版本1.3.0

com.geccocrawler

gecco

1.3.0

为了使我们代码更简洁,我们还要引入LomBok

org.projectlombok

lombok

1.16.18

provided

gecco的内容抽取都是直接映射到java bean的属性中,利用注解可以方便的注入页面中的各种信息包括html页面内容、Ajax请求、javascript变量、request信息等

常用注解@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类型。

快速开始packageme.liao.gecco.liaowo;importcom.geccocrawler.gecco.GeccoEngine;importcom.geccocrawler.gecco.annotation.*;importcom.geccocrawler.gecco.spider.HtmlBean;importlombok.Data;//Lombok注解 省去get/set方法@Data// matchUrl是要抓取的地址 这里的{id}是个占位符pipelines后面讲@Gecco(matchUrl="https://sanii.cn/article/{id}",pipelines="liaowome")

public classliaowoimplements HtmlBean{

private static final longserialVersionUID= -7127412585200687225L;@RequestParameter("id")

privateStringid;@Text@HtmlField(cssPath="body > article > div.post-header > h1 > a")

privateStringtitle;@Text@HtmlField(cssPath="body > article > div.post-header > div")

privateStringview;@Html@HtmlField(cssPath="#post-content")

privateStringcontent;public static voidmain(String[] args) {

GeccoEngine.create()

//工程的包路径.classpath("me.liao.gecco.liaowo")

//开始抓取的页面地址.start("https://sanii.cn/article/249")

//开启几个爬虫线程.thread(1)

//单个爬虫每次抓取完一个请求后的间隔时间.interval(2000)

//循环抓取.loop(true)

//使用pc端userAgent.mobile(false)

//非阻塞方式运行.start();

}

}

HtmlField字段的提取规则我们怎么写呢?

我们可以借助chrome浏览器解决

拿上面的代码举例(唉,我又拿自己的站点举例了 受伤)

我们要爬取title、view、content的数据。

如上图,会得到页面的DOM节点(如3),此时右键Copy>Copy selector 即可得到>  body > article > div.post-header > h1 > a 类似这样的内容,直接填入HtmlField即可。

重复如下可以得到

我们可以直接在main方法中启动测试一下public static voidmain(String[] args) {

GeccoEngine.create()

//工程的包路径.classpath("me.liao.gecco.liaowo")

//开始抓取的页面地址.start("https://sanii.cn/article/249")

//开启几个爬虫线程.thread(1)

//单个爬虫每次抓取完一个请求后的间隔时间.interval(2000)

//循环抓取.loop(true)

//使用pc端userAgent.mobile(false)

//非阻塞方式运行.start();}

Gecco如何运行

Gecco的初始化和启动通过GeccoEngine完成,GeccoEngine主要负责初始化配置、开始请求的配置和启动爬虫运行,最基本的启动方法:GeccoEngine.create()

.classpath("com.geccocrawler.gecco.demo")

.start("https://github.com/xtuhcy/gecco")

.start();

classpath是必填项,指定扫描@Gecco的包路径。start是初始请求地址。start()表示采用非阻塞方式运行爬虫。

GeccoEngine基本配置项loop(true):表示是否循环抓取,默认为false

thread(2):表示开启的爬虫线程数量,默认是1,需要注意的是线程数量要小于或者等于start请求的数量

interval(2000):表示某个线程在抓取完成一个请求后的间隔时间,单位是毫秒,系统会在左右1秒时间内随机。如果为2000,系统会在1000~3000之间随机选取。

mobile(false):表示使用移动端还是pc端的UserAgent。默认为false使用pc端的UserAgent。

debug(true):是否开启debug模式,如果开启debug模式,会在控制台输出jsoup元素抽取的日志。

pipelineFactory(PipelineFactory):自定义Pipeline工厂类

scheduler(Scheduler):自定义请求队列管理器

非阻塞启动和阻塞启动start():非阻塞启动,GeccoEngine会单独启动线程运行,推荐以该方式运行。线程模型如下:

Main Thread-->GeccoEngine Thread-->Spider Threadrun():阻塞启动,GeccoEngine在主线程中启动运行,非循环模式GeccoEngine需要等待其他爬虫线程运行完毕后才会退出。线程模型r如下:

Main Thread-->Spider Thread

输出结果

我们怎么得到爬取的数据bean呢?

这个问题我在官网的文档中找了很久,并没有找到相关的文章。最后是在翻一些Demo的时候找到的@PipelineName("liaowome")

public classConsolePipelineimplements Pipeline{

@Overridepublic voidprocess(SpiderBeanbean) {

System.out.println("爬虫结果:"+JSON.toJSONString(bean));

}

}

创建一个类,格式如上。在Process中就可以得到我们的数据

这里有一个坑:

PipelineName的名字最好不要是consolePipeline,我从demo上照搬了这个名字,导致在获取的时候死活得不到数据。

改成我们定义的PipelineName。

把爬到的数据保存到文本中@PipelineName("liaowome")

public classConsolePipelineimplements Pipeline{

@Overridepublic voidprocess(SpiderBeanbean) {

System.out.println("爬虫结果:"+JSON.toJSONString(bean));try{

Fileto =newFile("E:\\liaowome.txt");Files.append(JSON.toJSONString(bean) +System.getProperty("line.separator"),to,Charsets.UTF_8);} catch(IOExceptione) {

e.printStackTrace();}

}

}

System.getProperty("line.separator") 得到当前操作系统的换行符;

上面使用了Guava包(Gecco自带了Guava依赖)的Files类,一行代码解决。

代码下载

本文由 SAn 创作,采用 知识共享署名4.0 国际许可协议进行许可

本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名

最后编辑时间为:

2018/07/11 20:00

java分布式爬虫_Java分布式爬虫框架:Gecco 入门相关推荐

  1. java多线程爬虫_Java 多线程爬虫及分布式爬虫架构

    在这个时间就是金钱的年代,不可能给你时间去慢慢的采集,所以单线程爬虫程序是行不通的,我们需要将单线程改成多线程的模式,来提升采集效率和提高计算机利用率.维护待采集的 URL多线程爬虫程序就不能像单线程 ...

  2. java mysql 分布式锁_Java分布式锁之数据库方式实现

    之前的文章<Java分布式锁实现>中列举了分布式锁的3种实现方式,分别是基于数据库实现,基于缓存实现和基于zookeeper实现.三种实现方式各有可取之处,本篇文章就详细讲解一下Java分 ...

  3. java https 网络爬虫_Java 网络爬虫,就是这么的简单

    这是 Java 网络爬虫系列文章的第一篇,如果你还不知道 Java 网络爬虫系列文章,请参看 学 Java 网络爬虫,需要哪些基础知识.第一篇是关于 Java 网络爬虫入门内容,在该篇中我们以采集虎扑 ...

  4. java spider爬虫_Java网络爬虫实操(2)

    本篇文章继续介绍爬虫框架NetDiscovery的使用:如何发重复请求.如何用爬虫容器引擎驱动爬虫程序 1 )重复请求的场景举例 从2017年下半年开始,比特币.数字货币.虚拟币.区块链技术.去中心化 ...

  5. java打包 图片_Java 图片爬虫,java打包jar文件

    [TOC] 1. Java 图片爬虫,制作 .jar 文件 spider.java spider.java 高清图片api : https://www.xwboke.cn/api/api.php ,每 ...

  6. java正则表达式爬虫_Java简单爬虫系列(3)---正则表达式和Java正则API的使用

    上一篇内容写了如何请求资源,那么资源请求下载之后我们就要对它就行解析了,解析之前我们先熟悉一下正则表达式 正则表达式在平常使用时还是很广泛的,比如说表单输入验证,验证手机号邮箱之类,Java的字符串匹 ...

  7. java cnn图像识别_Java分布式神经网络库Deeplearning4j之上手实践手写数字图像识别与模型训练...

    环境的搭建可以参考另一篇文章. 第一步运行MnistImagePipelineExampleSave代码下载数据集,并进行训练和保存 需要下载一个文件(windows默认保存在C:\Users\Adm ...

  8. java 天气爬虫_java网页爬虫简单实例详解——获取天气预报。

    [本文介绍] 爬取别人网页上的内容,听上似乎很有趣的样子,只要几步,就可以获取到力所不能及的东西,例如呢?例如天气预报,总不能自己拿着仪器去测吧!当然,要获取天气预报还是用webService好.这里 ...

  9. java 获取邮编_java利用爬虫技术抓取(省、市(区号\邮编)、县)数据

    /** * @param var 城市名称 * @returnstring数组.0表示邮编1表示区号 */ @SuppressWarnings("deprecation") pri ...

最新文章

  1. opencv-3.3安装记录-ubuntu 14.04
  2. Linux下apache服务器安装,sqlite安装,apache启动,关闭,重启,编写cig程序进行测试,浏览器访问cig程序
  3. (C++版)链表(一)——实现单向链表创建、插入、删除等相关操作
  4. 使用双向链表构建二叉树_python:26.二叉搜索树与双向链表
  5. php 如何清空数组_PHP从数组中删除元素的四种方法实例
  6. java JVM常见的四大异常及处理方案
  7. 中英文字体对照 ueditor添加字体
  8. pads铺铜不能开启drp_PADS2007 layout设置和基本操作步骤.ppt
  9. IsPostBack是什么意思,如何运用?
  10. 单机 弱联网手游 防破解 金币修改 简单措施
  11. 低密度奇偶校验码(LDPC)GMSK调制解调器 毕业设计
  12. python-random模块详解
  13. java 二进制加减_二进制加法Java实现
  14. 程序员编程中遇到的那些灵异事件,胆小误入!
  15. Emacs学习笔记(7):简单的配置
  16. Unity-Chan Toon Shader 2 介绍
  17. PMP备考错题集-模拟题二
  18. cmake中的INTERFACE_INCLUDE_DIRECTORIES是干什么的
  19. Procmon打开后无反应的问题
  20. <Leetcode>算法初步(回顾)

热门文章

  1. 关于中国神化体系的建立问题
  2. 无线充电宝哪款好?便宜好用的无线充电宝推荐
  3. jQuery 《基础整合》 jQuery插件、jQueryAPI查询网站
  4. 云服务器80端口_怎么查看_放开端口检测
  5. Spring MVC【钢镚核恒】
  6. Nanopi 加 小米随身wifi
  7. 关于函数与导函数的连续与可导问题
  8. 基于 SpringBoot实现文档管理编辑器
  9. AES在linux加密String,關於AES加密算法在linux下解密失敗的解決
  10. VSCode官网下载慢解决办法