SWCJ爬蟲框架
- 2022 年 1 月 26 日
- 筆記
- JAVA, sheepDream寫的Blog
SWSJ
什麼是SWSJ
SWSJ是一個基於jsoup和正則表達式的java爬蟲框架,能夠使你的爬蟲與程式碼分離開,降低解耦性,同時
你的爬蟲不是通過程式碼,而是通過配置文件來配置,這意味這當你的某些需求更改時,能直接修改配置文件而不必去修改你的程式碼
他能幹什麼
它能使你的配置地獄更加地獄(呸
他能使你通過幾個簡單的爬蟲來實現一個爬蟲的具體實施
關於作者與不完善之處,求生欲極強
這只是一個14的少年的不成熟作品,我完成他僅用了三天,他可能有大量不完美之處,我正在不斷的完善,目前已經勉強能用,所以先發出來, SWSJ爬蟲框架: 一個通過配置文件實現爬蟲的框架 (gitee.com) (開源)
優化目標:優化異常,優化傳入參數,優化返回值獲取,優化額外方法處理……
jar包見鏈接
使用詳解
首先你需要一個配置文件,裡面有部分不是必要的
具體實例(解析見下方)
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="//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="//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="//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
模擬瀏覽器,繞過檢驗
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[]
全篇完,歡迎大佬提出意見,目前優化思路見鏈接