Administrator
发布于 2022-11-02 / 646 阅读 / 0 评论 / 0 点赞

golang爬虫爬取远程图片直传亚马逊云

背景是我这边有个需求是需要从指定网络爬取一些图片放到项目中使用。

golang爬虫参考1
golang爬虫参考2
golang爬虫参考3

爬虫代码demo

func Run() {

	c := colly.NewCollector()

	c.UserAgent = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Mobile Safari/537.36"

	var (
		err   error
		index int
		limit = 20
	)

	c.OnRequest(func(r *colly.Request) {

		fmt.Printf("爬取地址:%v \n", r.URL)
	})

	c.OnScraped(func(r *colly.Response) {

		fmt.Printf("Finished :%s \n Total :%d \n", r.Request.URL, index)
	})

	c.OnHTML("#znav > div > ul > li > a", func(e *colly.HTMLElement) {

		link := e.Attr("href")
		var tag string

		if link[0:1] == "/" && len(link) != 1 {

			tag = link[8 : len(link)-1]
			fmt.Printf("----> Link found: %q \nAddr : %s\nTag : %s \n", utils.ConvertToString(e.Text, "gbk", "utf-8"), link, tag)

			// 重置计数
			index = 0
			c.Visit(e.Request.AbsoluteURL(link))
			c.OnHTML("img[src]", func(e *colly.HTMLElement) {
				if index == limit {
					return
				}

				res := e.Attr("src")
				fmt.Printf("Img Resource: %s\n", res)
				index++
			})
		}
	})

	// 开始爬取页面
	err = c.Visit("http://m.netbian.com/")

	if err != nil {

		log.Fatal(err)
	}

}

爬取到的资源图片需要上传到云,这有需要将io.Reader转换为io.ReadSeeker。

参考资料

image

这里解释了两个类型及转换的方式。

	// 读取远程地址
	resCloud, _ := http.Get(e.Attr("src"))
	defer resCloud.Body.Close()
	resBytes, _ := ioutil.ReadAll(resCloud.Body)
	// 转换
	readSeeker := bytes.NewReader(resBytes)