Go语言爬虫实战
目标
- 利用go语言爬取指定网站的图片。
- 实现爬取网站任意页面所有所需的图片。
- 实现使用go语言线程池开启多个线程爬取图片内容。
- 最后实现创建多个文件夹存储图片。
爬取网站图片
步骤
-
对指定URL发去GET请求,获取对应的响应。
resp, err := http.Get(url)
-
通过返回的响应获取网站的Html文本内容
BodyData, err := io.ReadAll(resp.Body)
-
通过观察Html文本中图片的地址,并写出对应的正则表达式,匹配所有符合的图片信息。
-
细节:通过浏览器的开发者模式,可以更快找到图片的地址
-
reImg := `https?://[^"]+?(\.((jpg)|(png)|(jpeg)|(gif)|(bmp)))`
-
-
保存正则表达式的匹配结果,并对其发起GET请求获取图片资源信息。
-
//创建正则表达式的对象 compile, err := regexp.Compile(reImg) //根据网站得Html内容匹配符合条件的结果,-1的意思是匹配所有结果。正数则表示匹配对应数字的结果 allResult := compile.FindAllString(string(BodyData), -1) //获取图片资源 for i, resultUrl := range allResult { ...}
-
-
保存图片到指定的文件夹
-
//获取图片信息 data, err := io.ReadAll(get.Body) //创建指定文件夹 mkdirPath := "./img/" + "img_" + strconv.Itoa(num) + "/" os.MkdirAll(mkdirPath, os.ModePerm) //创建文件保存图片信息 file, err := os.OpenFile(mkdirPath+"cutImg_"+name, os.O_CREATE|os.O_RDWR, os.ModePerm) //将图片信息写入文件 _, err = file.Write(data)
-
实现爬取网站任意页面
思路
-
可以通过对网站的观察我们可以发现网站各个页面之间微小的变化,然后将需要爬取的网页存储在一个切片当中,之后重复第一步即可。
-
例如:
https://desk.3gbizhi.com/deskFJ/
该网站的网页信息,通过点击翻页可以发现一些规律https://desk.3gbizhi.com/deskFJ/index_1.html
第一页https://desk.3gbizhi.com/deskFJ/index_2.html
第二页https://desk.3gbizhi.com/deskFJ/index_3.html
第三页- 所以这里我们只需改变后面的数字即可获取对应页数的网页信息,并开始爬取图片信息。
-
代码
var start int var end int fmt.Printf("请输入爬取的开始页数:") fmt.Scanf("%d\n", &start) fmt.Printf("请输入爬取的结束页数:") fmt.Scanf("%d\n", &end) reImg := `https?://[^"]+?(\.((jpg)|(png)|(jpeg)|(gif)|(bmp)))` for i := 0; i < end-start+1; i++ { ... urls[i].Url = "https://desk.3gbizhi.com/deskFJ/index_" + strconv.Itoa(urls[i].Id) + ".html" ... }
线程池开启多个线程
- 可以查看往期文章
- https://editor.youkuaiyun.com/md/?articleId=137082930
创建多个文件夹存储图片
-
创建文件夹
os.MkdirAll(mkdirPath, os.ModePerm)
-
在存储图片的时候,获取图片的后缀以及获取图片原名称来命名图片
-
//截取名字和后缀 index := strings.LastIndex(resultUrl, "/") name
-