Golang Colly批量爬取小红书图片
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"github.com/gocolly/colly"
)
func main() {
// 创建Collector实例
c := colly.NewCollector(
colly.AllowedDomains("www.xiaohongshu.com"),
colly.MaxDepth(1).Set(),
)
// 定义一个用于保存图片的函数
var saveImage = func(response *colly.Response) {
imagePath := "./images/" + response.FileName()
imageFile, err := os.Create(imagePath)
if err != nil {
log.Fatal(err)
}
defer imageFile.Close()
_, err = imageFile.Write(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Image saved: %s\n", imagePath)
}
// 注册请求响应的回调函数
c.OnHTML("a.image-link", func(e *colly.HTMLElement) {
imageURL := e.Attr("data-original")
if imageURL != "" {
// 请求图片并保存
resp, err := http.Get(imageURL)
if err != nil {
log.Println(err)
} else {
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Println(err)
}
// 使用Colly的Response对象来保存图片
c.OnResponse(colly.Response{
StatusCode: resp.StatusCode,
Body: body,
Headers: resp.Header,
FileName: imageURL[len(imageURL)-10:],
}, saveImage)
}
}
})
// 启动爬虫并限制为10个并发请求
c.Limit(&colly.LimitRule{Parallelism: 10})
c.Visit("https://www.xiaohongshu.com/discovery/trending")
}
这段代码修复了原始代码中的问题,并提供了一个更加有效的方法来保存图片。使用http.Get
获取图片链接,并使用ioutil.ReadAll
读取响应体,然后使用Colly的OnResponse
方法来处理图片的保存。这样做避免了重复的网络请求,并且使用了更加标准的Go库。
评论已关闭