Go 爬蟲小例

ChenAfrica發表於2022-05-24
package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
    "regexp"
    "strings"
    "sync"
)

const URL = "https://learnku.com/go?filter=created_at_1_month&order=score&l=y"

var wg sync.WaitGroup

func main() {
    wg.Add(1)
    go fetchArticles()
    wg.Wait()
    fmt.Println("完成抓取....")
}
func fetchArticles() {
    defer wg.Done()
    req, _ := http.NewRequest("GET", URL, nil)
    resp, _ := http.DefaultClient.Do(req)
    // 讀取網頁內容
    content, _ := ioutil.ReadAll(resp.Body)
    // 二進位制檔案轉成網頁內容
    respBody := string(content)
    // 正規表示式匹配
    reg := regexp.MustCompile(`<span class="topic-title">(?s:(.*?))</span>`)
    if reg == nil {
        fmt.Println("regex err")
        return
    }
    result := reg.FindAllStringSubmatch(respBody, -1)
    for _, values := range result {
        // 這裡可以去除html元素和空格
        title := trimHtml(values[1])
        fmt.Println(title)
    }
}
// 去除html元素標籤
func trimHtml(src string) string {
    //將HTML標籤全轉換成小寫
    re, _ := regexp.Compile("\\<[\\S\\s]+?\\>")
    src = re.ReplaceAllStringFunc(src, strings.ToLower)
    //去除STYLE
    re, _ = regexp.Compile("\\<style[\\S\\s]+?\\</style\\>")
    src = re.ReplaceAllString(src, "")
    //去除SCRIPT
    re, _ = regexp.Compile("\\<script[\\S\\s]+?\\</script\\>")
    src = re.ReplaceAllString(src, "")
    //去除所有尖括號內的HTML程式碼,並換成換行符
    re, _ = regexp.Compile("\\<[\\S\\s]+?\\>")
    src = re.ReplaceAllString(src, "\n")
    //去除連續的換行符
    re, _ = regexp.Compile("\\s{2,}")
    src = re.ReplaceAllString(src, "\n")
    return strings.TrimSpace(src)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章