go语言爬取图片(URL分析)

Go语言爬取网站图片

作为一个肥宅,想找好看的图片,而且我几天换一张壁纸,最近缺少新的图片了,就去某乎找网站,下图是发现的网站,里面有大量好看的图片,就想爬下来慢慢挑

网站地址

https://wall.alphacoders.com/tags.php?tid=229

步骤


1.分析每一页的url,每页变化的只有后面的数字,修改数字就可
 https://wall.alphacoders.com/by_category.php?id=3&name=Anime+Wallpapers
https://wall.alphacoders.com/by_category.php?id=3&name=Anime+Wallpapers&page=2
https://wall.alphacoders.com/by_category.php?id=3&name=Anime+Wallpapers&page=3
2.分析每个小图的url,在如下第一张图中提取数字,改变第二张图url地址中的数字,即可


3.如图,进入url后不仅有大图,还有其他信息,所以需要找出大图的地址
<img class="main-content" src="https://images6.alphacoders.com/642/thumb-1920-642268.jpg"



4.有了大图地址,就可以把整个信息保存成.jpg格式就行了

代码

package main

import (
	"fmt"
	"io"
	"math/rand"
	"net/http"
	"os"
	"regexp"
	"strconv"
	"time"
)

//获取一个网页所有的内容
func HttpGet(url string)(result string,err error){
	resp ,err1 :=http.Get(url)
	if err1!=nil{
		err=err1
		return
	}
	defer resp.Body.Close()
	buf := make([]byte,4096)
	for {
		n,err2 :=resp.Body.Read(buf)
		if n==0{
			break
		}
		if err2!=nil&&err2!=io.EOF{
			err =err2
			return
		}
		result +=string(buf[:n])

	}
	return

}

//写入文件
func SaveJokeFile(url string){
	//保存图片的名字是随机的6个数字
	rand.Seed(time.Now().UnixNano())
	var captcha string
	for i := 0; i < 6; i++ {
		//产生0到9的整数
		num := rand.Intn(10)
		//将整数转为字符串
		captcha += strconv.Itoa(num)
	}
	
	//保存在本地的地址
	path :="D:/Go code/src/Gopa/09爬图片/imgs/"+captcha+"张.jpg"
	f,err :=os.Create(path)
	if err!=nil{
		fmt.Println("HttpGet err:",err)
		return
	}
	defer f.Close()

	//读取url的信息
	resp,err := http.Get(url)
	if err!=nil{
		fmt.Println("http err:",err)
		return
	}
	defer f.Close()

	buf :=make([]byte,4096)
	for{
		n,err2 :=resp.Body.Read(buf)
		if n==0{
			break
		}
		if err2!=nil&&err2!=io.EOF{
			err = err2
			return
		}
		//写入文件
		f.Write(buf[:n])
	}

}


func working( start,end int){
	fmt.Printf("正在爬取 %d 到 %d \n",start,end)

	page :=make(chan int)	//设置多线程

	for i:=start;i<=end;i++{
		go SpidePage(i,page)
	}
	for i:=start;i<=end;i++{
		fmt.Printf("第 %d 页爬取完毕\n",<-page)
	}
}

func main() {
	//指定爬取起始、终止页
	var start,end int
	fmt.Println("请输入爬取的起始页(>=1):")
	fmt.Scan(&start)
	fmt.Println("请输入爬取的终止页(>=start):")
	fmt.Scan(&end)

	working(start,end)
}

func SpidePage(i int,page chan int){
	//网站每一页的改变
	url :="https://wall.alphacoders.com/by_category.php?id=3&name=Anime+Wallpapers&page="+strconv.Itoa(i*1)
	//读取这个页面的所有信息
	result,err :=HttpGet(url)
	//判断是否出错,并打印信息
	if err!=nil{
		fmt.Println("SpidePage err:",err)
	}

	//正则表达式提取信息
	str :=`<div class="thumb-container-big " id="thumb_(?s:(.*?))">`
	//解析、编译正则
	ret :=regexp.MustCompile(str)
	//提取需要信息-每一个图片的数字
	urls :=ret.FindAllStringSubmatch(result,-1)

	for _,jokeURL := range urls{
		//组合每个图片的url
		joke :=`https://wall.alphacoders.com/big.php?i=`+jokeURL[1]

		//爬取图片的url
		tuUrl,err :=SpideJokePage(joke)
		if err!=nil{
			fmt.Println("tuUrl err:",err)
			continue
		}

		SaveJokeFile(tuUrl)

	}
	
	//防止主go程提前结束
	page <-i
}

//爬取图片放大的页面
func SpideJokePage(url string) (tuUrl string,err error){
	//爬取网站的信息
	result,err1 :=HttpGet(url)
	if err1!=nil{
		err = err1
		fmt.Println("SpidePage err:",err)
	}

	str :=`<img class="main-content" src="(?s:(.*?))"`
	//解析、编译正则
	ret :=regexp.MustCompile(str)
	//提取需要信息-每一个段子的url
	alls :=ret.FindAllStringSubmatch(result,-1)
	for _,temTitle :=range alls{
		tuUrl = temTitle[1]
		break
	}

	return
}


GO语言中的colly框架可以用于爬取图片。下面是一个使用colly框架爬取图片的示例代码: ```go package main import ( "fmt" "log" "net/http" "os" "strings" "github.com/gocolly/colly" ) func main() { c := colly.NewCollector() // 设置要爬取的网站 c.AllowedDomains = []string{"example.com"} // 在请求之前执行的操作 c.OnRequest(func(r *colly.Request) { fmt.Println("Visiting", r.URL.String()) }) // 在响应中查找图片链接 c.OnHTML("img[src]", func(e *colly.HTMLElement) { imgURL := e.Attr("src") if strings.HasPrefix(imgURL, "http") { // 下载图片 err := DownloadImage(imgURL) if err != nil { log.Println("Failed to download image:", err) } } }) // 开始爬取 err := c.Visit("http://example.com") if err != nil { log.Println("Failed to visit website:", err) } } // 下载图片 func DownloadImage(url string) error { response, err := http.Get(url) if err != nil { return err } defer response.Body.Close() fileName := GetFileName(url) file, err := os.Create(fileName) if err != nil { return err } defer file.Close() _, err = io.Copy(file, response.Body) if err != nil { return err } fmt.Println("Downloaded", fileName) return nil } // 获取文件名 func GetFileName(url string) string { parts := strings.Split(url, "/") return parts[len(parts)-1] } ``` 上述代码使用colly框架创建了一个爬虫,它会访问指定的网站,并在响应中查找图片链接。如果找到了以"http"开头的图片链接,就会下载该图片并保存到本地。 请注意,上述代码中的`"example.com"`应该替换为你要爬取图片的网站域名。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值