• 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程序就算建立完成了,如果有什么问题,可以留言,我会持续更细。

  • 相关阅读:
    mysql集群架构
    mysql数据库版本不同所引起的问题
    linux下mysql安装
    windows下mysql的安装
    JMeter操作mysql
    Tomcat 配置下载服务器
    JMeter接口测试——关联
    JMeter接口测试——断言
    JMeter接口测试——参数化(从文件中读取参数)
    JMeter接口测试示例(三)——添加HTTP认证
  • 原文地址:https://www.cnblogs.com/ljysy/p/10221086.html
Copyright © 2020-2023  润新知