GuozhongCrawler实现一个完整爬虫

Stella981
• 阅读 568

    经过上一节开发环境搭建中的百度新闻的爬虫例子,相信大家已经对GuozhongCrawler简洁的API产生浓厚兴趣了。不过这个还不算一个入门例子。只是完成了简单的下载和解析。现在我们来完成一个比较完整的爬虫吧。

    为了体现GuozhongCrawler适应业务灵活性。我们以抓取西刺代理(http://www.xici.net.co/nn/1)的代理IP为需求。需要遍历每一页所有的IP并抓取下来,直到抓完所有的IP为止。

    网页如下:

    GuozhongCrawler实现一个完整爬虫

    1、新建一个Java项目命名为XiciCrawler并且添加依赖项目为GuozhongCrawler或者直接加入GuozhongCrawler.jar为依赖库。如果大家不知道怎么建依赖项目请看我的GuozhongCrawler开发环境搭建

    GuozhongCrawler实现一个完整爬虫

    2、新建一个爬虫入口Class名为StartCrawXici.java。包名自行拟定。这里命名为guozhong.crawler.impl。选中public static void main(String[]args)生成main方法。StartCrawXici.java代码如下

**public class StartCrawXici {

    /**
     * @param args
     */
    public static void main(String[] args) {
        CrawlTask task = new CrawlTask("西刺抓代理IP");//给任务取个名字
        CrawlManager.prepareCrawlTask(task)
        .withThread(5)//设置下载线程数5.  默认值是5
        .withStartUrl("http://www.xici.net.co/nn/1", "utf-8")//设置入口URL 并设置页面编码
        .addPageProccess(new ParseProxyIpPage())//抓取过程中的页面解析器
        .withPipeline(new XiciPipeLine())//离线管道
        .start();//启动
    }

}**

3、ParseProxyIpPage.java是处理页面的实现类。需要实现一个PageProcessor Interface。PageProcessor接口设计如下:

/**
 * 网页处理接口
 * @author Administrator
 *
 */
public interface PageProcessor {
    /**
     * 标记这个PageProcessor,应该处理哪种Request请求的页面   初始URL可以返回null
     * @return
     */
    public String getTag();
    
    /**
     * 如果需要页面动态交互JS,定义一个PageScript返回
     * @return
     */
    public PageScript getJavaScript();
    
    /**
     * 当启动代理Ip访问时需要重写此方法,返回正常网页应该带有的字符串标识。比如www.baidu.com带有“百度”
     * @return
     */
    public Pattern getNormalContain();
    
    /**
     * 处理一个页面
     * @param page
     * @param context
     * @return
     */
    public void process(OkPage page,StartContext context,List result)throws Exception;
    
    /**
     * 处理错误页面
     * @param page
     * @param context
     */
    public void proccessErrorPage(Page page,StartContext context)throws Exception;
}

因为这里是处理入口URL页面。且不需要使用到JS和代理IP。所以getTag()getJavaScript****()和getNormalContain()都不需要实现。本节重点解释process()方法如何使用。至于proccessErrorPage()方法实现和process大同小异。无非是处理错误的内容的html罢了。process()实现如下

@Override
    public void process(OkPage page, StartContext context,
            List result) throws Exception {
        System.out.println("该页面的URL:"+page.getRequest().getUrl());
        Document doc = Jsoup.parse(page.getContent());
        Pattern pattern = Pattern.//抽取代理IP的正则
                compile("([\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3}\\.[\\d]{1,3})\\s*(\\d+)\\s*([^\\s]+)\\s*([^\\s]+)\\s*([^\\s]+)");
        Matcher matcher = pattern.matcher(doc.text());
        XiciProxy proxy = null;
        while(matcher.find()){
            proxy = new XiciProxy();
            proxy.setIp(matcher.group(1));
            proxy.setPort(matcher.group(2));
            proxy.setPosition(matcher.group(3));
            proxy.setAnonymity("高匿".equals(matcher.group(4)));
            proxy.setType(matcher.group(5));
            result.add(proxy);//加入到界面处理结果的集合中
        }
        
        //判断有没有下一页的URL。有则取得下一页的URL
        Element next_a = doc.select("a[class=next_page]").first();
        if(next_a != null){
            String next_url = next_a.attr("href");
            Request req = context.createRequest(next_url, null, 0, "utf-8");//第二个参数传Tag因为这里一直是用初始页面处理器也就是ParseProxyIpPage本身。所以可以传null
            //第三个参数是设置request的优先级只有使用PriorityRequestQueue或者DelayedPriorityRequestQueue才有效
            result.add(req);//添加到跟进URL队列
        }
    }

4XiciPipeLine是实现离线存储的管道类。需要实现一个PipeLine Interface。PipeLine接口设计如下:

public interface  Pipeline extends Serializable{
    
    /**
     * 所有的结构化数据将流向这里。在这里存储你的bean
     * @param procdata
     */
    public  void proccessData(List procdata);
}

XiciPipeLine.java实现如下;

**public class XiciPipeLine implements Pipeline {

    @Override
    public void proccessData(List arg0) {
        if(ProccessableUtil.instanceOfClass(arg0, XiciProxy.class)){//判断集合类型是否是XiciProxy
            List list = ProccessableUtil.convert(arg0, XiciProxy.class);//转换
            for (XiciProxy proxy : list) {
                //在这里存储到你想要的任何数据库
                System.out.println("save:"+proxy);
            }
        }
    }

}**

至此完成了一个花刺代理的爬虫。现在把项目图贴出来给大家看看吧

GuozhongCrawler实现一个完整爬虫

是的4个类完成一个爬虫。屌不屌!

在这里补充XiciProxy.java实体类的代码

**public class XiciProxy implements Proccessable{
    /**
     *
     */
    private static final long serialVersionUID = 1L;

    private String ip;
    
    private String port;
    
    private String position;
    
    private boolean isAnonymity;
    
    private String type;**

**//后面getter setter忽略...
**

}

注:所有实体类都要实现Proccessable接口。只是为了标记作用。让引擎可以统一处理。无其他作用

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java 爬虫抓取数据一个简单例子
java爬虫抓取数据一个简单例子。用来备份用的。packagecom.util;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.Inpu
分享如何使用java写个小爬虫
爬虫行业的兴起是大数据时代下必须的产物,大家学习阿爬虫肯定是为了爬取有价值的数据信息。关于爬虫的基础知识我们这里不进行阐述,今天我们就只是进行一个简单的爬虫实践。那首先我们就需要确定下我们的目标网站,这里我们就以一些房产信息的网站为例统计一些信息。关于爬虫中的一系列反爬问题我们也不在这里做深入的了解,都是学习爬虫的必备知识,最简单的就是在访问过程中我们肯定会
python使用aiohttp通过设置代理爬取基金数据
说到python爬虫,我们就会想到它那强大的库,很多新手小白在选择框架的时候都会想到使用Scrapy,但是仅仅停留在会使用的阶段。在实际爬虫过程中遇到反爬机制是再常见不过的,今天为了增加对爬虫机制的理解,我们就通过手动实现多线程的爬虫过程,同时引入IP代理
Stella981 Stella981
3年前
Python爬虫代理池
爬虫代理IP池在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保证爬虫快速稳定的运行,当然在公司做的东西不能开源出来。不过呢,闲暇时间手痒,所以就想利用一些免费的资源搞一个简单的代理池服务。1、问题代理IP从何而来?
Stella981 Stella981
3年前
Python老司机手把手带你写爬虫,整站下载妹子图,一次爽个够!
!(https://oscimg.oschina.net/oscnet/2d50d4617b934cea97817c237087659c.gif)今天就来带大家写一个简单而又完整的爬虫,我们来抓取整站的图片的,并且保存到电脑上!!(https://oscimg.oschina.net/oscnet/a7b97a1aa25d4b
Stella981 Stella981
3年前
GuozhongCrawler看准网爬虫动态切换IP漫爬虫
有些关于URL去重的方面代码没有提供,需要自己去实现。主要这里提供思路项目地址:http://git.oschina.net/woshidaniu/GuozhongCrawler/tree/master/example/changeProxyIp/首先爬虫入口类:publicclassPervadeSpider{  
Stella981 Stella981
3年前
Scrapy爬虫框架
(1)、简介在糗事百科爬虫中我们的爬虫是继承scrapy.Spider类的,这也是基本的scrapy框架爬虫,在这个爬虫中我们自己在解析完整个页面后再获取下一页的url,然后重新发送了一个请求,而使用CrawlsSpider类可以帮助我们对url提出条件,只要满足这个条件,都进行爬取,CrawlSpider类继承自Spider,它比之前的Spid
Stella981 Stella981
3年前
Python实现王者荣耀小助手(一)
简单来说网络爬虫,是指抓取万维网信息的程序或者脚本,Python在网络爬虫有很大优势,今天我们用Python实现获取王者荣耀相关数据,做一个小助手:前期准备,环境搭建:Python2.7sys模块提供了许多函数和变量来处理Python运行时环境的不同部分;urllib模块提供了一系列用于操作URL的功能,爬虫所需要的功能,基本上在urll
Stella981 Stella981
3年前
C语言Linix服务器网络爬虫项目(一)项目初衷和网络爬虫概述
一、项目初衷和爬虫概述1.项目初衷  本人的大学毕设就是linux上用c写的一个爬虫,现在我想把它完善起来,让他像一个企业级别的项目。为了重复发明轮子来学习轮子的原理,我们不使用第三方框架(这里是说的是指通常的linux系统编程教材以外的库和接口0,当初我也是在虚拟机上跑的ubuntuputtyvim来开发)来实现。  然而我们造轮
小白学大数据 小白学大数据
1星期前
网络延迟对Python爬虫速度的影响分析
Python爬虫因其强大的数据处理能力和灵活性而被广泛应用于数据抓取和网络信息收集。然而,网络延迟是影响爬虫效率的重要因素之一。本文将深入探讨网络延迟对Python爬虫速度的影响,并提供相应的代码实现过程,以帮助开发者优化爬虫性能。网络延迟的定义与影响网络