15035252367 发表于 2021-6-1 19:40

分享一波Golang并发爬取头像的代码

本帖最后由 15035252367 于 2021-6-1 19:42 编辑

前段时间 公司做活动 要求生成一些头像 但是我太懒了(主要是不会)
我就爬了一些

源码地址https://gitee.com/code5/go-test/blob/爬虫/图片爬虫/爬图片.go

贴一下代码吧互相学习

      package main

      import (
      "fmt"
      "io/ioutil"
      "net/http"
      "regexp"
      "sync"
      )

      var (

      //图片正则
      reImage = `"((http://)(.*?)(\.jpg))"`

      //大标题列表 图片
      //class="nr"
      reTitlediv = `<ul[\s\S]class=PicList>[.*\s\S]+<div[\s\S]class="showpage">`
      reTitleurl = `"(https?://)(.*?)(\.((jpg)|(gif)|(bmp)|(jpeg)))"`
      reTitleList = `href="(/touxiang/\d+\.htm)"><`

      //内容页面
      reContentdiv = `<div[\s\S]class="wznr">[.*\s\S]+<div[\s\S]class="wzsx">`

      //图片名字
      imageTitle = `/({2}\d{2,4}_\d{1,3}\.jpg)`
      )
      var wg sync.WaitGroup

      //获取页面数据
      func getUrl(url string) string {
      resp, err := http.Get(url)
      Handerr(err, "http.Get(youxiang)")
      defer resp.Body.Close()

      bodyByte, err := ioutil.ReadAll(resp.Body)
      Handerr(err, "ioutil.ReadAll(resp.Body)")
      bodyStr := string(bodyByte)
      return bodyStr
      }

      //正则分析页面数据
      func FXdata(htmlStr, reStr string) [][]string {
      re := regexp.MustCompile(reStr)
      list := re.FindAllStringSubmatch(htmlStr, -1)
      return list
      }

      //保存图片
      func savepic(url string) {
      defer wg.Add(-1)
      imageNameStr := FXdata(url, imageTitle)
      //fmt.Println(imageNameStr)
      //return
      imageName := imageNameStr
      fmt.Println(imageName, "正在下载")
      resp, err := http.Get(url)
      defer resp.Body.Close()
      if err != nil {
      fmt.Println(err)
      }
      body, err := ioutil.ReadAll(resp.Body)
      if err != nil {
      fmt.Println(err)
      }
      err = ioutil.WriteFile(imageName, body, 0777)
      fmt.Println(err)

      }

      //1.0 解析首页
      func shouye(url string) {
      //fmt.Println(url)
      body := getUrl(url)
      //fmt.Println(body)

      //解析区块内容
      list := FXdata(body, reTitlediv)
      //fmt.Println(list)
      //当前区块 跳转链接
      htmlList := FXdata(list, reTitleList)
      fmt.Println(htmlList)

      for _, val := range htmlList {
      neirong("http://www.2qqtouxiang.com" + val)
      }

      }

      //2.0 内容
      func neirong(imgUrl string) {

      body := getUrl(imgUrl)

      //解析区块内容
      list := FXdata(body, reContentdiv)

      //获取图片地址
      imgList := FXdata(list, reImage)

      fmt.Println("页面:"+imgUrl+"数据个数:", len(imgList))
      for _, val := range imgList {
      wg.Add(1)
      go savepic(val)
      }
      }

      func main() {
      for i := 77; i >= 50; i-- {
      idstr := fmt.Sprintf("%d", i)
      imgUrl := "http://www.2qqtouxiang.com/touxiang/list" + idstr + ".htm"
      fmt.Println(imgUrl)
      shouye(imgUrl)
      }

      wg.Wait()

      }

      func Handerr(err error, msg string) {
      if err != nil {
      fmt.Println(msg, err)
      }
      }

First丶云心 发表于 2021-6-1 19:46

hate 发表于 2021-6-1 20:13

不用goquery?

hahaxi 发表于 2021-6-2 10:32

有一个像素风的生成头像库
https://github.com/o1egl/govatar

15035252367 发表于 2021-6-2 21:00

hahaxi 发表于 2021-6-2 10:32
有一个像素风的生成头像库
https://github.com/o1egl/govatar

这个当时有查到的不合适

15035252367 发表于 2021-6-2 21:01

hate 发表于 2021-6-1 20:13
不用goquery?

当时正练习正则了
页: [1]
查看完整版本: 分享一波Golang并发爬取头像的代码