??最近主攻go的學(xué)習(xí),在學(xué)完了基礎(chǔ)語法,看完了無聞翻譯的《The way to go》和ccmouse大神的慕課網(wǎng)課程后,感覺基礎(chǔ)差不多了,繼續(xù)深入挖掘ccmouse大神的爬蟲項目,收獲頗豐,感覺還是有一定的難度的,會繼續(xù)啃下去,學(xué)習(xí)之余感覺自己實在是井底之蛙,無數(shù)光陰盡數(shù)浪費,無所建樹,思維停留在最原始的層面,無法向前邁進(jìn);慶幸現(xiàn)在有所覺悟,人生匆匆?guī)资d,時間是最寶貴的,不論哪個領(lǐng)域,選擇一個自己認(rèn)定的,低下頭向前沖刺,豐富自己的頭腦,提升自己的認(rèn)知。好像扯得有點遠(yuǎn)了,下面是項目的總結(jié)。
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比和田網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式和田網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋和田地區(qū)。費用合理售后完善,10年實體公司更值得信賴。
- 項目有一個main.go的入口文件,然后是各個子目錄功能文件夾;如圖: engine是總的控制文件,把請求和正則解析push到總的slice []request中,fetcher主要是通過http庫去獲取頁面body信息,model是要保存的人的信息struct
- 說完了目錄結(jié)構(gòu),接下來介紹下流程:
- 整個單機版爬蟲項目比較簡單,但對我來說收貨還是比較大的,其中涉及到一些技術(shù)細(xì)節(jié),如接口定義,結(jié)構(gòu)方法的使用,
- 后面還有并發(fā)版本和分布式版本,就比較復(fù)雜了,并發(fā)版是充分使用go的goroutine和chan,要在大的方向上理清楚思路,抽象出一些公用的方法和結(jié)構(gòu),重要的正則解析要做test工作,然后在此指引下一步步構(gòu)建,不可盲目前進(jìn)。首先并發(fā)版需要兩個chan,一個in :=chan Request和另一個out:=chan ParseResult,并發(fā)版啟動WorkerCount個goroutine去并發(fā)獲取in chan url內(nèi)容并解析出新url推送到out chan,同時并發(fā)版有一個scheduler調(diào)度器, 將初始的爬取Request(包括url和對應(yīng)的parser,因為每個網(wǎng)址的parser規(guī)則不同所以要成組傳輸)放進(jìn)scheduler里的workerChan即前面定義的in chan, 他倆是一個chan, 程序開始并發(fā)執(zhí)行,由于執(zhí)行的比較快會被爬取網(wǎng)站斷掉, 可以用time.Tike(time)來限制速度,另爬取時可能要設(shè)置相應(yīng)的header頭,否則會被屏蔽掉.
- 由于并發(fā)版多個worker都在爭搶Request去執(zhí)行,控制力度比較小,只適用于單機,不適合多機器分布式部署,故演化出第三個版本:隊列實現(xiàn).隊列執(zhí)行效率和并發(fā)版執(zhí)行效率差不多. scheduler調(diào)度器中有rqquestChan chan Request 和 workerChan chan chan Request(
注意這里是兩個chan
), 在run方法中定義一個out chan ParseResult,和并發(fā)版相比而言,隊列版多了workerChan 這個chan,主要用來實現(xiàn)隊列的調(diào)度。試著描述下整個過程不一定清晰: - 下面附上幾張ccmouse大神的講課ppt供大家理解,如有不清楚的歡迎下方留言討論。
本文標(biāo)題:go語言學(xué)習(xí)爬蟲框架總結(jié)
網(wǎng)頁鏈接:
http://weahome.cn/article/gheoho.html