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="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
模擬瀏覽器,繞過檢驗
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[]
全篇完,歡迎大佬提出意見,目前優化思路見連結