XXL-CRAWLER 是一個面向對象的分佈式爬蟲框架。一行代碼開發一個分佈式爬蟲,擁有"多線程、異步、IP動態代理、分佈式"等特性;css
源碼倉庫地址 | Release Download |
---|---|
https://github.com/xuxueli/xxl-crawler | Download |
https://gitee.com/xuxueli0323/xxl-crawler | Download |
(爬蟲示例代碼位於 /test 目錄下)html
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-crawler</artifactId> <version>1.2.0</version> </dependency>
在此推薦一款工具 "Chrome插件:Jquery Selector Helper",能夠直觀迅速的獲取頁面元素的Jquery cssQuery表達式。
// PageSelect 註解:從頁面中抽取出一個或多個VO對象; @PageSelect(cssQuery = "body") public static class PageVo { @PageFieldSelect(cssQuery = ".blog-heading .title") private String title; @PageFieldSelect(cssQuery = "#read") private int read; @PageFieldSelect(cssQuery = ".comment-content") private List<String> comment; // set get }
XxlCrawler crawler = new XxlCrawler.Builder() .setUrls("https://my.oschina.net/xuxueli/blog") .setWhiteUrlRegexs("https://my\\.oschina\\.net/xuxueli/blog/\\d+") .setThreadCount(3) .setPageParser(new PageParser<PageVo>() { @Override public void parse(Document html, Element pageVoElement, PageVo pageVo) { // 解析封裝 PageVo 對象 String pageUrl = html.baseUri(); System.out.println(pageUrl + ":" + pageVo.toString()); } }) .build();
crawler.start(true);
XXL-CRAWLER 是一個靈活高效、面向對象的Web爬蟲框架。;java
藉助 XXL-CRAWLER,一行代碼開發一個分佈式爬蟲。jquery
概念 | 說明 |
---|---|
XxlCrawler | 爬蟲對象,維護爬蟲信息 |
PageVo | 頁面數據對象,一張Web頁面可抽取一個或多個PageVo |
PageParser | 頁面解析器,綁定泛型PageVO後將會自動抽取頁面數據對象,同時支持運行時調整請求參數信息 |
功能:爬蟲對象,維護爬蟲信息,可選屬性以下。git
方法 | 說明 |
---|---|
setUrls | 待爬的URL列表 |
setAllowSpread | 容許擴散爬取,將會以現有URL爲起點擴散爬取整站 |
setWhiteUrlRegexs | URL白名單正則,非空時進行URL白名單過濾頁面 |
setIfPost | 請求方式:true=POST請求、false=GET請求 |
setUserAgent | UserAgent |
setParamMap | 請求參數 |
setCookieMap | 請求Cookie |
setTimeoutMillis | 超時時間,毫秒 |
setPauseMillis | 停頓時間,爬蟲線程處理完頁面以後進行主動停頓,避免過於頻繁被攔截; |
setProxyMaker | 代理生成器,支持設置代理IP,同時支持調整代理池實現動態代理; |
setThreadCount | 爬蟲併發線程數 |
setPageParser | 頁面解析器 |
setRunData | 設置運行時數據模型,默認提供LocalRunData單機模型,支持擴展實現分佈式模型; |
start | 運行爬蟲,可經過入參控制同步或異步方式運行 |
stop | 終止爬蟲 |
功能:描述頁面數據對象,經過該註解從頁面抽取PageVo數據信息,可選屬性以下。github
PageSelect | 說明 |
---|---|
cssQuery | CSS選擇器, 如 "#body" |
功能:描述頁面數據對象的屬性信息,經過該註解從頁面抽取PageVo的屬性信息,可選屬性以下。
(支持基礎數據類型 T ,包括 List<T>)多線程
PageFieldSelect | 說明 |
---|---|
cssQuery | CSS選擇器, 如 "#title" |
selectType | jquery 數據抽取方式,如 ".html()/.text()/.val()/.attr()"等 |
selectVal | jquery 數據抽取參數,SelectType=ATTR 時有效,如 ".attr("abs:src")" |
datePattern | 時間格式化,日期類型數據有效 |
以線程池方式並行運行,提供對應API(可參考"章節3.3")調整線程池大小,提升運行效率;架構
支持同步、異步兩種方式啓動運行。併發
ProxyMaker(代理生成器):實現代理支持的組件。支持設置代理IP,同時支持調整代理池實現動態代理;app
系統已經提供了兩種策略實現;
PageParser(頁面解析器):綁定泛型PageVO後將會自動抽取頁面數據對象,同時支持運行時調整請求參數信息;
內部方法 | 說明 |
---|---|
public void preLoad(PageLoadInfo pageLoadInfo) | 可選實現,發起頁面請求以前觸發調用,可基於此運行時調整請求參數; |
public void postLoad(Document html) | 可選實現,發起頁面請求以後觸發調用,可基於此運行時調整頁面數據; |
public abstract void parse(Document html, Element pageVoElement, T pageVo) | 必須實現,頁面抽離封裝每一個PageVO以後觸發調用,可基於此處理PageVO文檔或數據; |
支持自定義RunData(運行時數據模型)並結合Redis或DB共享運行數據來實現分佈式爬蟲。默認提供LocalRunData實現單機版爬蟲。
RunData:運行時數據模型,維護爬蟲運行時的URL和白名單規則。
RunData抽象方法 | 說明 |
---|---|
public abstract boolean addUrl(String link); | 新增一個待採集的URL,接口須要作URL去重,爬蟲線程將會獲取到並進行處理; |
public abstract String getUrl(); | 獲取一個待採集的URL,而且將它從"待採集URL池"中移除,而且添加到"已採集URL池"中; |
public abstract int getUrlNum(); | 獲取待採集URL數量; |
歡迎參與項目貢獻!好比提交PR修復一個bug,或者新建 Issue 討論新特性或者變動。
更多接入的公司,歡迎在 登記地址 登記,登記僅僅爲了產品推廣。
產品開源免費,而且將持續提供免費的社區技術支持。我的或企業內部可自由的接入和使用。
不管金額多少都足夠表達您這份心意,很是感謝 :) 前往捐贈