Golang爬虫下载资源到本地
通过Glang爬取猛男图片到本地保存;
package main
import (
"fmt"
"io"
"net/http"
"os"
"regexp"
"strconv"
)
//http读取网页数据写入result返回
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 result, err
}
var path string = "D:/test/Gundam/"
//保存图片到本地
func saveImg(index int, url string, page chan int) {
//图片httpbody
fmt.Println(index, "-----", url)
//爬取的网站重复使用了这张图
if url == "http://images.17173.com/gd/images/ms/15019.gif" {
return
}
resp, err := http.Get(url)
if err != nil {
fmt.Println("http get err:", err)
return
}
defer resp.Body.Close()
//打开文件流
picName := path + strconv.Itoa(index) + ".gif"
f, errf := os.Create(picName)
if errf != nil {
fmt.Println("os create err:", errf)
return
}
defer f.Close()
buf := make([]byte, 4096)
//读httpbody数据写入文件流
for {
n, err2 := resp.Body.Read(buf)
if n == 0 {
break
}
if err2 != nil && err2 != io.EOF {
err = err2
return
}
f.Write(buf[:n])
}
page <- index
}
//爬取图片
func spiderPic(data string) {
str := regexp.MustCompile("<A href=\"(.*?)\" target=_blank><IMG")
alls := str.FindAllStringSubmatch(data, -1)
page := make(chan int)
for index, value := range alls {
result, err := HttpGet(value[1])
if err != nil {
fmt.Println("HttpGet err3:", err)
return
}
regexpStr := regexp.MustCompile("src=\"(.*?)\" width=\"120\"")
picData := regexpStr.FindAllStringSubmatch(result, -1)
if len(picData) == 0 {
regexpStr = regexp.MustCompile("src=\"(.*?)\" width=120")
picData = regexpStr.FindAllStringSubmatch(result, -1)
}
go saveImg(index, picData[0][1], page)
}
//防止主go退出
count := len(alls)
for i := 0; i < count; i++ {
fmt.Printf("Download %d gif\n", <-page)
}
}
func working() {
url := "http://gd.17173.com/mechanics/index.shtml"
result, err := HttpGet(url)
if err != nil {
fmt.Println("HttpGet err1:", err)
return
}
spiderPic(result)
}
func main() {
working()
}
Life is too short for so much sorrow.
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0 许可协议。转载请注明来自 小紫苏!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)