周末用 Go 写一篇的爬虫

美股(meigu) · 2019年12月01日 · 44 次阅读

前几天和BBAE的销售大佬聊天, 他说他家的网站内容随便爬, 我说好, 所以这就趁着周末撸了一个爬虫; 其中这个爬虫特意用FAN-OUT 和 FAN-IN 模式, 对这块感谢的同学可以自己看一下了。

代码如下:


package jobs

import (
    "bytes"
    "encoding/json"
    "fmt"
    "github.com/gocolly/colly"
    "net/http"
    "sync"
)

type Article struct{
    Title string `json:"title"`
    SourceUrl   string `json:"source_url"`
    Body  string `json:"body"`
}

func SpiderList() <- chan Article{
    out := make(chan Article, 100)
  go func(){
    defer close(out)
        c := colly.NewCollector()

        c.OnHTML("div.la-list02 a.htitle-color", func(r *colly.HTMLElement){
            body := string(r.Text)
            article := Article{SourceUrl: r.Attr("href"), Title: body}
            out <- article
        })
        c.Visit("https://5imeigu.com/")
    }()
    return out
}

func SpiderDetail(articles <- chan Article) <- chan Article{
    out := make(chan Article, 10)
    go func(){
        defer close(out)
        for article := range articles{
            c := colly.NewCollector()
            c.OnHTML("div.data-article", func(r *colly.HTMLElement){
                article.Body = string(r.Response.Body)
                out <- article
            })
        c.Visit(article.SourceUrl)
        }
    }()

    return out
}

func Merge(inputs ...<- chan Article) <- chan Article{
    out := make(chan Article)

    var group sync.WaitGroup

    collect := func( in <- chan Article){
        defer group.Done()
        for n := range(in){
            out <- n
        }
    }

    group.Add(len(inputs))

    for _, in := range inputs{
        go collect(in)
    }

    go func() {
        group.Wait()
        fmt.Println("全部完成....")
        close(out)
    }()

    return out
}

func SyncTopicToInvest(article Article){
    url := "https://investguider.com/api接口之马赛克"
    buf := new(bytes.Buffer)
    json.NewEncoder(buf).Encode(&article)
    req, err := http.NewRequest("POST", url, buf)
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
}

func SpiderMeigu() interface{}{
     listChannel := SpiderList()

     detailChan1 := SpiderDetail(listChannel)
     detailChan2 := SpiderDetail(listChannel)

     for a := range Merge(detailChan1, detailChan2){
            fmt.Println("完成: ", a.SourceUrl)
            SyncTopicToInvest(a)
     }

    success := map[string]string{"title": "success"}
    return SuccessResp(success)
}

运行结果如下:

2019/12/01 15:21:10 start consume persist.5imeigu
完成:  https://5imeigu.com/archives/1476
完成:  https://5imeigu.com/archives/1466
完成:  https://5imeigu.com/archives/1453
完成:  https://5imeigu.com/archives/1450
完成:  https://5imeigu.com/archives/1445
完成:  https://5imeigu.com/archives/1442
完成:  https://5imeigu.com/archives/1440
完成:  https://5imeigu.com/archives/1430
完成:  https://5imeigu.com/archives/1414
完成:  https://5imeigu.com/archives/1413
全部完成....

如果您对美股 或者 港股也感兴趣, 或者想要了解如何开户, 可以加我wechat: xiaobei006006, 同时也可以拉您进美股交流群哦。
最后的最后 祝大家都有一个美好的投资生活哦。

大家也可以关注【美股指南】公众号, 即可获得《小白投资美股指南(雪球「岛」系列)》电子书

写在最后

友情提示 转载请注明出处: https://investguider.com/topics/23170
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册