GuozhongCrawler实现一个完整爬虫

Stella981
• 阅读 556

    经过上一节开发环境搭建中的百度新闻的爬虫例子,相信大家已经对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接口。只是为了标记作用。让引擎可以统一处理。无其他作用

点赞
收藏
评论区
推荐文章
Karen110 Karen110
3年前
爬虫进阶 - 前后端分离有什么了不起,过程超详细
这是一个详细的爬虫进阶教程,里面包含了很详细的思考和试错过程,如果你对学爬虫是认真的,建议认真看。我们要抓取下面这个网站上的所有图书列表:https://www.epubit.com/books1)探索研究创建一个新的python文件,写入如下代码:import requestsurl  'https://www.epubit.com/boo
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来开发)来实现。  然而我们造轮