webmagic二:springboot整合webmagic爬取网站

本文介绍了如何使用WebMagic爬虫框架抓取OSCHINA网站上黄亿华的个人博客文章,包括处理动态链接、提取文章标题、内容和标签,并演示了数据入库的过程。
摘要由CSDN通过智能技术生成

上一篇文章说是整合springboot,但跟springboot关系不大,只是解决了项目运行时出现个各种问题。这篇文章要做的是爬取oschina。为什么还要爬取oschina?因为webmagic的作者黄亿华的文章在oschina。

爬取网址:黄亿华的个人空间 - OSCHINA - 中文开源技术交流社区

首先还是得看官网,下面是码云地址,我们按照上面的来,版本我们还是使用0.10.0

webmagic: webmagic 是一个无须配置、便于二次开发的爬虫框架,它提供简单灵活的API,只需少量代码即可实现一个爬虫。

第一个爬虫

pom信息

        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-core</artifactId>
            <version>0.10.0</version>
        </dependency>
        <dependency>
            <groupId>us.codecraft</groupId>
            <artifactId>webmagic-extension</artifactId>
            <version>0.10.0</version>
        </dependency>

这里爬取的是黄亿华大佬的地址。

package com.spiden.bazaspiden.processor;

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;

/**
 * @author 张高昌
 * @date 2024/1/4 19:42
 * @description: 简单的爬虫
 */
public class OschinaBlogPageProcessor implements PageProcessor {

    private Site site = Site.me().setDomain("my.oschina.net");

    @Override
    public void process(Page page) {
        List<String> links = page.getHtml().links().regex("http://my\\.oschina\\.net/flashsword/blog/\\d+").all();
        page.addTargetRequests(links);
        page.putField("title", page.getHtml().xpath("//div[@class='BlogEntity']/div[@class='BlogTitle']/h1").toString());
        page.putField("content", page.getHtml().$("div.content").toString());
        page.putField("tags",page.getHtml().xpath("//div[@class='BlogTags']/a/text()").all());
    }

    @Override
    public Site getSite() {
        return site;

    }

    public static void main(String[] args) {
        Spider.create(new OschinaBlogPageProcessor()).addUrl("http://my.oschina.net/flashsword/blog")
                .addPipeline(new ConsolePipeline()).run();
    }
}

运行main方法结果如下:

运行结果:这很明显是错误的,并不是我们想要的数据。我们想要的是从列表页中获取文章的有效连接,然后从这个连接里爬取到相应的信息。

原因:将http改成https就好了

再次运行

等待了很久后运行结束,看出来这位大佬写了不少的文章,总共120多篇文章。

顺便吐槽一下,官网的文档得更新了。

数据是爬取到了,可总得入库吧!

创建一个新的类:OschinaPipeline

package com.spiden.bazaspiden.pipeline;

import us.codecraft.webmagic.ResultItems;
import us.codecraft.webmagic.Task;
import us.codecraft.webmagic.pipeline.Pipeline;

/**
 * @author 张高昌
 * @date 2024/1/4 19:42
 * @description: 爬取到的数据入库操作
 */
public class OschinaPipeline implements Pipeline {

    @Override
    public void process(ResultItems resultItems, Task task) {
        String title = resultItems.get("title");             //文章题目
        String context = resultItems.get("content");               //文章内容
        System.out.println("标题:" + title);
        System.out.println("内容:" + context);
    }
}

对OschinaBlogPageProcessor进行改造

打开网址:黄亿华的个人空间 - OSCHINA - 中文开源技术交流社区

我们这里就点击第一个进入到详情页面;然后打开F12

复制到的内容应该是这样的:

//*[@id="mainScreen"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[1]/h1/a

正文内容操作是一样的:

//*[@id="mainScreen"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[2]/div[1]/div[1]/div

将这2个替换原来官网的内容

        page.putField("title", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[1]/h1/a").toString());
        page.putField("content", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[2]/div[1]/div[1]/div").toString());

修改ConsolePipeline()为我们刚刚创建的OschinaPipeline()

        Spider.create(new OschinaBlogPageProcessor()).addUrl("https://my.oschina.net/flashsword/blog")
                .addPipeline(new OschinaPipeline()).run();

完整代码如下:

package com.spiden.bazaspiden.processor;

import com.spiden.bazaspiden.pipeline.OschinaPipeline;
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;

/**
 * @author 张高昌
 * @date 2024/1/4 19:42
 * @description: 简单的爬虫
 */
public class OschinaBlogPageProcessor implements PageProcessor {

    private Site site = Site.me().setDomain("my.oschina.net");

    @Override
    public void process(Page page) {
        List<String> links = page.getHtml().links().regex("https://my\\.oschina\\.net/flashsword/blog/\\d+").all();
        page.addTargetRequests(links);

        page.putField("title", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[1]/h1/a").toString());
        page.putField("content", page.getHtml().xpath("//*[@id=\"mainScreen\"]/div[2]/div[1]/div[1]/div[2]/div[1]/div/div[1]/div/div[2]/div[1]/div[1]/div").toString());
    }

    @Override
    public Site getSite() {
        return site;

    }

    public static void main(String[] args) {
        Spider.create(new OschinaBlogPageProcessor()).addUrl("https://my.oschina.net/flashsword/blog")
                .addPipeline(new OschinaPipeline()).run();
    }
}

再次运行:

搞定!!!

这里在选择xpath规则时,我是直接没有说明,我是打算放到后面的时候在讲解;如果感兴趣可以自己看下。

XPath 教程

下一篇我们开始爬取csdn​​​​​​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值