背景是我这边有个需求是需要从指定网络爬取一些图片放到项目中使用。
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。
这里解释了两个类型及转换的方式。
// 读取远程地址
resCloud, _ := http.Get(e.Attr("src"))
defer resCloud.Body.Close()
resBytes, _ := ioutil.ReadAll(resCloud.Body)
// 转换
readSeeker := bytes.NewReader(resBytes)