如何用colly爬取网络上的所有图片?

2024-03-27 14:41:44
113

使用Colly爬取网络图片

先决条件:

步骤:

  1. 导入必要的库
import (
    "fmt"
    "log"
    "os"
    "path/filepath"

    "github.com/gocolly/colly"
    "github.com/gocolly/colly/extensions"
)
  1. 创建Colly收集器
collector := colly.NewCollector(
    colly.AllowedDomains("example.com"),
    colly.CacheDir("./.cache"),
)
  1. 启用文件保存扩展
extensions.FileSaver(collector)
  1. 设置文件保存路径
dir := "./images"
os.MkdirAll(dir, os.ModePerm)
collector.SetFileName("example.jpg")
collector.SetSaveDir(dir)
  1. 处理页面并保存图片
collector.OnHTML("img", func(e *colly.HTMLElement) {
    src := e.Attr("src")

    // 保存图片if _, err := e.Request.Get(src); err != nil {
        log.Printf("Error saving image: %s\n", err)
    }

    // 转换为JPG格式ext := filepath.Ext(src)
    if ext != ".jpg" {
        newPath := filepath.Join(dir, filepath.Base(src)) + ".jpg"
        if err := os.Rename(e.FileName(), newPath); err != nil {
            log.Printf("Error renaming file: %s\n", err)
        }
    }
})
  1. 访问目标URL并启动收集器
collector.Visit("https://example.com")
collector.Wait()

示例:

将以下代码保存到一个 .go 文件中:

package main

import (
    "fmt"
    "log"
    "os"
    "path/filepath"

    "github.com/gocolly/colly"
    "github.com/gocolly/colly/extensions"
)

func main() {
    collector := colly.NewCollector(
        colly.AllowedDomains("example.com"),
        colly.CacheDir("./.cache"),
    )

    extensions.FileSaver(collector)

    dir := "./images"
    os.MkdirAll(dir, os.ModePerm)
    collector.SetFileName("example.jpg")
    collector.SetSaveDir(dir)

    collector.OnHTML("img", func(e *colly.HTMLElement) {
        src := e.Attr("src")

        if _, err := e.Request.Get(src); err != nil {
            log.Printf("Error saving image: %s\n", err)
        }

        ext := filepath.Ext(src)
        if ext != ".jpg" {
            newPath := filepath.Join(dir, filepath.Base(src)) + ".jpg"
            if err := os.Rename(e.FileName(), newPath); err != nil {
                log.Printf("Error renaming file: %s\n", err)
            }
        }
    })

    collector.Visit("https://example.com")
    collector.Wait()

    fmt.Println("All images saved to", dir)
}

运行该文件会将所有符合条件的图片从给定URL下载并保存在指定的目录中。