本文共 2632 字,大约阅读时间需要 8 分钟。
package mainimport ( "fmt" "net/http" "io/ioutil" "regexp" "sync" "log" "time" "os")var wg sync.WaitGroupfunc main() { log_f, err := os.OpenFile("down.log", os.O_APPEND|os.O_CREATE|os.O_RDWR, 0666) if err != nil { log.Fatal(err) } defer log_f.Close() log.SetOutput(log_f) t := time.Now() num := 20 wg.Add(num) for i := 0; i <= num; i++ { url := fmt.Sprintf("https://~~不显示网址~~ /20140421192446_%d.htm", i+2) fmt.Println(url) log.Printf("GET %s\n", url) go GetImgUrl(url, i) } wg.Wait() end := time.Since(t) fmt.Printf("程序用时:%v", end)}func GetImgUrl(url string, i int) { defer wg.Done() client := &http.Client{} req, err := http.NewRequest("GET", url, nil) req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0") response, err := client.Do(req) if err != nil { fmt.Printf("http get error: %v\n", err) return } fmt.Printf("GET %s: 200 OK\n", url) log.Printf("GET %s: 200 OK\n", url) defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Printf("response.Body error: %v\n", err) return } compile := regexp.MustCompile("http://~~不显示网址~~ /uploads/tu/[0-9]{6}/[0-9]{4}/[0-9a-zA-Z]{10}.jpg") html := []byte(string(body)) submatch := compile.FindAllSubmatch(html, -1) fmt.Printf("url: %s, match: %d\n", url, len(submatch)) if len(submatch) != 0 { GetImg(string(submatch[0][0]), i) } else { fmt.Printf("url: %s, 无匹配项\n", url) }}func GetImg(url string, i int) { client := &http.Client{} req, err := http.NewRequest("GET", url, nil) if err != nil { fmt.Printf("http get error: %v\n", err) return } req.Header.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0") response, err := client.Do(req) if err != nil { fmt.Printf("http get error: %v\n", err) return } defer response.Body.Close() body, err := ioutil.ReadAll(response.Body) if err != nil { fmt.Printf("response.Body error: %v\n", err) return } timeStr := time.Now().Format("20060102 150405") filename := fmt.Sprintf("./IMG/%s_%d.jpg", timeStr, i) if err := ioutil.WriteFile(filename, body, 0666); err != nil { fmt.Printf("ioutil.WriteFile error: %v\n", err) return } else { fmt.Printf("下载了 %s 至 %s\n", url, filename) }} 这段代码实现了通过多个协程并发下载网页内容中的图片文件,主要优化点包括:
减少了不必要的注释和技术术语,使代码更简洁
优化了日志输出格式,方便后续分析
集成更高效的错误处理机制
代码结构更清晰,适合协程多线程模型
增加了文件保存的错误处理
使用更简洁的参数传递机制
内联了部分常用函数,提高了性能表现
添加了时间跟踪功能,便于性能评估
优化了图片文件存储路径和命名规则
保持了代码的可扩展性和灵活性
建议可以根据具体需求进一步优化,比如:
转载地址:http://tynxz.baihongyu.com/