Java爬虫——Gecco简单入门程序(根据下一页一直爬数据)
为了完成作业,所以学习了一下爬虫Gecco,这个爬虫集合了以往所有的爬虫的特点,但是官方教程中关于Gecco的教程介绍的过于简单,本篇博客是根据原博客的地址修改的,原博客中只有程序的截图,而没有给出一个完整的程序,本篇博客给出完整的代码 首先:爬取数据的目标网站是:https://doutushe.com/portal/index/index/p/1(关于斗图社)
创建maven项目,导入依赖:
<dependency>
<groupId>com.geccocrawler</groupId>
<artifactId>gecco</artifactId>
<version>1.3.0</version>
</dependency>
爬取第一页的数据,其中包括每个页面每个详细话题的链接以及下一页的链接地址,
代码如下: DoutuSheIndex.java
package com.chry.GeccoCSDN; import java.util.List; import com.geccocrawler.gecco.GeccoEngine;
import com.geccocrawler.gecco.annotation.Gecco;
import com.geccocrawler.gecco.annotation.Href;
import com.geccocrawler.gecco.annotation.HtmlField;
import com.geccocrawler.gecco.annotation.Request;
import com.geccocrawler.gecco.request.HttpRequest;
import com.geccocrawler.gecco.spider.HtmlBean; @Gecco(matchUrl="https://doutushe.com/portal/index/index/p/{page}", pipelines="doutusheIndex")
public class DoutuSheIndex implements HtmlBean{ /**
*
*/
private static final long serialVersionUID = 1L; @Request
private HttpRequest request; @Href(click=true)
@HtmlField(cssPath="a.link-2")
private List<String> nameList; //得到的是地址 public HttpRequest getRequest() {
return request;
} public void setRequest(HttpRequest request) {
this.request = request;
} @Href(value="href")
@HtmlField(cssPath="a.link-2")
private List<String>idList; //得到的名称 @HtmlField(cssPath="ul.pagination li")
private List<IndexPageEntity> pageList;
public List<IndexPageEntity> getPageList() {
return pageList;
} public void setPageList(List<IndexPageEntity> pageList) {
this.pageList = pageList;
} public List<String> getNameList() {
return nameList;
} public List<String> getIdList() {
return idList;
} public void setNameList(List<String> nameList) {
this.nameList = nameList;
} public void setIdList(List<String> idList) {
this.idList = idList;
} }
注意:在创建的类中必须要有一个request私有成员,并且添加他的get和set方法,这样是为了后边可以在proess中获取数据。
现在详细的介绍一下页面中的每个不同的部分

每个里边的成员变量都有一个与之对应的css路径,这是与网页中的元素对应的,当对应的css是一类时,可以用一个List对象来存储该页面中所有相同css的元素
FinishDoutusheIndex.java
package com.chry.GeccoCSDN; import org.apache.http.util.TextUtils; import com.geccocrawler.gecco.annotation.PipelineName;
import com.geccocrawler.gecco.pipeline.Pipeline;
import com.geccocrawler.gecco.request.HttpRequest;
import com.geccocrawler.gecco.scheduler.SchedulerContext; @PipelineName(value="doutusheIndex")
public class FinishDoutusheIndex implements Pipeline<DoutuSheIndex>{ public void process(DoutuSheIndex doutusheIndex) { //首先遍历帖子的详情
for(int i=0;i<doutusheIndex.getIdList().size();i++) {
if(!TextUtils.isEmpty(doutusheIndex.getNameList().get(i))) {
String url = doutusheIndex.getIdList().get(i); HttpRequest currRequest = doutusheIndex.getRequest();
SchedulerContext.into(currRequest.subRequest(url));
}
}
//跳转到下一页 for(int i=0;i<doutusheIndex.getPageList().size();i++) {
String pageName = doutusheIndex.getPageList().get(i).getPageName(); if(pageName!=null&&pageName.equals("下一页")) {
String url = doutusheIndex.getPageList().get(i).getPageUrl();
HttpRequest currRequest = doutusheIndex.getRequest(); SchedulerContext.into(currRequest.subRequest(url));
}
} } }
注意:这个java文件hi用来处理帕区到的第一个页面的超链接的
这相当于一个管道类

每个管道类都应该有一个与之相对应的value值,上边的value值正好与第一个java文件中的pipelines属性相对应,这就表示第一个java类中获取到的数据都会传到这个类中,在自定义管道类中都会重写一个process方法,用来处理数据,在上边的proess中,处理的过程就是获取每个论坛标题和下一页的超链接,并放到配置中心去,此时,会自动匹配网址,进入到下一个类中。
DoutusheEntity.java
package com.chry.GeccoCSDN; import java.util.List; import com.geccocrawler.gecco.annotation.Gecco;
import com.geccocrawler.gecco.annotation.HtmlField;
import com.geccocrawler.gecco.annotation.Image;
import com.geccocrawler.gecco.annotation.Request;
import com.geccocrawler.gecco.request.HttpRequest;
import com.geccocrawler.gecco.spider.HtmlBean; @Gecco(matchUrl="https://doutushe.com/portal/article/index/id/{content}", pipelines="doutusheEntity")
public class DoutusheEntity implements HtmlBean{ /**
*
*/
private static final long serialVersionUID = 1L; @Request
private HttpRequest request; @HtmlField(cssPath="div.col-xs-12 blockquote p")
private String title; public HttpRequest getRequest() {
return request;
} public String getTitle() {
return title;
} public void setRequest(HttpRequest request) {
this.request = request;
} public void setTitle(String title) {
this.title = title;
} }
这个java文件是用来获取每个论坛详细内容的,为了方便,这个只获取每个论坛的标题,其中的pipelines=“doutusheEntity”中的doutusheEntity又是一个自定义的管道类,其内容为
FinishDoutusheEntity.java
package com.chry.GeccoCSDN; import com.geccocrawler.gecco.annotation.PipelineName;
import com.geccocrawler.gecco.pipeline.Pipeline; @PipelineName(value="doutusheEntity")
public class FinishDoutusheEntity implements Pipeline<DoutusheEntity>{ public void process(DoutusheEntity bean) {
// TODO Auto-generated method stub
System.out.println("抓取到的标题为:"+bean.getTitle()); } }
注:作用就是将前边获取的标题在控制台输出
运行的结果如下:

在做测试时,可以不用自定义的管道类,直接用Gecco中自带的管道类 consolePipeline(在控制台输出结果),如下图所示

到此,一个简单的Gecco程序就算建立完成了,如果有什么问题,可以留言,我会持续更细。
Java爬虫——Gecco简单入门程序(根据下一页一直爬数据)的更多相关文章
- Java的多线程 简单入门
Java的多线程 简单入门 首先能够先搞清楚什么是程序.进程.线程,以及它们之间的关系: 定义: 一 程序仅仅是一组指令的有序集合.它是静态的 二 进程是具有一定独立功能的程序关于某个数据集合上的一次 ...
- 初学Python之爬虫的简单入门
初学Python之爬虫的简单入门 一.什么是爬虫? 1.简单介绍爬虫 爬虫的全称为网络爬虫,简称爬虫,别名有网络机器人,网络蜘蛛等等. 网络爬虫是一种自动获取网页内容的程序,为搜索引擎提供了重要的 ...
- Python爬虫的简单入门(一)
Python爬虫的简单入门(一) 简介 这一系列教学是基于Python的爬虫教学在此之前请确保你的电脑已经成功安装了Python(本教程使用的是Python3).爬虫想要学的精通是有点难度的,尤其是遇 ...
- MyBatis - 介绍、简单入门程序
JDBC编程中的问题 1. 将SQL语句硬编码到Java代码,不利于系统维护. 设想如何解决:将SQL单独抽取出来,在配置文件(xml方式.properties文件)进行配置. ...
- springmvc(一) springmvc框架原理分析和简单入门程序
springmvc这个框架真的非常简单,感觉比struts2还更简单,好好沉淀下来学习~ --WH 一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解 ...
- SpringMVC学习(一)———— springmvc框架原理分析和简单入门程序
一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...
- Java中Redis简单入门
Redis是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案. Redis官方网网站是:http://www.redis.io/,如下: Redis ...
- springmvc框架原理分析和简单入门程序
一.什么是springmvc? 我们知道三层架构的思想,并且如果你知道ssh的话,就会更加透彻的理解这个思想,struts2在web层,spring在中间控制,hibernate在dao层与数据库打交 ...
- 使用轻量级JAVA 爬虫Gecco工具抓取新闻DEMO
写在前面 最近看到Gecoo爬虫工具,感觉比较简单好用,所有写个DEMO测试一下,抓取网站 http://zj.zjol.com.cn/home.html,主要抓取新闻的标题和发布时间做为抓取测试对象 ...
随机推荐
- XE7 里面添加自定义View
经过xe4,xe5,xe6 这么几个版本的磨合,易博龙终于在今年9月推出了统一的多平台开发版本-XE7. 经过最近几天的测试,非常不错.如果各位同学在做移动开发,强烈建议使用XE7. 前面几个版本可以 ...
- 2018.10.22 bzoj1742: Grazing on the Run 边跑边吃草(区间dp)
传送门 区间dp入门题. 可以想到当前吃掉的草一定是一个区间(因为经过的草一定会吃掉). 然后最后一定会停在左端点或者右端点. f[i][j][0/1]f[i][j][0/1]f[i][j][0/1] ...
- 2018.09.09 bzoj4403: 序列统计(Lucas定理)
传送门 感觉单调不降序列什么的不好做啊. 于是我们序列中下标为i的元素的值加上i,这样就构成了一个单调递增的序列. 问题就变成了: 求出构造长度分别为1 ~ n且每个元素的值在l+1 ~ r+n之间的 ...
- 2018.08.09 bzoj4719: [Noip2016]天天爱跑步(树链剖分)
传送门 话说开始上文化课之后写题时间好少啊. 这道题将一个人的跑步路线拆成s->lca,lca->t,然后对于第一段上坡路径要经过的点,当前这个人能对它产生贡献当且仅当dep[s]-dep ...
- 信息管理代码分析<一>登录密码
题解:这段代码的要求如下,输入一段字符密码(长度<=8)以二进制的形式存放在磁盘中,在输入时需要验证两次输入是否正确.第二个,登录.从磁盘中读取这个文件,然后再输入密码,看两者是否相同. 登录密 ...
- POJ3045 Cow Acrobats 2017-05-11 18:06 31人阅读 评论(0) 收藏
Cow Acrobats Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4998 Accepted: 1892 Desc ...
- Android app日志保存功能
每一个App应用应该都需要有日志保存的功能,日志保存可以记录App运行中所遇到的问题,查Bug也比较方便 等等: Android日志保存功能,保存某几天的最新日志文件到某个目录,直接看是如何代码实现的 ...
- TFS中设置任务中的“计划开始时间”为可编辑状态
问题现象 如果使用TFS系统的默认模板CMMI新建团队项目,你会发现在网页浏览器中,任务工作项的"计划开始日期"和"计划结束日期"的类型是普通字符,并且不能修改 ...
- Hyper-V启动虚拟机,消耗C盘大量磁盘空间
问题描述 经常使用Hyper-V虚拟机的朋友,可能会碰到这样的现象,当启动某些虚拟机的是否,发现C盘的空间突然减少,减少的空间与虚拟机的内存一样大少. 通过分析C盘空间的磁盘文件,发现在Hyper-V ...
- jquery chosen 插件多选初始化
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...