zoukankan      html  css  js  c++  java
  • Go语言 之捧腹网爬虫案例

    package main
    
    import (
        "fmt"
        "net/http"
        "os"
        "regexp"
        "strings"
    )
    
    var urls = "https://www.pengfu.com/xiaohua_%d.html"
    
    func DoHttpGet(urls string) (str string) {
    
        //创建一个Client
        client := &http.Client{}
    
        //使用指定的方法、网址和可选的主题创建并返回一个新的*Request
        request, err := http.NewRequest("GET", urls, nil)
        if err != nil {
            fmt.Println(err)
        }
        //添加请求头
        request.Header.Add("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1")
        response, _ := client.Do(request)
    
        defer response.Body.Close()
        buf := make([]byte, 1024*10)
        for {
            n, _ := response.Body.Read(buf)
            if n == 0 {
                break
            }
            str += string(buf[:n])
        }
        return
    }
    
    func SaveDataToLocal(index int, c chan<- int) {
        //网络请求
        str := DoHttpGet(fmt.Sprintf(urls, index))
        //正则匹配所有的网址
        regex := regexp.MustCompile(`<h1 class="dp-b"><a href="(.*?)" target="_blank">`)
        findResult := regex.FindAllStringSubmatch(str, -1)
    
        var writeStr []string
        //便利当前页所有的网址
        for _, data := range findResult {
            fmt.Println(data[1])
            //网络请求详情页面
            s := DoHttpGet(data[1])
            //正则匹配标题
            titleRegex := regexp.MustCompile(`<h1>(.*)</h1>`)
            titleResult := titleRegex.FindAllStringSubmatch(s, 1)
            title := strings.TrimSpace(titleResult[0][1])
    
            //正则匹配内容
            contentRegex := regexp.MustCompile(`<div class="content-txt pt10">s?
    ?(.*)<a`)
            contentResult := contentRegex.FindAllStringSubmatch(s, 1)
            content := strings.TrimSpace(contentResult[0][1])
    
            //将标题与内容存到切片
            writeStr = append(writeStr, fmt.Sprintf(`{"title": "%s", "content" : "%s"}`, title, content))
        }
        //创建json文件
        f, err := os.Create(fmt.Sprintf("./page/%d.json", index))
        if err != nil {
            fmt.Println(err)
        }
        defer f.Close()
        //将数据写入文件
        f.WriteString(strings.Join(writeStr, ",") + "
    ")
    
        //通知主协程爬取完毕
        c <- index
    }
    
    func ToDoWork(start, end int) {
        //创建通道:通知每页爬取完毕
        c := make(chan int)
        //每一页都创建一个协程
        for i := start; i <= end; i++ {
            //将每一页数据保存到文件中
            go SaveDataToLocal(i, c)
        }
    
        for i := start; i <= end; i++ {
            //阻塞等待协程通知
            fmt.Printf("第%d页爬取完成
    ", <-c)
        }
    }
    
    func main() {
        //输入开始页与结束页
        var start, end int
        fmt.Print("请输入开始页码:")
        fmt.Scan(&start)
        if start <= 0 {
            fmt.Println("参数不正确,请输入大于0的数字")
            return
        }
        fmt.Print("请输入结束页码:")
        fmt.Scan(&end)
        if start > end {
            fmt.Println("参数不正确,结束页码必须大于开始页码")
        }
    
        //逻辑处理函数
        ToDoWork(start, end)
    }

    运行:

    结果:

    {"title": "都是二胎惹的祸", "content" : "&nbsp; &nbsp; 小区门口修车师傅生意特好。人实在,只要不换零件,常常不收钱或只收个块把钱辛苦钱。最近发现他心黑了,价钱明显上调,就连充个气也收1块钱。旁边书报亭大妈是知情人,: 唉,多担待一下吧!他家上个月二胎,一窝生了四个带把的。。。。"},{"title": "讨价还价", "content" : "去小卖部买烟,10块钱一盒的,给老板100,老板喜咪咪的看着我说:“我没零钱找你,就让我闺女陪你一晚抵账得了。”我一激动:“你老别介啊,我攒个私房钱出来偷偷买烟,真的很不容易啊!”老板:“怎么,你不愿意?要不然我去把我闺女叫出来!”我:“别!别!这钱你不用找了,千万别让您闺女知道我藏私房钱啊!”老板:“好女婿,只要你经常来买东西,我保证不说!哈哈哈”"},{"title": "猪没事就是涨价了", "content" : "前天和同事去逛超市,说好久没买肉吃了,于是去看猪肉,结果看到的最便宜的猪肉都要十八块多,同事当场惊呼:“猪怎么了,这是!”卖肉的师傅笑着说:“猪没事,就是涨价了。”"},{"title": "心宽", "content" : "刚才在QQ上有个还在上大学的姑娘突然跟我讲:“朋友介绍我去打工,今天晚上要到一个酒吧领舞,现在有点不敢去。”我:“有什么不敢去的?”姑娘:“刚才在小摊上只吃了碗牛肉面,怕到时候饿。”──姑娘,你心太宽了!"},{"title": "缺心眼", "content" : "昨天路过单位餐厅门口的金鱼池,正好看到一条小金鱼蹦到外边了,还在张嘴,就捡起来扔到池子里。回到家跟老婆聊天时随口说起,老婆抱怨着说,“我说你个缺心眼的,怎么不去向它要幢别墅呢!”"},{"title": "贵重物品", "content" : "下车时导游小姐说:“请带好您的贵重物品。”他拉着我的手说:“快走,贵重物品。”"},{"title": "镇静剂", "content" : "医生:“去给那位今天出院的病人注射一针镇静剂。”护士不解:“都可以出院了,还打镇静剂干嘛?”医生:“等下要结账,我怕他受不了!”"},{"title": "欢迎下次再来", "content" : "我一大学同学毕业后搞了一年营销,发奋考上公务员,分到民政局婚姻登记处。头天上班,一大早就来了对新人登记,那男的客气,给了一包烟和一包糖,同学很激动,麻利的办好手续,起身握手送别,很有礼貌地说了句:欢迎下次再来。"},{"title": "我们在睡觉", "content" : "公司一女同事中午外出吃饭。手机落公司,然后她老公一个劲的打电话,旁边一哥们吃完午睡,很是反感,在电话响起的第N回后,哥们很气愤的拿起电话,吼道:“我们在睡觉,你老打电话,烦不烦。”不一会儿办公室门口就出现了个男的。"},{"title": "不白之冤", "content" : "老先生已有60多岁,而头发胡须却都是黑的。朋友开玩笑地说:“如果用年龄为标准来衡量,您的头发胡须可说是抱冤受屈了!”老先生惊问何故,朋友答道:“它们蒙受了不白之冤呀。”"}

    页数过多会比较慢,在第二次网络请求时可以创建协程解决,有代码优化的可以评论。

  • 相关阅读:
    牛客练习赛51
    [HZOI 2016] 偏序(CDQ套CDQ)
    AtCoder Beginner Contest 140
    [国家集训队] 拉拉队排练
    [CF91B] Queue
    [AT3867] Digit Sum 2
    [TJOI2007] 路标设置
    [HNOI2001] 求正整数
    [十二省联考2019] 异或粽子
    [SDOI2013] 直径
  • 原文地址:https://www.cnblogs.com/yang-2018/p/11176799.html
Copyright © 2011-2022 走看看