Go语言爬虫实战(线程池)

本文详细介绍了如何使用Go语言编写爬虫程序,包括从指定网站获取图片,通过正则表达式解析HTML,利用线程池并发爬取,以及创建多个文件夹存储图片的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不吃牛肉!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值