基于SpringBoot和Vue的分布式爬虫系统(JavaWeb)
前言
本期案例分享,學長給大家上點干貨,手把手帶你開發一個分布式爬蟲系統。通過這個項目,你將學習到下面幾點:
架構設計。如果設計一個通用的爬蟲系統?一個系統支持爬取所有的網站。
分布式開發經驗。分布式系統開發考慮的點會更多,如何保證代碼在多節點部署時還能正確的運行?
多線程開發經驗。大量使用了concurrent包中的多線程類,多線程、線程池、鎖。結合真實的業務場景教你怎么玩轉多線程,跟你平時寫的多線程demo是完全不同的。
鄭重聲明:本項目的出發點是學習和技術分享,項目中出現的爬蟲案例也都是互聯網上可以公開訪問的網站,爬取時嚴格控制了爬取頻率以及爬取速度(單線程去爬取,每爬取一個頁面休眠1秒,最多爬取100個頁面),絕不會影響目標網站的正常運行。
項目架構
爬蟲組件
上面是爬蟲系統的經典架構圖,簡單說下每個組件的職責:
Spiders:每個spider負責處理一個特殊的網站,負責抽取目標網站的數據
Scheduler:調度器從引擎接受request并將他們入隊,以便之后引擎請求他們時提供給引擎
Downloader:根據request對象去執行網絡下載
Pipeline:負責將spider抽取出來的item數據進行存儲,這里我們存儲在MySQL
最后我們合起來說明下爬蟲流程:
1.首先創建一個spider爬蟲任務,這時候會有一個入口URL,spider從這個入口開始爬取
2.調用Downloader組件去執行http請求下載整個頁面
3.spider解析頁面中的內容,將需要的內容放入item里面,同時將頁面中的子URL放入Scheduler組件
4.Pipeline負責將item中的數據就行持久化存儲
5.URL放入Scheduler組件,Scheduler組件會對URL進行去重,避免重復爬取
6.spider爬完當前頁面后就繼續從Scheduler拿URL,如果有URL則繼續爬取,沒有則說明所有頁面都爬完了,spider任務結束
分布式爬蟲
什么是分布式爬蟲?用大白話來說就是:我部署了多個爬蟲模塊,這幾個模塊可以一起來爬蟲。從上面架構圖的分析,只需要將Scheduler模塊基于redis實現,那么所有的模塊的spider只需要從redis獲取URL,然后爬到新的子URL時也放入redis中,此時我們的架構已經是支持分布式爬蟲了。(代碼細節較多,文章篇幅有限,不展開細說了)
定制化爬蟲
對于一些頁面靜態化的網站,做了SEO可以直接被搜索引擎爬取的網站、沒有做反爬的網站,這些網站我們是可以定制一個通用的爬蟲策略來爬取,直接http請求,然后解析內容和圖片等資源。而對于一些做了反爬策略的,例如分頁的數據、動態渲染的網頁、請求頭攔截、ip高頻攔截等等。對于這類網站的爬蟲需要做一些定制化的邏輯,所以在架構設計上,學長提供了一個爬蟲訂制模板的入口,通過在代碼中開發針對具體網站的定制化爬蟲策略,這樣就可以避開大多數的反爬規則,從而實現一個爬蟲系統可以支持絕大多數的網站爬取。
領域模型
DO(DataObject):與數據庫表結構一一對應,通過DAO層向上傳輸數據源對象
BO(BusinessObject):業務對象。由Service層輸出的封裝業務邏輯的對象
VO(View Object):顯示層對象,通常是Web向模板渲染引擎層傳輸的對象
BO和VO領域模型又分為BoRequest(輸入模型)、BoResponse(輸出模型)、VoRequest(輸入模型)、VoResponse(輸出模型)
技術棧
前端:vue + element
后端:jdk1.8 + springboot + redis + mysql + jsoup + httpClient
權限:security+spring-session
接口設計
整個項目接口采用的目前互聯網比較流行的restful風格設計,每個接口、每個參數都有詳細的文檔說明。因為企業中開發必然是團隊協作,必然前后端分離的開發模式,你得先把接口定義出來,然后前端可以和后端同步開發。還有一種就是對外提供接口,比如你們隔壁團隊也想調用你這個服務的接口,但是你兩排期是同一周,這時候你得先把接口定義出來給人家,然后大家同步開發,開發完了之后再進行聯調。
運行效果
系統登錄
dashboard
實時統計系統數據
任務管理
頁面菜單、“查詢”、“創建”、“編輯”、“刪除”按鈕都支持單獨的權限分配,這里列舉了爬蟲案例,“爬取百度新聞”、“爬取必應壁紙”、“爬取當當網書籍信息”、“爬取新浪新聞”
創建爬蟲任務
爬取必應壁紙
很多人用必應搜索是因為喜歡必應的高清壁紙(學長就是這樣的),這里演示必應壁紙的爬蟲。因為必應壁紙涉及分頁,這里剛好用到我們的訂制模板功能,通過寫一個BingTemplate模板,我們可以輕松地搞定分頁數據爬蟲。
文明爬蟲,我們只爬了100頁數據,每頁的圖片都在資源詳情里面,非常漂亮,可以點擊放大圖片并下載
爬取當當網
之前學長在專欄分享過《圖書管理系統》,當時為了讓內容更真實,從當當網爬取了一些書籍信息,比如書名、作者、出版社、價格、簡介等信息。(感興趣的可以去專欄回顧下圖書管理系統的設計和實現)
訂制一個當當網的爬蟲模板DangDangTemplate,只須一個URL,開始我們的訂制爬蟲之旅。
爬取百度和新浪新聞
百度新聞和新浪新聞都比較好爬,不需要模板,直接新建任務,只需要填入一個URL,立即開始爬蟲。
資源管理
所有爬取到的數據都可以在資源管理界面查詢到,點擊“資源詳情”可以看到具體的文本、圖片內容,圖片支持放大、下載、以及幻燈片播放
模板管理
前面已經說過,對于有反爬策略的網站和定制化的爬蟲都可以通過開發一個爬蟲模板來實現,這樣的設計對系統擴展性是非常好的,等于說一個爬蟲系統可以爬取所有的內容。
日志管理
日志管理默認是開給管理員的,在系統中的所有操作都會被記錄,在系統出現異常時也便于管理員進行問題排查。
用戶管理
默認也是只有管理員擁有用戶管理菜單的權限,可以新建/編輯用戶、分配用戶角色、禁用/啟用等操作
編輯用戶信息
擁有賬號編輯權限的用戶可以進行編輯操作
角色管理
默認也是只有管理員擁有角色管理菜單的權限,這里的權限是細粒度到按鈕權限的,每個按鈕都可以進行權限管理,假如給用戶只分配了任務的“查詢”權限,但是這個用戶是個程序員,他想通過接口請求直接訪問任務修改接口,這時候后端是會權限校驗的,返回“未授權”的錯誤碼,然后前端根據“未授權”錯誤碼會重定向到一個403頁面(這也是為什么說只有前端校驗是不安全的,后端也必須得校驗,這在實際企業里開發也是這樣的,還沒有實際開發經驗的學弟學妹拿個小本本記一記,哈哈哈)
權限設計
權限基于security和spring-session實現。權限可以分為認證和授權,認證其實就是登錄,用戶登錄時會進行賬號密碼的校驗,校驗成功后會,會把session存入redis中。授權指的是用戶是否擁有訪問后端資源的權限,每個新用戶在創建后都會分配角色,角色其實就是一個權限集合,這里的權限可以理解為訪問后端一個個接口(資源)的權限。
這里權限設計的非常靈活,細粒度到按鈕級別,比如課程菜單的新增、刪除、修改、查詢動作,學生可能只有課程的查詢權限,無法新增和修改課程,即使通過接口直接訪問后端的修改或者新增接口,后端也會返回授權失敗錯誤,因為后端每個需要權限的接口都打了權限標識,只有擁有資源權限用戶才能訪問。
日志方案
日志采用lombok注解+slf4j+log4j2的實現方案,基于profile實現了多環境的日志配置,因為不同環境的日志打印策略是不一樣,比如開發環境我可能需要打印到console控制臺,需要debug級別的日志以便于本地開發調試,測試環境可能就需要打印到日志文件里,線上環境可能需要打印到文件的同時將日志發送到kafka然后收集到es中,這樣當線上部署了多臺機器后我們查日志不用一臺一臺機器去查日志了,因為都收集到es了,我們只需要登錄kibana去搜索,這樣就非常方便。這里說到的kafka+es+kibana這樣一套日志解決方案也是目前互聯網公司比較常用的一套解決方案。如果你動手能力夠強,你可以本地搭一套kafka、es、kibana,然后只需要在配置文件中加入幾行配置就實現了這么一套企業級的日志解決方案(默認是輸出到日志文件)。
下面是部分關鍵配置,如果要配置kafka,只需要在標簽中配置配置即可
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN" xmlns:xi="http://www.w3.org/2001/XInclude"><Properties><Property name="LOG_FILE">system.log</Property><Property name="LOG_PATH">./logs</Property><Property name="PID">????</Property><Property name="LOG_EXCEPTION_CONVERSION_WORD">%xwEx</Property><Property name="LOG_LEVEL_PATTERN">%5p</Property><Property name="LOG_DATE_FORMAT_PATTERN">yyyy-MM-dd HH:mm:ss.SSS</Property><Property name="CONSOLE_LOG_PATTERN">%clr{%d{${LOG_DATE_FORMAT_PATTERN}}}{faint} %clr{${LOG_LEVEL_PATTERN}} %clr{${sys:PID}}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property><Property name="FILE_LOG_PATTERN">%d{${LOG_DATE_FORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} ${sys:PID} --- [%t] %-40.40c{1.}:%L : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}</Property></Properties><Appenders><xi:include href="log4j2/file-appender.xml"/></Appenders><Loggers><logger name="com.senior.book" level="info"/><Root level="info"><AppenderRef ref="FileAppender"/></Root></Loggers> </Configuration>服務監控
服務監控基于 Actuator + Prometheus + Grafana 實現,代碼侵入很小,只需要在pom中加入依賴。數據大盤Dashboard可以自己設置,也可以去Dashboard市場下載你想要的模板,總之,這塊完全是看動手能力,大家自己玩吧~~~
<!--服務監控--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId> </dependency>
感興趣的可以聯系:
總結
以上是生活随笔為你收集整理的基于SpringBoot和Vue的分布式爬虫系统(JavaWeb)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基于SpringBoot和Vue的个人博
- 下一篇: SVM数学过程