本發(fā)明涉及互聯(lián)網(wǎng)大數(shù)據(jù)的高效數(shù)據(jù)采集技術(shù)領(lǐng)域,尤其涉及一種分布式爬蟲系統(tǒng)及周期性增量抓取方法。
背景技術(shù):
網(wǎng)絡(luò)爬蟲是從一個(gè)或若干初始網(wǎng)頁的url(uniformresourcelocator,統(tǒng)一資源定位符)開始,獲得初始網(wǎng)頁上的url,在抓取網(wǎng)頁的過程中,根據(jù)不同的抓取策略,不斷從當(dāng)前頁面上抽取新的url放入任務(wù)隊(duì)列,直到滿足系統(tǒng)的停止條件。
隨著互聯(lián)網(wǎng)的高速發(fā)展,網(wǎng)絡(luò)數(shù)據(jù)呈現(xiàn)爆炸式增長,網(wǎng)絡(luò)數(shù)據(jù)源也越來越趨于多元化。面對如此龐大而多元化的互聯(lián)網(wǎng)數(shù)據(jù),如何提高網(wǎng)絡(luò)爬蟲的抓取效率,如何針對不同的數(shù)據(jù)源進(jìn)行可定制化的爬取策略,顯得至關(guān)重要。
相比于傳統(tǒng)單機(jī)爬蟲,分布式爬蟲可以明顯提高爬蟲的抓取效率,但隨之也引入了新的問題:分布式環(huán)境下多節(jié)點(diǎn)的任務(wù)下發(fā)問題、負(fù)載均衡問題、網(wǎng)頁重復(fù)性問題和周期性增量抓取問題等。
綜上所述,如何在解決分布式爬蟲帶來的一系列問題的同時(shí),能夠有效地提高爬蟲的抓取速度,并在此基礎(chǔ)上實(shí)現(xiàn)分布式爬蟲的周期性增量抓取是目前現(xiàn)有技術(shù)中存在的主要問題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明所要解決的技術(shù)問題是,提供一種分布式爬蟲系統(tǒng)及周期性增量抓取方法,解決如何將單機(jī)爬蟲有效的結(jié)合在一起,實(shí)現(xiàn)集群環(huán)境下高可用、高穩(wěn)定和高吞吐率的分布式爬蟲,并實(shí)現(xiàn)周期性增量抓取。本發(fā)明解決上述問題所采用的技術(shù)方案是:
本發(fā)明公開一種分布式爬蟲系統(tǒng),該系統(tǒng)被配置為基于zookeeper的分布式服務(wù)、系統(tǒng)組件和數(shù)據(jù)庫三大部分,其中,系統(tǒng)組件包括系統(tǒng)監(jiān)控組件monitor、協(xié)調(diào)組件coordinator、日志收集組件logger、基礎(chǔ)爬蟲組件spider,數(shù)據(jù)庫包括redis內(nèi)存數(shù)據(jù)庫,redis是key-value的存儲(chǔ)形式,redis內(nèi)存數(shù)據(jù)庫中存放有分布式url任務(wù)隊(duì)列和分布式bloomfilter;其中,基于zookeeper的分布式服務(wù)為各系統(tǒng)組件提供分布式協(xié)調(diào)服務(wù);所述系統(tǒng)監(jiān)控組件monitor負(fù)責(zé)系統(tǒng)的動(dòng)態(tài)配置和系統(tǒng)的狀態(tài)監(jiān)控;所述協(xié)調(diào)組件coordinator負(fù)責(zé)將種子url導(dǎo)入到基于redis的分布式任務(wù)隊(duì)列、周期性匯總各節(jié)點(diǎn)狀態(tài)到zookeeper、為日志收集組件logger動(dòng)態(tài)分配日志源和集群節(jié)點(diǎn)的檢測與管理中的一種或多種;所述日志收集組件logger負(fù)責(zé)從集群中各基礎(chǔ)爬蟲組件spider收集日志數(shù)據(jù);所述基礎(chǔ)爬蟲組件spider負(fù)責(zé)處理網(wǎng)頁的爬取任務(wù);所述基于redis的分布式url任務(wù)隊(duì)列負(fù)責(zé)存儲(chǔ)所有待爬取的任務(wù)url;所述基于redis的分布式bloomfilter負(fù)責(zé)集群中所有基礎(chǔ)爬蟲組件spider的url去重請求。
進(jìn)一步的,基于zookeeper的分布式服務(wù)通過與各系統(tǒng)組件相互協(xié)調(diào)工作,為各系統(tǒng)組件提供包括動(dòng)態(tài)配置、集群節(jié)點(diǎn)檢測與管理、master選舉、分布式鎖、全局url的id生成的分布式服務(wù)中的一種或多種。
進(jìn)一步的,系統(tǒng)監(jiān)控組件monitor具有monitor界面,用戶可以通過monitor界面修改存在于zookeeper上的系統(tǒng)配置參數(shù),集群中的協(xié)調(diào)組件coordinator、日志收集組件logger和基礎(chǔ)爬蟲組件spider會(huì)監(jiān)聽zookeeper上的相應(yīng)數(shù)據(jù)節(jié)點(diǎn),并在數(shù)據(jù)節(jié)點(diǎn)內(nèi)容被修改后得到相應(yīng)的通知,進(jìn)而根據(jù)修改后的配置參數(shù)做相應(yīng)調(diào)整。
進(jìn)一步的,monitor界面還能實(shí)時(shí)顯示存在于zookeeper上的各系統(tǒng)狀態(tài)參數(shù)和各組件狀態(tài)參數(shù)。
進(jìn)一步的,基礎(chǔ)爬蟲組件spider組件具有多種組件內(nèi)核,且各組件內(nèi)核的爬取策略不完全一致。
進(jìn)一步的,基礎(chǔ)爬蟲組件spider組件具有高擴(kuò)展性,以方便針對新的數(shù)據(jù)源編寫新的組件內(nèi)核。
進(jìn)一步的,分布式url任務(wù)隊(duì)列的任務(wù)分發(fā)方式采用基礎(chǔ)爬蟲組件spider的拉取(pull)方式。
進(jìn)一步的,分布式bloomfilter采用分段機(jī)制將bit向量分段存儲(chǔ)在redis不同的key之上,并通過分段樂觀鎖實(shí)現(xiàn)各基礎(chǔ)爬蟲組件spider訪問的同步性控制。
本發(fā)明還公開一種基于上述分布式爬蟲系統(tǒng)的周期性增量抓取方法,包括:協(xié)調(diào)組件coordinator周期性導(dǎo)入任務(wù)到分布式url任務(wù)隊(duì)列,并喚醒正在休眠的spider組件;spider組件根據(jù)當(dāng)前分布式url任務(wù)隊(duì)列的執(zhí)行情況進(jìn)行休眠或周期性增量抓取,在沒有抓取任務(wù)時(shí),spider組件就會(huì)進(jìn)入休眠狀態(tài),休眠的spider組件會(huì)被其他spider組件或coordinator組件喚醒時(shí)會(huì)繼續(xù)進(jìn)行抓取任務(wù)。
進(jìn)一步的,該方法包括如下步驟:
s1、協(xié)調(diào)組件coordinator周期性導(dǎo)入任務(wù)到分布式url任務(wù)隊(duì)列,并喚醒正在休眠的spider組件。即,系統(tǒng)的coordinator組件會(huì)周期性導(dǎo)入任務(wù)到分布式url隊(duì)列,任務(wù)導(dǎo)入后,coordinator會(huì)喚醒所有在休眠的spider組件開始新一輪的增量抓取任務(wù)。執(zhí)行抓取任務(wù)是周期性一直進(jìn)行的,每一個(gè)周期都是從導(dǎo)入種子任務(wù)開始。
s2、spider組件判斷是否結(jié)束系統(tǒng)周期性增量抓取,若為是,執(zhí)行s6,否則,執(zhí)行s3。即,spider組件中的抓取線程會(huì)檢查zookeeper中相應(yīng)的數(shù)據(jù)節(jié)點(diǎn)信息,該數(shù)據(jù)節(jié)點(diǎn)信息由monitor來設(shè)置,當(dāng)讀取到結(jié)束系統(tǒng)周期性增量抓取時(shí),spider組件會(huì)進(jìn)行一系列清理保存工作后結(jié)束自己的進(jìn)程;否則,會(huì)繼續(xù)進(jìn)行周期性增量抓取。
s3、判斷當(dāng)前分布式任務(wù)隊(duì)列是否為空,若為是,執(zhí)行s4,否則,跳轉(zhuǎn)s5。即,spider組件中的抓取線程會(huì)檢查redis中分布式任務(wù)隊(duì)列中是否還有待抓取的任務(wù),若有,則會(huì)獲取任務(wù)并進(jìn)入抓取階段;否則,會(huì)進(jìn)入休眠階段。
s4、進(jìn)入基礎(chǔ)爬蟲組件spider休眠階段,主要包括:1)阻塞抓取線程或休眠基礎(chǔ)爬蟲組件(spider)組件,2)喚醒線程;
具體包括如下步驟:a)判斷當(dāng)前spider組件除當(dāng)前抓取線程外,其它抓取線程是否均已阻塞,若是,則執(zhí)行步驟b),否則,執(zhí)行步驟c);b)在zookeeper中創(chuàng)建休眠標(biāo)示節(jié)點(diǎn),該節(jié)點(diǎn)可以用來表示當(dāng)前spider組件已經(jīng)休眠,當(dāng)其他組件需要喚醒該spider組件時(shí)只需刪除該數(shù)據(jù)節(jié)點(diǎn)即可;c)阻塞該抓取線程;d)抓取線程已經(jīng)阻塞,等待其他線程喚醒;e)抓取線程被其它線程喚醒,并執(zhí)行s2。
在沒有抓取任務(wù)時(shí),spider組件就會(huì)進(jìn)入該階段,休眠自己,避免系統(tǒng)資源的空耗,當(dāng)其他spider組件有新的任務(wù)添加到任務(wù)隊(duì)列或新的一輪增量抓取開始時(shí),休眠的spider組件會(huì)被其他spider組件或coordinator組件喚醒,繼續(xù)進(jìn)行抓取任務(wù)。
s5、進(jìn)入基礎(chǔ)爬蟲組件(spider)抓取階段,具體包括如下步驟:包括:1)從分布式url任務(wù)隊(duì)列獲取任務(wù),2)spider執(zhí)行抓取任務(wù);3)喚醒抓取線程或基礎(chǔ)爬蟲組件(spider)組件。
具體包括如下步驟:a)從分布式url隊(duì)列獲取抓取任務(wù);b)根據(jù)獲取的任務(wù),抓取相應(yīng)網(wǎng)頁并存儲(chǔ)結(jié)果;c)分析抓取到的網(wǎng)頁超鏈接并獲取新的任務(wù)集合;d)將獲取到的新任務(wù)發(fā)送到分布式bloomfilter去重;e)將去重后的新任務(wù)添加到分布式任務(wù)隊(duì)列;f)判斷當(dāng)前spider組件是否有抓取線程阻塞,若有,則執(zhí)行步驟g),否則,執(zhí)行步驟h);g)喚醒當(dāng)前spider組件中阻塞的抓取線程;h)判斷當(dāng)前集群中是否有其他的spider組件休眠,若有,則喚醒相應(yīng)休眠spider,否則,執(zhí)行s2。
s6、結(jié)束。即當(dāng)各組件檢測到系統(tǒng)需要停止工作時(shí),會(huì)在進(jìn)行必要的清理工作后結(jié)束各自的進(jìn)程。
針對龐大而多元化的互聯(lián)網(wǎng)數(shù)據(jù),本發(fā)明的一種分布式爬蟲系統(tǒng)及周期性增量抓取方法和現(xiàn)有技術(shù)相比,具有以下有益效果:
1)實(shí)現(xiàn)簡單:本發(fā)明基于開源的分布式協(xié)調(diào)服務(wù)zookeeper和開源的分布式內(nèi)存數(shù)據(jù)庫redis構(gòu)建分布式爬蟲系統(tǒng),在利用技術(shù)框架基礎(chǔ)上進(jìn)行深度開發(fā),既滿足了特定需求,又降低了開發(fā)成本。
2)高性能:抓取任務(wù)采用多節(jié)點(diǎn)多線程工作方式,實(shí)現(xiàn)了網(wǎng)頁抓取的高性能,并支持spider組件的線性擴(kuò)展。
3)高可用:基于zookeeper和redis,系統(tǒng)各個(gè)組件均以集群形式工作,避免了單節(jié)點(diǎn)崩潰問題,對外實(shí)現(xiàn)了一種高可用高穩(wěn)定的網(wǎng)頁抓取服務(wù)。
4)自動(dòng)化周期性增量抓?。阂淮涡栽O(shè)定初始任務(wù)和相關(guān)系統(tǒng)參數(shù)后,系統(tǒng)會(huì)自動(dòng)進(jìn)行周期性地增量抓取服務(wù),不需人為干預(yù)。
5)可定制抓取策略:spider組件包含多種組件內(nèi)核,每一個(gè)組件內(nèi)核對應(yīng)不同的爬取策略,并且spider被設(shè)計(jì)成一種高擴(kuò)展的組件,可以很方便地針對新的數(shù)據(jù)源編寫新的組件內(nèi)核。
6)擴(kuò)展性好:系統(tǒng)所有組件均以低耦合組織在一起,任何單一節(jié)點(diǎn)的上下線對系統(tǒng)造成的影響微乎其微,支持各組件的線性擴(kuò)展。
由此可見,本發(fā)明具有設(shè)計(jì)合理、架構(gòu)簡單、高可用、高穩(wěn)定、高性能、擴(kuò)展性好等優(yōu)勢。
附圖說明
圖1為該分布式爬蟲系統(tǒng)架構(gòu)圖
圖2為周期性增量抓取方法主流程圖
圖3為spider抓取階段流程圖
圖4為spider休眠階段流程圖
具體實(shí)施方式
為了更好的了解本發(fā)明的技術(shù)內(nèi)容,特舉具體實(shí)施例并配合所附圖示作進(jìn)一步說明。
圖1為本發(fā)明的一種分布式爬蟲系統(tǒng)架構(gòu)圖,該系統(tǒng)包括基于zookeeper的分布式服務(wù)、系統(tǒng)組件和數(shù)據(jù)庫三大部分。其中,基于zookeeper的分布式服務(wù)為各系統(tǒng)組件提供分布式協(xié)調(diào)服務(wù);系統(tǒng)組件包括系統(tǒng)監(jiān)控組件monitor、協(xié)調(diào)組件coordinator、日志收集組件logger、基礎(chǔ)爬蟲組件spider;數(shù)據(jù)庫包括redis內(nèi)存數(shù)據(jù)庫和其他存儲(chǔ)抓取網(wǎng)頁的數(shù)據(jù)庫,redis內(nèi)存數(shù)據(jù)庫中存放有分布式url任務(wù)隊(duì)列和分布式bloomfilter。
基于zookeeper的分布式服務(wù)通過與各系統(tǒng)組件相互協(xié)調(diào)工作,為各系統(tǒng)組件提供包括動(dòng)態(tài)配置、集群節(jié)點(diǎn)檢測與管理、master選舉、分布式鎖、全局url的id生成等分布式協(xié)調(diào)服務(wù)。zookeeper在內(nèi)存中維護(hù)了一個(gè)類似文件系統(tǒng)的樹形數(shù)據(jù)結(jié)構(gòu),基于zookeeper的這些分布式服務(wù)可以通過創(chuàng)建、查詢、刪除和監(jiān)聽各組件在zookeeper數(shù)據(jù)結(jié)構(gòu)上的相應(yīng)數(shù)據(jù)節(jié)點(diǎn)來實(shí)現(xiàn)。
系統(tǒng)監(jiān)控組件monitor負(fù)責(zé)系統(tǒng)的動(dòng)態(tài)配置和系統(tǒng)的狀態(tài)監(jiān)控。用戶可以通過monitor界面修改存在于zookeeper上的系統(tǒng)配置參數(shù)(如各基礎(chǔ)爬蟲組件spider的參數(shù)),集群中各個(gè)相應(yīng)組件(包括spider、coordinator和logger)會(huì)監(jiān)聽zookeeper上的相應(yīng)數(shù)據(jù)節(jié)點(diǎn),并在在數(shù)據(jù)節(jié)點(diǎn)內(nèi)容被修改后各個(gè)相應(yīng)組件會(huì)得到相應(yīng)的通知,即由zookeeper發(fā)送的數(shù)據(jù)變更的通知,進(jìn)而各組件會(huì)根據(jù)修改后的配置參數(shù)做相應(yīng)調(diào)整。monitor界面還會(huì)實(shí)時(shí)顯示存在于zookeeper上的各系統(tǒng)狀態(tài)參數(shù)和各組件狀態(tài)參數(shù),以便用戶進(jìn)行實(shí)時(shí)監(jiān)控,及時(shí)發(fā)現(xiàn)問題并進(jìn)行相應(yīng)的補(bǔ)救措施。其中,系統(tǒng)配置參數(shù)主要包括種子導(dǎo)入周期、正則約束、抓取線程數(shù)、抓取深度、最大錯(cuò)誤數(shù)等等,還有許多其他很細(xì)節(jié)的配置參數(shù)。
協(xié)調(diào)組件coordinator負(fù)責(zé)導(dǎo)入種子網(wǎng)頁url到基于分布式任務(wù)隊(duì)列、周期性匯總各節(jié)點(diǎn)狀態(tài)到zookeeper、為日志收集組件logger動(dòng)態(tài)分配日志源和集群節(jié)點(diǎn)的檢測與管理。
日志收集組件logger負(fù)責(zé)從集群中各基礎(chǔ)爬蟲組件spider收集日志數(shù)據(jù),以便后續(xù)日志分析。
基礎(chǔ)爬蟲組件spider負(fù)責(zé)具體的網(wǎng)頁爬取任務(wù),spider組件包含多種組件內(nèi)核,每一個(gè)組件內(nèi)核對應(yīng)不同的爬取策略,并且spider被設(shè)計(jì)成一種高擴(kuò)展的組件,可以很方便地針對新的數(shù)據(jù)源編寫新的組件內(nèi)核。在爬取過程中,spider組件首先根據(jù)系統(tǒng)配置進(jìn)行相應(yīng)初始化,之后會(huì)不斷從分布式任務(wù)隊(duì)列中請求url、根據(jù)相應(yīng)url切換相應(yīng)爬取策略、爬取網(wǎng)頁、提取網(wǎng)頁特征及正文、存儲(chǔ)抽取結(jié)果、分析網(wǎng)頁超鏈接、將新獲取url經(jīng)分布式bloomfilter去重后添加到分布式任務(wù)隊(duì)列中,直到分布式任務(wù)隊(duì)列為空。
基于redis的分布式url任務(wù)隊(duì)列負(fù)責(zé)存儲(chǔ)所有待爬取的任務(wù)url。任務(wù)的分發(fā)方式采用基礎(chǔ)爬蟲組件spider的拉取(pull)方式,當(dāng)spider當(dāng)前的爬取任務(wù)結(jié)束時(shí),spider會(huì)主動(dòng)到分布式隊(duì)列中拉取新的任務(wù),進(jìn)行下一輪的工作。值得注意的是,在當(dāng)前采用基于redis的分布式隊(duì)列的情況下,拉取(pull)方式是最優(yōu)最簡單的一種方式,其他還有推送和推拉結(jié)合的方式也可以實(shí)現(xiàn),但這兩種方式都需要做額外的實(shí)現(xiàn),而拉取方式不需要額外的實(shí)現(xiàn)。
基于redis的分布式bloomfilter負(fù)責(zé)集群中所有基礎(chǔ)爬蟲組件spider的url去重請求。redis是key-value的存儲(chǔ)形式,該分布式bloomfilter采用分段機(jī)制將bit向量分段存儲(chǔ)在redis不同的key之上,并通過分段樂觀鎖實(shí)現(xiàn)各spider訪問的同步性控制。分段樂觀鎖的實(shí)現(xiàn)機(jī)制為:每一個(gè)spider的去重請求會(huì)首先計(jì)算所要訪問的bit向量的各段對應(yīng)的key,之后會(huì)在在各個(gè)key(鍵)之上進(jìn)行監(jiān)聽,然后發(fā)起各段bit向量更新請求的redis事務(wù),該事務(wù)在執(zhí)行時(shí)會(huì)首先檢查所監(jiān)聽的key對應(yīng)的bit向量是否在監(jiān)聽后被更改過,若是則放棄自此事務(wù)執(zhí)行并自旋重新發(fā)起去重請求;否則,更新成功,去重url被成功添加到bloomfilter中。基于分段機(jī)制和樂觀鎖實(shí)現(xiàn)的分布式bloomfilter不僅可以提供高吞吐率的去重請求,而且可以隨著redis集群的線性擴(kuò)展而擴(kuò)展,不存在容量限制。
實(shí)施例中還公開一種基于上述分布式爬蟲系統(tǒng)的周期性增量抓取方法,結(jié)合附圖2至圖4對該方法進(jìn)行詳細(xì)說明。
圖2為實(shí)施例中周期性增量抓取方法的主流程圖,具體介紹如下:
步驟1-0、周期性增量抓取方法的起始狀態(tài);
步驟1-1、協(xié)調(diào)組件coordinator周期性導(dǎo)入任務(wù)到分布式url任務(wù)隊(duì)列;
步驟1-2、判斷是否結(jié)束系統(tǒng)周期性增量抓?。喝舨襟E1-2判斷結(jié)果為是,則進(jìn)入步驟1-9,否則執(zhí)行步驟1-3;
步驟1-3、判斷當(dāng)前分布式任務(wù)隊(duì)列是否為空;若判斷結(jié)果為是,則進(jìn)入spider休眠階段,執(zhí)行相應(yīng)步驟1-4和步驟1-5,否則,進(jìn)入spider抓取階段,執(zhí)行相應(yīng)步驟1-6、步驟1-7和步驟1-8。
步驟1-4、阻塞抓取線程或休眠spider組件;
步驟1-5、阻塞線程被喚醒,并執(zhí)行步驟1-2;
步驟1-6、從分布式隊(duì)列獲取任務(wù);
步驟1-7、spider執(zhí)行具體的抓取任務(wù);
步驟1-8、喚醒抓取線程或spider組件,并執(zhí)行步驟1-2;
步驟1-9、結(jié)束狀態(tài)。
圖3為實(shí)施例中spider抓取階段流程圖,具體介紹如下:
步驟2-0、spider抓取階段開始狀態(tài),該步驟緊接步驟1-3;
步驟2-1、從分布式隊(duì)列獲取任務(wù);
步驟2-2、根據(jù)獲取的任務(wù),抓取相應(yīng)網(wǎng)頁并存儲(chǔ)結(jié)果;
步驟2-3、分析抓取到的網(wǎng)頁超鏈接并獲取新的任務(wù)集合;
步驟2-4、將獲取到的新任務(wù)到分布式bloomfilter去重;
步驟2-5、將去重后的新任務(wù)添加到分布式任務(wù)隊(duì)列;
步驟2-6、判斷本spider組件是否有抓取線程阻塞,若有,則執(zhí)行步驟2-7,否則,執(zhí)行步驟2-8;
步驟2-7、喚醒阻塞的本spider組件的抓取線程;
步驟2-8、判斷當(dāng)前集群中是否有其他的spider組件休眠,若有,則執(zhí)行步驟2-9,否則,執(zhí)行2-10;
步驟2-9、喚醒休眠spider;
步驟2-10、spider抓取階段的結(jié)束狀態(tài),之后會(huì)執(zhí)行步驟1-2。
圖4為實(shí)施例中spider休眠階段流程圖,具體介紹如下:
步驟3-0、spider休眠階段開始狀態(tài),該步驟緊接步驟1-3;
步驟3-1、判斷本spider組件除抓取線程外,其它抓取線程是否均已阻塞,若是,則執(zhí)行步驟3-2,否則,執(zhí)行步驟3-3;
步驟3-2、在zookeeper中創(chuàng)建休眠標(biāo)示節(jié)點(diǎn),該節(jié)點(diǎn)可以用來表示相應(yīng)spider組件已經(jīng)休眠,當(dāng)其他組件需要喚醒該spider組件時(shí)只需刪除該數(shù)據(jù)節(jié)點(diǎn)即可;
步驟3-3、阻塞本抓取線程;
步驟3-4、抓取線程已經(jīng)阻塞,等待其他線程喚醒;
步驟3-5、抓取線程被其它線程喚醒;
步驟3-6、spider休眠階段的結(jié)束狀態(tài),之后會(huì)執(zhí)行步驟1-2。
盡管以上結(jié)合附圖對本發(fā)明的實(shí)施方案進(jìn)行了描述,但本發(fā)明并不局限于上述的具體實(shí)施方案和應(yīng)用領(lǐng)域,上述的具體實(shí)施方案僅僅是示意性的、指導(dǎo)性的,而不是限制性的。本領(lǐng)域的普通技術(shù)人員在本說明書的啟示下,在不脫離本發(fā)明權(quán)利要求所保護(hù)的范圍的情況下,還可以做出很多種的形式,這些均屬于本發(fā)明保護(hù)之列。