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