zoukankan      html  css  js  c++  java
  • 纯golang爬虫实战(三)-批量下载保存图片

    网站上有9000多张照片要下载:

    //一开始参考https://www.jb51.net/article/153275.htm用reader和writer进行io.Copy,但经常是抓取100多个网页后就崩溃了,
    //原因似乎是输入输出流影响或并发数量影响,代码执行快,输出流写硬盘慢。
    //后来参考https://www.cnblogs.com/smartrui/p/12110576.html,改为ioutil.WriteFile直接写文件,还不行
    //因为一共才9000多张照片,原来的程序每次下载前400张就崩溃了,应该是并发访问太多,网站受不了。
    //于是狠心在主程序中每300个协程时延时2秒,终于成功下载完毕。但总感觉不那么优雅。
    代码如下:
    package main
    
    import (
        "fmt"
        "io/ioutil"
        "net/http"
        "sync"
        "time"
    )
    
    var wg sync.WaitGroup
    
    //保存图片
    func savepic(id int) {
        defer wg.Add(-1)
        idstr := fmt.Sprintf("%08d", id)
        url := "http://192.168.13.1:8080/temp/Usr" + idstr + ".tmp"
        resp, err := http.Get(url)
        defer resp.Body.Close()
        if err != nil {
            fmt.Println(err)
        }
        body, err := ioutil.ReadAll(resp.Body)
        if err != nil {
            fmt.Println(err)
        }
        _ = ioutil.WriteFile("pic/"+idstr+".jpg", body, 0755)
    
    }
    
    func main() {
        for id := 2; id < 9202; id++ {
            wg.Add(1)
            go savepic(id)
            if (id % 300) == 0 {
                time.Sleep(time.Duration(2000) * time.Millisecond)
            }
        }
        wg.Wait()
    }
  • 相关阅读:
    JavaScript 数组进行拼接的函数
    Scrum工件
    Scrum角色
    Scrum
    看板kanban
    敏捷估算
    用户故事地图
    用户故事
    用户画像
    AARRR模型
  • 原文地址:https://www.cnblogs.com/pu369/p/12230828.html
Copyright © 2011-2022 走看看