java爬虫系列(一)——爬虫入门

  • Post author:
  • Post category:java


爬虫框架介绍

java爬虫框架非常多,比如较早的有Heritrix,轻量级的crawler4j,还有现在最火的WebMagic。

他们各有各的优势和劣势,我这里顺便简单介绍一下吧。

Heritrix

优势

java的第一批爬虫框架,拥有独立的后台页面,可以实现界面操作去爬去网页。

劣势

相对其他框架,代码相对臃肿,上手难度较高,解析网页不如其他框架灵活。

简单demo地址


https://github.com/a252937166/Heritrix

crawler4j

优势

代码相当轻量级,可实现多线程爬取,上手难度低。

劣势

封装程度太低,很多功能需要开发者自己封装实现,多线程下,很容易重复爬取相同资源。

简单demo地址


https://github.com/a252937166/crawler4j

WebMagic

优势

这框架我们公司在用,各方面都比较完美吧,上手难度低,社区活跃度也较高,有问题可以得到及时反馈。

劣势

没有持久层框架的封装,需要自己实现。

简单demo地址

这个框架我没有自己的demo,大家可以去开发者的GitHub看看


https://github.com/code4craft/webmagic

快速入门

seimicrawler

我这里推荐使用seimicrawler,个人感觉这个框架配合JsoupXpath,解析网页真心非常方便,而且框架整合了spring,用起来也很顺手。

项目地址

中文官网地址:

http://seimicrawler.org/


官方Github地址:

https://github.com/zhegexiaohuozi/SeimiCrawler


自己修改项目地址:

https://github.com/a252937166/seimicrawler/

简单爬虫实现

导入项目

下载源码,解压后把demo目录的文件单独拿出来,project目录不用管,里面是这个框架的一些源码,demo直接maven依赖它就可以了。

以maven的形式,导入demo,等待jar拉取玩,项目不报错就说明导入成功了。

编写爬虫

打开crawlers文件夹,里面每个文件都是一个爬虫,我们可以学习一下

Basic

,这是开发者写的最简单的爬虫demo,其他的都可以以此内推。

package com.ouyang.crawlers;

import cn.wanghaomiao.seimi.annotation.Crawler;
import cn.wanghaomiao.seimi.def.BaseSeimiCrawler;
import cn.wanghaomiao.seimi.struct.Request;
import cn.wanghaomiao.seimi.struct.Response;
import cn.wanghaomiao.xpath.model.JXDocument;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author 汪浩淼 [et.tw@163.com]
 * @since 2015/10/21.
 */
@Crawler(name = "basic")
public class Basic extends BaseSeimiCrawler {
    @Override
    public String[] startUrls() {
        //两个是测试去重的
        return new String[]{"http://www.cnblogs.com/","http://www.cnblogs.com/"};
    }

    @Override
    public void start(Response response) {
        JXDocument doc = response.document();
        try {
            List<Object> urls = doc.sel("//a[@class='titlelnk']/@href");
            logger.info("{}", urls.size());
            Map map = new HashMap();
            map.put("ddd","aaa");
            for (Object s:urls){
                push(new Request(s.toString(),"getTitle").setParams(map));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void getTitle(Response response){
        JXDocument doc = response.document();
        try {
            logger.info("url:{} {}", response.getUrl(), doc.sel("//h1[@class='postTitle']/a/text()|//a[@id='cb_post_title_url']/text()"));
            //do something
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

我来解释一下,

response.document()

表示把网页返回信息解析为一个

JXDocument

类,

JXDocument

支持JsoupXpath语法,比如

//a[@class='titlelnk']/@href

,表示从网页根目录下,查找

<a class='titlelnk'></>

,并获取其href的值。具体语法可以见

http://www.w3school.com.cn/xpath/xpath_syntax.asp

爬虫需要实现的具体业务,在

start()

方法里实现就行了,想要继续爬取新的网页,用

push()

实现,

push()

会新开启一个线程,

push(new Request(s.toString(),"getTitle").setParams(map)

,表示爬取

s.toString()

,这个网页,并且回调

getTitle()

方法。


@Crawler(name = "basic")

表示爬虫名字。

启动爬虫

可以写一个

main

函数,

new

一个

Semi()

对象,调用其

goRun()

方法机型了。

public class Boot {
    public static void main(String[] args){
        Seimi s = new Seimi();
        s.goRun("basic");
    }
}

以上代码就表示启动

basic

爬虫,运行

main

函数就开始爬取网页了。

这里写图片描述



图(1)

同系列文章


java爬虫系列(二)——爬取动态网页



java爬虫系列(三)——漫画网站爬取实战



java爬虫系列(四)——动态网页爬虫升级版



java爬虫系列(五)——今日头条文章爬虫实战



版权声明:本文为Mr_OOO原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。