SWCJ爬虫框架 – MD&One
SWSJ
什么是SWSJ
SWSJ是一个基于jsoup和正则表达式的java爬虫框架,能够使你的爬虫与代码分离开,降低解耦性,同时
你的爬虫不是通过代码,而是通过配置文件来配置,这意味这当你的某些需求更改时,能直接修改配置文件而不必去修改你的代码
他能干什么
它能使你的配置地狱更加地狱(呸
他能使你通过几个简单的爬虫来实现一个爬虫的具体实施
关于作者与不完善之处,求生欲极强
这只是一个14的少年的不成熟作品,我完成他仅用了三天,他可能有大量不完美之处,我正在不断的完善,目前已经勉强能用,所以先发出来, SWSJ爬虫框架: 一个通过配置文件实现爬虫的框架 (gitee.com) (开源)
优化目标:优化异常,优化传入参数,优化返回值获取,优化额外方法处理……
jar包见https://download.csdn.net/download/xmdymcsheepsir/77950929
(注:可免费下载)
使用详解
首先你需要一个配置文件,里面有部分不是必要的
具体实例(解析见下方)
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">
<cookies>
</cookies>
<parentInterface class="com.midream.sheep.test"/>
<url name="getHtml" inPutType="int" inPutName="count">
<type type="GET"/>
<url path="https://pic.netbian.com/index_#{count}.html"/>
<parseProgram isHtml="true">
<jsoup>
<pa>
#main>div.slist>ul.clearfix>li>a
</pa>
</jsoup>
</parseProgram>
<returnType type="String[]"/>
</url>
<url name="getli" inPutType="" inPutName="">
<type type="GET"/>
<url path="https://pic.netbian.com/index_5.html"/>
<parseProgram isHtml="true">
<jsoup>
<pa>
#main>div.slist>ul.clearfix>li
</pa>
</jsoup>
</parseProgram>
<returnType type="String[]"/>
</url>
</swc>
</SWCL>
一个是有传参,一个是不传参,传参可传参改变值
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.直接通过接口调
xml
<?xml version="1.0" encoding="UTF-8" ?>
<SWCL>
<!--全局配置-->
<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缓存,将生成的类直接转为字节码加载
非缓存,将生成的类输出到本地class在加载
-->
<createTactics isCache="false"/>
</config>
<!--具体的某个爬虫类
inPutType:传入的数值类型(可以为空)
id 获取的方式
下面使用传入值时使用的标识符(可以为空)-->
<swc id="getHtml">
<!--局部爬虫使用的cookies文本
格式 键:值;···
-->
<cookies>
uuid_tt_dd=4646545646-1642571061362-956268; UserName=xmdymcsheepsir;
</cookies>
<!--父类接口,爬虫通过接口调-->
<parentInterface class="com.midream.sheep.TestWeb"/>
<!--请求配置
一个配置对应一个方法
-->
<url name="getHtml" inPutType="" inPutName="">
<!--请求类型
当前仅支持POST和GET请求
type="POST||GET"
-->
<type type="GET"/>
<!--url链接-->
<url path="https://pic.netbian.com/index_#{count}.html"/>
<!--解析html方案
并不支持同时使用
<regular>正则表达式 正则特殊值 ALL 即为返回所有文本
<jsoup>jsoup配置-->
<parseProgram isHtml="false">
<!-- <regular reg="href="/>-->
<!--jsoup可以分为多层解析
即一次<pa>就是一次解析
-->
<jsoup>
<!--pa可配置属性来选取目标Document
#id 通过id选择
htmlName 通过标签名选择
name.class 通过类选择
-->
<pa>
#main>div.slist>ul>li>a
</pa>
</jsoup>
</parseProgram>
<!--返回值类型
基本数据类型直接用,
引用类型必须全类名如:java.lang.String
-->
<returnType type="String[]"/>
</url>
</swc>
</SWCL>
解读
SWCJ
这是获取的根标签,是程序识别的窗口,这是必要的
config
这是全局配置,其中都可以省略,不过工作空间推荐选择
constructionSpace
工作空间,字节码的生成的文件夹
isAbsolute–是否是相对路径,相对路径是相对于当前项目的路径
workSpace–路径,具体的文件夹路径
timeout
超时时间,默认是1000毫秒,可自定义或省略
userAgent
模拟浏览器,绕过检验是具体的单个userAgent,默认配置有一个,可省略
createTactics
创建策略:isCache是否有缓存
swc
具体的一个接口,
id获取爬虫类的标识符
cookies
可携带cookie进行爬虫
parentInterface
父接口,通过接口调方法
class 接口的类全名
url
具体的一个爬虫方法
id 方法的注解标识
inPutType,inPutName(传入值,传入值的调用名(调用用#{inputname}),需与接口一致
type
type:获取类型,有get和POST(暂不完善)供选择
url
path 具体的一个超链接
parseProgram
爬虫策略,有jsoup和正则表达式(不推荐)两种
策略选择见xml注释
returnType
返回值类型,暂只支持String和String[]
全篇完,欢迎大佬提出意见,目前优化思路见链接