兄弟連區塊鏈培訓Go語言爬蟲編寫

來源:互聯網
上載者:User

  兄弟連教育建議,使用者在考慮培訓周期時要切實結合自身目前所掌握的區塊鏈知識的多少、培訓的目的是簡單的認知提升還是藉此高薪就業等等。兄弟連Go全棧與區塊鏈培訓課程設定為5個半月共計22周的學習時間長度,由淺入深進行講解,助力於小白使用者向區塊鏈工程師的轉型。


  課程體系設計架構包括了區塊鏈的基礎語言Go語言、區塊鏈後端技術體系、區塊鏈公鏈、區塊鏈分布式應用開發等內容講解,以及到最後的面試指導和項目實戰。課程由清華微軟Google名師團隊精心打造,曆時半年時間共同研發而出。


上次用Scala寫了個爬蟲。最近在閑工夫之時,學習Go語言,便用Go移植了那個用Scala寫的爬蟲,代碼如下:

package main


import (

    "fmt"

    "io/ioutil"

    "net/http"

    "regexp"

)


var (

    ptnIndexItem    = regexp.MustCompile(`(.+)`)

    ptnContentRough = regexp.MustCompile(`(?s).*

(.*).*`)

    ptnBrTag        = regexp.MustCompile(`
`)

    ptnHTMLTag      = regexp.MustCompile(`(?s)`)

    ptnSpace        = regexp.MustCompile(`(^\s+)|( )`)

)


func Get(url string) (content string, statusCode int) {

    resp, err1 := http.Get(url)

    if err1 != nil {

        statusCode = -100

        return

    }

    defer resp.Body.Close()

    data, err2 := ioutil.ReadAll(resp.Body)

    if err2 != nil {

        statusCode = -200

        return

    }

    statusCode = resp.StatusCode

    content = string(data)

    return

}


type IndexItem struct {

    url   string

    title string

}


func findIndex(content string) (index []IndexItem, err error) {

    matches := ptnIndexItem.FindAllStringSubmatch(content, 10000)

    index = make([]IndexItem, len(matches))

    for i, item := range matches {

        index[i] = IndexItem

    }

    return

}


func readContent(url string) (content string) {

    raw, statusCode := Get(url)

    if statusCode != 200 {

        fmt.Print("Fail to get the raw data from", url, "\n")

        return

    }


    match := ptnContentRough.FindStringSubmatch(raw)

    if match != nil {

        content = match[1]

    } else {

        return

    }


    content = ptnBrTag.ReplaceAllString(content, "\r\n")

    content = ptnHTMLTag.ReplaceAllString(content, "")

    content = ptnSpace.ReplaceAllString(content, "")

    return

}


func main() {

    fmt.Println(`Get index ...`)

  s, statusCode := Get

      if statusCode != 200 {

        return

    }

    index, _ := findIndex(s)


    fmt.Println(`Get contents and write to file ...`)

    for _, item := range index {

        fmt.Printf("Get content %s from %s and write to file.\n", item.title, item.url)

        fileName := fmt.Sprintf("%s.txt", item.title)

        content := readContent(item.url)

        ioutil.WriteFile(fileName, []byte(content), 0644)

        fmt.Printf("Finish writing to %s.\n", fileName)

    }

}

  程式碼數比Scala版的有一定增加,主要原因有以下幾方面原因:

1 golang 重視代碼書寫規範,或者說代碼格式,很多地方寫法比較固定,甚至比較麻煩。比如就算是if判斷為真後的執行語句只有一句話,按照代碼規範,也要寫出帶大括弧的三行,而在Scala和很多其他語言中,一行就行;

2 golang 的strings包和regexp包提供的方法並不特別好用,特別是和Scala相比,使用起來感覺Scala的正則和字串處理要舒服的多;

3 scala版的爬蟲裡面用到了Scala標準庫中的實用類和方法,它們雖然不是文法組成,但用起來感覺像是文法糖,這裡很多方法和函數式編程有關,golang的函數式編程還沒有去仔細學習。


  當然golang版的爬蟲也有一個優勢,就是編譯速度很快,執行速度在現在的寫法裡面體現不出優勢;golang的特性goroutine在這裡沒有用到,這段代碼今後會不斷改進。

高能預警,兄弟連教育區塊鏈直播課程8月持續火爆來襲!

原價1188元的12節區塊鏈進階課程,現僅需1元!

還可免費領取《Go語言基礎實戰項目開發》與《Go語言進階實戰項目開發》教材兩本!!

限時限量!!先到先得!!

http://www.ydma.cn/open/course/24

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.