探索技術(shù)的路上本應(yīng)該自己造輪子,即使市面上有再多的選擇,自己動手嘗試也是必要的,第一次嘗試必然會問題眾多,但你不覺得解決他是一件很有成就感的事情嗎,這樣才能帶給你更大的進步和更深刻的領(lǐng)悟。
如果沒有寫過的并感興趣的不妨一起來實現(xiàn)一下這個簡單的爬蟲。
其實用golang實現(xiàn)爬蟲是很簡單是事情,但也分情況,我們這次的文章就分享一種最簡單的爬蟲實現(xiàn)方式,用到的官方庫如下:

如果你能單單通過這些庫就想到該怎么做了,那你就很棒棒了。
為了讓程序能一直運行下去,我們首先要有一個源網(wǎng)頁,然后不斷爬抓記錄新的鏈接,記錄的手段有很多,比如存在數(shù)據(jù)庫、通過redis緩存、存在文本文件,最簡單的應(yīng)該就是存在數(shù)據(jù)庫了,這個看你們的技術(shù)偏向了。我打算把爬來的鏈接儲存在文本文件里。
首先,了解自己爬抓的目標(biāo),我準(zhǔn)備爬取所有的Golang相關(guān)答疑或者文章,然后翻來覆去很多網(wǎng)站都感覺不適合做源網(wǎng)址,然后靈機一動,百度一下

然后就用這樣作為源網(wǎng)址吧:百度一下 - Golang實現(xiàn)
有了源網(wǎng)址,那下面的事情只要捋順就好辦了。首先我們?yōu)榱俗ト〉芥溄樱枰粋€正則表達式

因為這個正則表達式我們后面可能會復(fù)用,所以可以存到一個全局變量里。
一個爬蟲如果不限制分秒爬抓次數(shù),那你的網(wǎng)絡(luò)肯定會受不了,如果電腦配置不行的話,電腦也會掛掉,所以我們需要寫一個計時器,golang已經(jīng)提供了計時器的包 => time

為什么要寫在一個Timer函數(shù)里?當(dāng)然是用來調(diào)用的 /手動滑稽
因為我們存在兩種情況,第一次爬取或不是第一次爬取的情況是做不同操作的。那要怎么判斷呢?因為我們的鏈接是儲存在txt文件里的,所以我們只需要去查txt文件是不是為空,如果為空就認(rèn)為他是第一次執(zhí)行程序,先訪問源網(wǎng)址,否則就按照文件里的鏈接依次訪問。
代碼如下:

那我們先看一下firstStart()函數(shù),稍后再解釋代碼:

很抱歉,沒有注釋習(xí)慣

其實很簡單,就是發(fā)起一個get請求,然后你會獲取到byte[]類型的數(shù)據(jù),轉(zhuǎn)換成string類型之后,就是網(wǎng)頁的代碼了。
分解一下(了解原理的跳過這段):

這段主要是發(fā)起一個get網(wǎng)絡(luò)請求,然后把請求到的byte數(shù)據(jù)轉(zhuǎn)成stirng類型的數(shù)據(jù),跳過正則獲取匹配鏈接獲取一個鏈接數(shù)組(不過分贅述,如果還不懂http請求可以另尋百度)

通過循環(huán)數(shù)組,首先對鏈接里的特殊符號做特出處理,然后通過checkRegexp函數(shù)做查重,就是防止有多個重復(fù)鏈接記錄導(dǎo)致浪費資源,最后存入txt文件。
checkRegexp函數(shù):

這里,程序的首次執(zhí)行已經(jīng)完成,并可以成功記錄爬取的鏈接了。程序執(zhí)行如下:
下一篇繼續(xù)講如何通過這些記錄的鏈接過濾無用爬取有效內(nèi)容,如果在上面的代碼中,還有疑問或發(fā)現(xiàn)驚天大Bug可以私聊
首發(fā)文來源:CSDN Golang原生爬蟲 簡單爬蟲實現(xiàn) 不依賴第三方包庫 方便理解技術(shù)原理 (一)