很多同學(xué)會(huì)問:“為什么我的畢業(yè)設(shè)計(jì)總是過不了?為什么我的畢設(shè)分?jǐn)?shù)很低?”這種情況要么就是你的畢設(shè)" />

国产成人精品无码青草_亚洲国产美女精品久久久久∴_欧美人与鲁交大毛片免费_国产果冻豆传媒麻婆精东

15158846557 在線咨詢 在線咨詢
15158846557 在線咨詢
所在位置: 首頁 > 營(yíng)銷資訊 > 網(wǎng)站運(yùn)營(yíng) > 畢業(yè)設(shè)計(jì)-分布式爬蟲系統(tǒng)(干貨)

畢業(yè)設(shè)計(jì)-分布式爬蟲系統(tǒng)(干貨)

時(shí)間:2023-06-07 17:27:01 | 來源:網(wǎng)站運(yùn)營(yíng)

時(shí)間:2023-06-07 17:27:01 來源:網(wǎng)站運(yùn)營(yíng)

畢業(yè)設(shè)計(jì)-分布式爬蟲系統(tǒng)(干貨):SpringBoot+Vue 分布式爬蟲系統(tǒng)https://www.zhihu.com/video/1433061839387627520前言

很多同學(xué)會(huì)問:“為什么我的畢業(yè)設(shè)計(jì)總是過不了?為什么我的畢設(shè)分?jǐn)?shù)很低?”這種情況要么就是你的畢設(shè)做得過于粗糙,要么就是功能過于簡(jiǎn)單,給導(dǎo)師的感覺就是很容易就能實(shí)現(xiàn),你小子壓根沒花時(shí)間去做。你們說是不是這個(gè)理兒?

本期案例分享,學(xué)長(zhǎng)給大家上點(diǎn)干貨,手把手帶你開發(fā)一個(gè)分布式爬蟲系統(tǒng)。通過這個(gè)項(xiàng)目,你將學(xué)習(xí)到下面幾點(diǎn):

  1. 架構(gòu)設(shè)計(jì)。如果設(shè)計(jì)一個(gè)通用的爬蟲系統(tǒng)?一個(gè)系統(tǒng)支持爬取所有的網(wǎng)站。
  2. 分布式開發(fā)經(jīng)驗(yàn)。分布式系統(tǒng)開發(fā)考慮的點(diǎn)會(huì)更多,如何保證代碼在多節(jié)點(diǎn)部署時(shí)還能正確的運(yùn)行?
  3. 多線程開發(fā)經(jīng)驗(yàn)。大量使用了concurrent包中的多線程類,多線程、線程池、鎖。結(jié)合真實(shí)的業(yè)務(wù)場(chǎng)景教你怎么玩轉(zhuǎn)多線程,跟你平時(shí)寫的多線程demo是完全不同的。
鄭重聲明本項(xiàng)目的出發(fā)點(diǎn)是學(xué)習(xí)和技術(shù)分享,項(xiàng)目中出現(xiàn)的爬蟲案例也都是互聯(lián)網(wǎng)上可以公開訪問的網(wǎng)站,爬取時(shí)嚴(yán)格控制了爬取頻率以及爬取速度(單線程去爬取,每爬取一個(gè)頁面休眠1秒,最多爬取100個(gè)頁面),絕不會(huì)影響目標(biāo)網(wǎng)站的正常運(yùn)行。

獲取源碼:




視頻教程

項(xiàng)目架構(gòu)

爬蟲組件




上面是爬蟲系統(tǒng)的經(jīng)典架構(gòu)圖,簡(jiǎn)單說下每個(gè)組件的職責(zé):

最后我們合起來說明下爬蟲流程:

  1. 首先創(chuàng)建一個(gè)spider爬蟲任務(wù),這時(shí)候會(huì)有一個(gè)入口URL,spider從這個(gè)入口開始爬取
  2. 調(diào)用Downloader組件去執(zhí)行http請(qǐng)求下載整個(gè)頁面
  3. spider解析頁面中的內(nèi)容,將需要的內(nèi)容放入item里面,同時(shí)將頁面中的子URL放入Scheduler組件
  4. Pipeline負(fù)責(zé)將item中的數(shù)據(jù)就行持久化存儲(chǔ)
  5. URL放入Scheduler組件,Scheduler組件會(huì)對(duì)URL進(jìn)行去重,避免重復(fù)爬取
  6. spider爬完當(dāng)前頁面后就繼續(xù)從Scheduler拿URL,如果有URL則繼續(xù)爬取,沒有則說明所有頁面都爬完了,spider任務(wù)結(jié)束

分布式爬蟲

什么是分布式爬蟲?用大白話來說就是:我部署了多個(gè)爬蟲模塊,這幾個(gè)模塊可以一起來爬蟲。從上面架構(gòu)圖的分析,只需要將Scheduler模塊基于redis實(shí)現(xiàn),那么所有的模塊的spider只需要從redis獲取URL,然后爬到新的子URL時(shí)也放入redis中,此時(shí)我們的架構(gòu)已經(jīng)是支持分布式爬蟲了。(代碼細(xì)節(jié)較多,文章篇幅有限,不展開細(xì)說了)

定制化爬蟲

對(duì)于一些頁面靜態(tài)化的網(wǎng)站,做了SEO可以直接被搜索引擎爬取的網(wǎng)站、沒有做反爬的網(wǎng)站,這些網(wǎng)站我們是可以定制一個(gè)通用的爬蟲策略來爬取,直接http請(qǐng)求,然后解析內(nèi)容和圖片等資源。而對(duì)于一些做了反爬策略的,例如分頁的數(shù)據(jù)、動(dòng)態(tài)渲染的網(wǎng)頁、請(qǐng)求頭攔截、ip高頻攔截等等。對(duì)于這類網(wǎng)站的爬蟲需要做一些定制化的邏輯,所以在架構(gòu)設(shè)計(jì)上,學(xué)長(zhǎng)提供了一個(gè)爬蟲訂制模板的入口,通過在代碼中開發(fā)針對(duì)具體網(wǎng)站的定制化爬蟲策略,這樣就可以避開大多數(shù)的反爬規(guī)則,從而實(shí)現(xiàn)一個(gè)爬蟲系統(tǒng)可以支持絕大多數(shù)的網(wǎng)站爬取。

領(lǐng)域模型

技術(shù)棧

前端:vue + element

后端:jdk1.8 + springboot + redis + mysql + jsoup + httpClient

權(quán)限:security+spring-session

接口設(shè)計(jì)

整個(gè)項(xiàng)目接口采用的目前互聯(lián)網(wǎng)比較流行的restful風(fēng)格設(shè)計(jì),每個(gè)接口、每個(gè)參數(shù)都有詳細(xì)的文檔說明。因?yàn)槠髽I(yè)中開發(fā)必然是團(tuán)隊(duì)協(xié)作,必然前后端分離的開發(fā)模式,你得先把接口定義出來,然后前端可以和后端同步開發(fā)。還有一種就是對(duì)外提供接口,比如你們隔壁團(tuán)隊(duì)也想調(diào)用你這個(gè)服務(wù)的接口,但是你兩排期是同一周,這時(shí)候你得先把接口定義出來給人家,然后大家同步開發(fā),開發(fā)完了之后再進(jìn)行聯(lián)調(diào)。

運(yùn)行效果

系統(tǒng)登錄

dashboard

實(shí)時(shí)統(tǒng)計(jì)系統(tǒng)數(shù)據(jù)

任務(wù)管理

頁面菜單、“查詢”、“創(chuàng)建”、“編輯”、“刪除”按鈕都支持單獨(dú)的權(quán)限分配,這里列舉了爬蟲案例,“爬取百度新聞”、“爬取必應(yīng)壁紙”、“爬取當(dāng)當(dāng)網(wǎng)書籍信息”、“爬取新浪新聞”

創(chuàng)建爬蟲任務(wù)

爬取必應(yīng)壁紙

很多人用必應(yīng)搜索是因?yàn)橄矚g必應(yīng)的高清壁紙(學(xué)長(zhǎng)就是這樣的),這里演示必應(yīng)壁紙的爬蟲。因?yàn)楸貞?yīng)壁紙涉及分頁,這里剛好用到我們的訂制模板功能,通過寫一個(gè)BingTemplate模板,我們可以輕松地搞定分頁數(shù)據(jù)爬蟲。

文明爬蟲,我們只爬了100頁數(shù)據(jù),每頁的圖片都在資源詳情里面,非常漂亮,可以點(diǎn)擊放大圖片并下載

爬取當(dāng)當(dāng)網(wǎng)

之前學(xué)長(zhǎng)在專欄分享過《圖書管理系統(tǒng)》,當(dāng)時(shí)為了讓內(nèi)容更真實(shí),從當(dāng)當(dāng)網(wǎng)爬取了一些書籍信息,比如書名、作者、出版社、價(jià)格、簡(jiǎn)介等信息。(感興趣的可以去專欄回顧下圖書管理系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn))

訂制一個(gè)當(dāng)當(dāng)網(wǎng)的爬蟲模板DangDangTemplate,只須一個(gè)URL,開始我們的訂制爬蟲之旅。

爬取百度和新浪新聞

百度新聞和新浪新聞都比較好爬,不需要模板,直接新建任務(wù),只需要填入一個(gè)URL,立即開始爬蟲。

資源管理

所有爬取到的數(shù)據(jù)都可以在資源管理界面查詢到,點(diǎn)擊“資源詳情”可以看到具體的文本、圖片內(nèi)容,圖片支持放大、下載、以及幻燈片播放

模板管理

前面已經(jīng)說過,對(duì)于有反爬策略的網(wǎng)站和定制化的爬蟲都可以通過開發(fā)一個(gè)爬蟲模板來實(shí)現(xiàn),這樣的設(shè)計(jì)對(duì)系統(tǒng)擴(kuò)展性是非常好的,等于說一個(gè)爬蟲系統(tǒng)可以爬取所有的內(nèi)容。

日志管理

日志管理默認(rèn)是開給管理員的,在系統(tǒng)中的所有操作都會(huì)被記錄,在系統(tǒng)出現(xiàn)異常時(shí)也便于管理員進(jìn)行問題排查。

用戶管理

默認(rèn)也是只有管理員擁有用戶管理菜單的權(quán)限,可以新建/編輯用戶、分配用戶角色、禁用/啟用等操作

編輯用戶信息

擁有賬號(hào)編輯權(quán)限的用戶可以進(jìn)行編輯操作

角色管理

默認(rèn)也是只有管理員擁有角色管理菜單的權(quán)限,這里的權(quán)限是細(xì)粒度到按鈕權(quán)限的,每個(gè)按鈕都可以進(jìn)行權(quán)限管理,假如給用戶只分配了任務(wù)的“查詢”權(quán)限,但是這個(gè)用戶是個(gè)程序員,他想通過接口請(qǐng)求直接訪問任務(wù)修改接口,這時(shí)候后端是會(huì)權(quán)限校驗(yàn)的,返回“未授權(quán)”的錯(cuò)誤碼,然后前端根據(jù)“未授權(quán)”錯(cuò)誤碼會(huì)重定向到一個(gè)403頁面(這也是為什么說只有前端校驗(yàn)是不安全的,后端也必須得校驗(yàn),這在實(shí)際企業(yè)里開發(fā)也是這樣的,還沒有實(shí)際開發(fā)經(jīng)驗(yàn)的學(xué)弟學(xué)妹拿個(gè)小本本記一記,哈哈哈)

權(quán)限設(shè)計(jì)

權(quán)限基于security和spring-session實(shí)現(xiàn)。權(quán)限可以分為認(rèn)證和授權(quán),認(rèn)證其實(shí)就是登錄,用戶登錄時(shí)會(huì)進(jìn)行賬號(hào)密碼的校驗(yàn),校驗(yàn)成功后會(huì),會(huì)把session存入redis中。授權(quán)指的是用戶是否擁有訪問后端資源的權(quán)限,每個(gè)新用戶在創(chuàng)建后都會(huì)分配角色,角色其實(shí)就是一個(gè)權(quán)限集合,這里的權(quán)限可以理解為訪問后端一個(gè)個(gè)接口(資源)的權(quán)限。

這里權(quán)限設(shè)計(jì)的非常靈活,細(xì)粒度到按鈕級(jí)別,比如課程菜單的新增、刪除、修改、查詢動(dòng)作,學(xué)生可能只有課程的查詢權(quán)限,無法新增和修改課程,即使通過接口直接訪問后端的修改或者新增接口,后端也會(huì)返回授權(quán)失敗錯(cuò)誤,因?yàn)楹蠖嗣總€(gè)需要權(quán)限的接口都打了權(quán)限標(biāo)識(shí),只有擁有資源權(quán)限用戶才能訪問。

日志方案

日志采用lombok注解+slf4j+log4j2的實(shí)現(xiàn)方案,基于profile實(shí)現(xiàn)了多環(huán)境的日志配置,因?yàn)椴煌h(huán)境的日志打印策略是不一樣,比如開發(fā)環(huán)境我可能需要打印到console控制臺(tái),需要debug級(jí)別的日志以便于本地開發(fā)調(diào)試,測(cè)試環(huán)境可能就需要打印到日志文件里,線上環(huán)境可能需要打印到文件的同時(shí)將日志發(fā)送到kafka然后收集到es中,這樣當(dāng)線上部署了多臺(tái)機(jī)器后我們查日志不用一臺(tái)一臺(tái)機(jī)器去查日志了,因?yàn)槎际占絜s了,我們只需要登錄kibana去搜索,這樣就非常方便。這里說到的kafka+es+kibana這樣一套日志解決方案也是目前互聯(lián)網(wǎng)公司比較常用的一套解決方案。如果你動(dòng)手能力夠強(qiáng),你可以本地搭一套kafka、es、kibana,然后只需要在配置文件中加入幾行配置就實(shí)現(xiàn)了這么一套企業(yè)級(jí)的日志解決方案(默認(rèn)是輸出到日志文件)。

下面是部分關(guān)鍵配置,如果要配置kafka,只需要在<Appenders>標(biāo)簽中配置<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>

服務(wù)監(jiān)控

服務(wù)監(jiān)控基于 Actuator + Prometheus + Grafana 實(shí)現(xiàn),代碼侵入很小,只需要在pom中加入依賴。數(shù)據(jù)大盤Dashboard可以自己設(shè)置,也可以去Dashboard市場(chǎng)下載你想要的模板,總之,這塊完全是看動(dòng)手能力,大家自己玩吧~~~

<!--服務(wù)監(jiān)控--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency>










關(guān)鍵詞:系統(tǒng),干貨,爬蟲,設(shè)計(jì),分布,畢業(yè)

74
73
25
news

版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。

為了最佳展示效果,本站不支持IE9及以下版本的瀏覽器,建議您使用谷歌Chrome瀏覽器。 點(diǎn)擊下載Chrome瀏覽器
關(guān)閉