Java   发布时间:2022-04-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SWCJ爬虫框架大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

SWCJ(中退网,暑假维护)

什么是SWCJ

SWCJ是一个基于jsoup和反射机制的java爬虫框架,能够使你的爬虫与代码分离开,降低解耦性,同时

你的爬虫可以通过配置文件来配置,这意味这当你的某些需求更改时,能直接修改配置文件而不必去修改你的代码

他能干什么

它能使你的配置地狱更加地狱(呸

他能使你通过几个简单的配置来实现一个爬虫的具体实施

关于作者与不完善之处,求生欲极强

这只是一个不成熟作品,我完成他仅用了一周,他可能有大量不完美之处,我正在不断的完善,目前基础功能已经完成,所以先发出来, SWCJ爬虫框架: 一个通过配置文件实现爬虫的框架 (gitee.com)

jar包见仓库附件

使用详解

首先你需要一个配置文件,里面有部分不是必要的

然后通过xml工厂类(Xmlfactory)获取一个配置文件的所有实例

就可以通过工厂获取爬虫的实例,强转成接口就可以直接调用方法

一个返回字符串的简单具体实例

1.导入jar包(废话),暂不完善,并未上传maven

2.定义一个接口

import com.midream.sheep.swsj.Annotation.WebSpider;

public interface test {
    @WebSpider("getHtml")//url的id,返回值与传参需要与配置文件一致
    String[] getData(int count);
    @WebSpider("getli")//支持多方法,非传参
    String[] getLi();
}

3.配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<SWCL>
    <config>
        <constructionSpace isAbsolute="false" workSpace="E:\临时文件"/>
        <timeout value="10000"/>
        <createTactics isCache="true"/>
    </config>
    <swc id="getHtml">
        <parenTinterface class="com.midream.sheep.test"/>
        <url name="getHtml" inPutName="count">
            <type type="GET"/>
            <path path="https://pic.netbian.com/index_#{Count}.html"/>
            <parseProgram  isHtml="true">
                <jsoup>
                    <pa>
                        #main>div.slist>ul.clearfix>li>a
                    </pa>
                </jsoup>
            </parseProgram>
        </url>
        <url name="getli" inPutName="">
            <type type="GET"/>
            <path path="https://pic.netbian.com/index_5.html"/>
            <parseProgram  isHtml="true">
                <jsoup>
                    <pa>
                        #main>div.slist>ul.clearfix>li
                    </pa>
                </jsoup>
            </parseProgram>
        </url>
    </swc>
</SWCL>

一个是有传参,一个是不传参,传参可传参改变值,参数数量可自定义,但是只能为基本数据类型(推荐String)

4.调方法

XmlFactory xf = null;
        try {
            xf = new XmlFactory(XmlFactory.class.getClassLoader().getresource("").getPath()+"com/midream/sheep/test.xml");
            test getHtml = (test)xf.getWebSpider("getHtml");
            String[] li = getHtml.getLi();
            for (String s : li) {
                System.out.println(s);
            }

调XmlFactory获取配置,通过工厂获取类(注:需要强转)

5.直接通过接口调

一个返回javabean的复杂实例(较为详细)

定义配置文件

首先我们需要目标:

SWCJ爬虫框架

我们需要获取他的所有章节信息,所以需要封装一个章节实体类

public class Page {
    private String title;
    private String writer;

    public String getWriter() {
        return writer;
    }

    public void setWriter(String writer) {
        this.writer = writer;
    }

    private String url;

    public String gettitle() {
        return title;
    }

    public void settitle(String titlE) {
        this.title = title;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        thiS.Url = url;
    }
}

然后配置xml配置文件

首先配置一个工作空间和缓冲策略

    <config>
        <constructionSpace isAbsolute="false" workSpace="E:\临时文件"/>
        <timeout value="10000"/>
        <userAgent>
            <value>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62</value>
            <value>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)</value>
            <value>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)</value>
        </userAgent>
        <createTactics isCache="true"/>
    </config>

然后定义一个接口与方法并绑定到标签中

public interface TestWeb {
    @WebSpider("getAllPages")
    Page[] getAllPages(String in);//返回值必须为数组
}
<swc id="test">
        <!--父类接口,爬虫通过接口调-->
        <parenTinterface class="com.midream.demo.interfaces.TestWeb"/>
        <url name="getAllPages" inPutName="novelName">
            <type type="GET"/>
            <!--url链接-->
            <path path="https://www.qbiqu.com/modules/article/search.php?searchkey=#{novelNamE}"/>
        </url>
    </swc>

配置爬虫策略

            <parseProgram  isHtml="false">
<!--                <regular reg="href="/>-->
                <!--jsoup可以分为多层解析
                即一次<pa>就是一次解析
                not 排除固定文本
                -->
                <jsoup name="writer">
                    <pa not="" step="1" element="">
                        #nr>td.odd
                    </pa>
                </jsoup>
                <jsoup name="title">
                    <pa not="" step="0" element="">
                        #nr>td.odd>a
                    </pa>
                </jsoup>
                <jsoup name="url">
                    <pa not="" step="0" element="abs:href">
                        #nr>td.odd>a
                    </pa>
                </jsoup>
            </parseProgram>

整个xml

<?xml version="1.0" encoding="UTF-8" ?>
<SWCJ>
    <config>
        <constructionSpace isAbsolute="false" workSpace="E:\临时文件"/>
        <timeout value="10000"/>
        <userAgent>
            <value>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62</value>
            <value>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)</value>
            <value>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)</value>
        </userAgent>
        <createTactics isCache="true"/>
    </config>
    <swc id="test">
        <parenTinterface class="com.midream.demo.interfaces.TestWeb"/>
        <url name="getAllPages" inPutName="novelName">
            <type type="GET"/>
            <path path="https://www.qbiqu.com/modules/article/search.php?searchkey=#{novelNamE}"/>
            <parseProgram  isHtml="false">
                <jsoup name="writer">
                    <pa not="" allStep="1" step="1" element="">
                        #nr>td.odd
                    </pa>
                </jsoup>
                <jsoup name="title">
                    <pa not="" step="0" element="">
                        #nr>td.odd>a
                    </pa>
                </jsoup>
                <jsoup name="url">
                    <pa not="" step="0" element="abs:href">
                        #nr>td.odd>a
                    </pa>
                </jsoup>
            </parseProgram>
        </url>
    </swc>
</SWCJ>

调用

        XmlFactory xf = new XmlFactory("E:\\item\\webDemo\\out\\production\\webDemo\\test.xml");
        TestWeb test = (TestWeb) xf.getWebSpider("test");
        Page[] pages = test.getAllPages("%CD%F2%B9%C5");

不完善,欢迎提出bug

xml配置模板

<?xml version="1.0" encoding="UTF-8" ?>
<SWCJ>
    <!--全局配置-->
    <config>
        <!--工作空间,生成的字节码会存储到里面
        isAbsolute->是否是相对路径
        workplace->文件夹路径
        -->
        <constructionSpace isAbsolute="false" workSpace="E:\临时文件"/>
        <!--超时时间,请求超过这个时间报异常
        value->超时具体时间
        -->
        <timeout value="10000"/>
        <!--userAgrnt数据
        value->具体的userAgent文本
        -->
        <userAgent>
            <value>Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.71 Safari/537.36 Edg/97.0.1072.62</value>
            <value>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)</value>
            <value>User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)</value>
        </userAgent>
        <!--爬虫策略
        cache缓存,将生成的类直接转为字节码加载
        非缓存,不会保存具体的对象
        -->
        <createTactics isCache="true"/>
    </config>
    <!--具体的某个爬虫类
         id 获取的标识
        -->
    <swc id="getHtml">
        <!--局部爬虫使用的cookies文本
        格式 键:值;···
        -->
        <cookies>
            uuid_tt_dd=4646545646-1642571061362-956268; UserName=xmdymcsheepsir;
        </cookies>
        <!--父类接口,爬虫通过接口调-->
        <parenTinterface class="com.midream.sheep.WebTest"/>
        <!--请求配置
        一个配置对应一个方法
        name——>注解名
        inPutName 下文中使用的参数名
        -->
        <url name="getHtml" inPutName="">
            <!--请求类型
            当前仅支持POST和GET请求
            type="POST||GET"
            -->
            <type type="GET"/>
            <!--url链接-->
            <path path="https://pic.netbian.com/index_5.html"/>
            <!--解析html方案
            并不支持同时使用
            <regular>正则表达式 正则特殊值 ALL 即为返回所有文本(经过迭代不知道是否正常)
            <jsoup>jsoup配置-->
            <parseProgram  isHtml="false">
<!--                <regular reg="href="/>-->
                <!--jsoup可以分为多层解析
                一个jsoup就是一次解析
                即一次<pa>就是一次解析
                not 排除固定文本
                name 注入的属性
                -->
                <jsoup name="writer">
                    <!--pa可配置属性来选取目标Document
                    not 排除文本
                    step跳过的步长
                    element获取元素(加上abs:是绝对链接)
                    allStep每次跳过的步长
                    -->
                    <pa not="下一页" allStep="0" step="4" element="#{Count}">
                        #main>div.slist>ul>li>a
                    </pa>
                </jsoup>
            </parseProgram>
        </url>
    </swc>
</SWCJ>

全篇完,欢迎大佬提出意见,目前优化思路见链接

大佬总结

以上是大佬教程为你收集整理的SWCJ爬虫框架全部内容,希望文章能够帮你解决SWCJ爬虫框架所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: