springboot使用webmagic框架来抓取自己的博客信息

因为看自己的博客文章的一些信息要上网登录什么的步骤,有时候显得很麻烦,所以今天抽空学了webmagic爬虫框架,让自己的文章信息直接展示在控制台,如下图:
这里写图片描述

一、创建一个java项目(其实是不是springboot无所谓的,但做成springboot可以有扩展的地方)

二、首先在pom.xml中加入webmagic相关依赖

<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>

三、直接在主包下面建一个类实现PageProcessor接口

package com;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.pipeline.ConsolePipeline;
import us.codecraft.webmagic.processor.PageProcessor;

import java.util.List;

public class MyBlogMagic implements PageProcessor {
     部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1);;
    //这里通过page.addTargetRequests()方法来增加要抓取的URL
    // 这里抽取支持链式调用。调用结束后,toString()表示转化为单个String,all()则转化为一个String列表。
    public void process(Page page) {
        //用于获取所有满足这个正则表达式的链接
        List<String> links = page.getHtml().links().regex("http://bolg\\.csdn\\.net/").all();
        //将这些链接加入到待抓取的队列中去
        page.addTargetRequests(links);
            //相同元素的结果加到相应的集合中去。
            List<String>titlelist=page.getHtml().xpath("//span[@class='link_title']/a/text()").all();
            List<String>readlist=page.getHtml().xpath("//span[@class='link_view']/text()").all();
            List<String>pinlunlist=page.getHtml().xpath("//span[@class='link_comments']/text()").all();
            //遍历这些list,输出自己想要的结果。
            for (int i=0;i<titlelist.size();i++){
                if (i==0){
                    System.out.println("###################################################");
                    System.out.println("###################################################");
                }
                System.out.println("题目:"+titlelist.get(i));
                System.out.println("阅读人数:"+readlist.get(i).replace("(","").replace(")",""));
                System.out.println("评论次数:"+pinlunlist.get(i).replace("(","").replace(")",""));
                if (i!=titlelist.size()-1) {
                    System.out.println("*******************我是可爱的分割线*******************\n");

                }
            }

    }

    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Spider
                .create(new MyBlogMagic())
                //在这里写上自己博客地址,从这个地址开始抓
                .addUrl("http://blog.csdn.net/h295928126")
                .run();
    }

}

四、run main方法即可输出自己的博客文章信息。

五、后来优化了一下MyBlogMagic 类,变成一个通用版的。可以看一下

package com;

import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;

import java.util.List;
import java.util.Scanner;

public class MyBlogMagic implements PageProcessor {
    //文章的总页数
    static String state = "0";
     部分一:抓取网站的相关配置,包括编码、抓取间隔、重试次数等
    private Site site = Site.me().setRetryTimes(3).setSleepTime(1);
    ;

    //这里通过page.addTargetRequests()方法来增加要抓取的URL
    // 这里抽取支持链式调用。调用结束后,toString()表示转化为单个String,all()则转化为一个String列表。
    public void process(Page page) {
        //用于获取所有满足这个正则表达式的链接
        List<String> links = page.getHtml().links().regex("http://bolg\\.csdn\\.net/article/list/\\d+").all();
        //将这些链接加入到待抓取的队列中去
        page.addTargetRequests(links);
        //相同元素的结果加到相应的集合中去。
        List<String> titlelist = page.getHtml().xpath("//span[@class='link_title']/a/text()").all();
        List<String> readlist = page.getHtml().xpath("//span[@class='link_view']/text()").all();
        List<String> pinlunlist = page.getHtml().xpath("//span[@class='link_comments']/text()").all();

        if (!state.equals("0")) {
            for (int i = 0; i < titlelist.size(); i++) {
                if (i == 0) {
                    System.out.println("-------------------------------------------------");
                    System.out.println("------------------------------------------------");
                }
                System.out.println("题目:" + titlelist.get(i));
                System.out.println("阅读人数:" + readlist.get(i).replace("(", "").replace(")", ""));
                System.out.println("评论次数:" + pinlunlist.get(i).replace("(", "").replace(")", ""));
                if (i != titlelist.size() - 1) {
                    System.out.println("********************************************\n");

                }
            }
        }
        String pagelist = page.getHtml().xpath("//div[@class='pagelist']/span/text()").get();
        if (pagelist != null) {
            state = pagelist.substring(pagelist.indexOf("共") + 1, pagelist.indexOf("页"));
        } else {
            state = "true";
        }

    }


    public Site getSite() {
        return site;
    }

    public static void main(String[] args) {
        Scanner scanner1 = new Scanner(System.in);
        System.out.println("++++++++++++++++++++++++++++++++");
        System.out.println("+                              +");
        System.out.println("+请输入您的博客名字,按回车确认:+");
        System.out.println("+                              +");
        System.out.println("++++++++++++++++++++++++++++++++");
        String name = scanner1.next();
        Spider
                .create(new MyBlogMagic())
                //从这个地址开始抓
                .addUrl("http://blog.csdn.net/" + name + "/article/list")
                .run();
        if (state.equals("true")) {
            Spider
                    .create(new MyBlogMagic())
                    //从这个地址开始抓
                    .addUrl("http://blog.csdn.net/" + name)
                    .run();
        } else while (!state.equals("0")) {
            try {
            Scanner scanner = new Scanner(System.in);
            System.out.println("********************************************************");
            System.out.println("**总页数为 " + state + " 页                                       **");
            System.out.println("**请输入您要看的页码,按回车确认:                      **");
            System.out.println("**输入大于" + state + "的数字可查看全部文章列表                   **");
            System.out.println("********************************************************");

                    String str = scanner.next();
                    int a = Integer.valueOf(str);
                    Spider
                            .create(new MyBlogMagic())
                            //从这个地址开始抓
                            .addUrl("http://blog.csdn.net/" + name + "/article/list/" + str)
                            .run();
                } catch (Exception e) {
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        String str="不要输入非数字啦!!人家都要奔溃了(>﹏<。)要重新输入哦~";
                        try {
                            for(int i=0;i<str.length();i++){
                                Thread.sleep(100);
                                System.out.print(str.charAt(i));
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                    }
                }).start();

                }


        }
    }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫小八

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值