webMagic

WebMagic文档:http://webmagic.io/docs/zh/index.html。
一:快速使用

  1. –推荐使用maven项目管理工具
    maven依赖清单:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-core</artifactId>
    <version>0.5.3</version>
    </dependency>
    <dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.5.3</version>
    </dependency>
    <dependency>
    <groupId>us.codecraft</groupId>
    <artifactId>webmagic-extension</artifactId>
    <version>0.5.3</version>
    <exclusions>
    <exclusion>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    </exclusion>
    </exclusions>
    </dependency>
  2. ‘HelloWorld’例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /**
    3. Created by lwc on 16/10/17.
    */
    public class UniversalBookSpider implements PageProcessor {
    private Site site = Site.me().setRetryTimes(3).setSleepTime(100);//设置重复尝试次数3次,以及中间睡眠时间100毫秒。
    @Override
    public void process(Page page) {
    String bookname = page.getHtml().css("div.title", "text").get();//获取ID为title的DIV的内容
    }
    @Override
    public Site getSite() {
    return site;
    }
    public static void main(String args[]) {
    UniversalBookSpider universalMetaSpider = new UniversalBookSpider();//新建爬虫体
    Spider spider = Spider.create(universalMetaSpider);//新建爬虫类
    spider.addUrl("www.4399.com");//往爬虫队列中添加一个目标网址
    spider.thread(5).run();//设置5个线程共同工作。还有一种开始爬虫的方法:spider.thread(5).start();不同处在于:run()是block的,但是start是非阻塞的。
    }
    }

执行main方法就可以获得www.4399.com网站中id为·title·的DIV的内容。
二:相应的API拓展

  1. setExitWhenComplete(Boolean bool):
    spider.setExitWhenComplete(Boolean bool);参数决定是否在完成爬虫任务之后退出爬虫。一般在重复利用爬虫执行体的情况下选择false。
  2. DOM选择器
    在page.getHtml().css(“div.title”, “text”).get();的CSS()方法中的选择器与jQuery的选择与法一致(jQuery的选择器语法就不在这里赘述)
    三:多级爬虫的信息传递
    假设有A,B,C三个爬虫,A在处理完自己的界面之后想把详细info-A传给B,B处理完之后要把Info-A、info-B传给C。
    代码示例:
    1
    2
    3
    4
    5
    6
    7
    public synchronized void setSpiderAndRun(String startUrl, int threadNum, boolean exitWhenFinish, TestBook testBook, BookRule testRule) {
    if (spider == null) {
    spider = Spider.create(new UniversalBookChapter(testBook, testRule)).addUrl(startUrl).thread(threadNum).setExitWhenComplete(exitWhenFinish);
    spider.run();
    } else {
    spider.addUrl(startUrl).setExitWhenComplete(exitWhenFinish);
    }

setSpiderAndRun()方法可以在上一级的爬虫中调用,只要A中new出了B的实例,便可以通过该方法来传递信息。