golang爬虫爬取图片

package main

import (
"fmt"
"io/ioutil"
"net/http"
"regexp"
"strconv"
"strings"
"sync"
"time"
)

func test() {
/pageStr := GetPageStr("https://www.umei.cc/bizhitupian/meinvbizhi/")
fmt.Println(pageStr)
/
GetLink("https://www.umei.cc/bizhitupian/weimeibizhi/")
}
func DownLoadFile(url string,filename string)(ok bool) {
resp, err := http.Get(url)
HandleError(err,"http.Get")
defer resp.Body.Close()
bytes, err := ioutil.ReadAll(resp.Body)
HandleError(err,"resp.Body")
filename="D:/mypath/blogweb_gin/img/"+filename
//写出数据
err = ioutil.WriteFile(filename, bytes, 0666)
if err!=nil {
return false
}else {
return true
}
}
var(
//存放图片链接的数据管道
chanImageUrls chan string
waitGroup sync.WaitGroup
//用于监控协程
chanTask chan string

)
//初始化数据管道

//爬虫写出26个协程向管道中添加图片链接

//任务统计协程检查26个任务是否都完成了完成则关闭数据管道

//下载协程从管道里读取链接并下载
func main() {
//test()
//DownLoadFile("http://kr.shanghai-jiuxin.com/file/2020/1031/small191468637cab2f0206f7d1d9b175ac81.jpg","1.jpg")
chanImageUrls = make(chan string,1000000)
chanTask = make(chan string,26)

//爬虫协程
for i:=1;i<27;i++  {
    waitGroup.Add(1)
    go getImgUrls("https://www.umei.cc/p/gaoqing/cn/"+strconv.Itoa(i)+".htm")
}
waitGroup.Add(1)
go CheckOK()

for i:=0;i<5;i++  {
    waitGroup.Add(1)
    go DownloadImage()
}
waitGroup.Wait()

}

//获取所有url
func getImgUrls(url string) {
urls := getImages(url)
for _, url := range urls {
chanImageUrls <-url
}
//标识当前协程完成
chanTask<-url
waitGroup.Done()
}
//获取当前页的图片链接
func getImages(url string)(urls[]string) {
pageStr := GetPageStr(url)
re := regexp.MustCompile(reImage)
results := re.FindAllStringSubmatch(pageStr, -1)
fmt.Printf("共找到%d条结果\n",len(results))
for , result := range results {
url = result[0]
urls = append(urls,url)
}
return urls
}
func CheckOK() {
var count int
for {
url:=<-chanTask
fmt.Printf("%s完成了爬取任务\n",url)
count++
if count==26 {
close(chanImageUrls)
break
}
}
waitGroup.Done()
}
func DownloadImage() {
for url:= range chanImageUrls {
filename:=GetName(url)
OK := DownLoadFile(url, filename)
if OK {
fmt.Printf("%s下载成功",filename)
}else {
fmt.Printf("%s失败",filename)
}
}
waitGroup.Done()
}
func GetName(url string)(filename string) {
lastIndex := strings.LastIndex(url, "/")
filename = url[lastIndex+1:]
timePrefix := strconv.Itoa(int(time.Now().UnixNano()))
filename = timePrefix+"
"+filename
return
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 输入与输出-fmt包 时间与日期-time包 命令行参数解析-flag包 日志-log包 IO操作-os包 IO操...
    思考的山羊阅读 6,747评论 0 5
  • 目录 1.go 各种代码运行 2.go 在线编辑代码运行 3.通过 Gob 包序列化二进制数据 4.使用 ...
    杨言锡阅读 1,212评论 0 1
  • 本系列整理了10个工作量和难度适中的Golang小项目,适合已经掌握Go语法的工程师进一步熟练语法和常用库的用法。...
    李说的对阅读 1,716评论 0 0
  • Go语言爬虫只是一种开拓思路和代码上手的练习 , 爬虫浪费了go语言的性能 , 且爬虫的效率和代码实现远没有 Py...
    飞天小马驹阅读 616评论 0 0
  • 久违的晴天,家长会。 家长大会开好到教室时,离放学已经没多少时间了。班主任说已经安排了三个家长分享经验。 放学铃声...
    飘雪儿5阅读 7,865评论 16 22

友情链接更多精彩内容