码迷,mamicode.com
首页 > 其他好文 > 详细

纯golang爬虫实战(三)

时间:2020-01-23 18:26:47      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:www   原来   执行   package   res   pre   import   style   str   

网站上有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()
}

纯golang爬虫实战(三)

标签:www   原来   执行   package   res   pre   import   style   str   

原文地址:https://www.cnblogs.com/pu369/p/12230828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!