go语言读取json并下载高清妹子图片

 更新时间:2015年03月20日 14:29:54   投稿:hebedich  
前面我们介绍了使用python下载高清妹子图,作为程序猿,我们当然不能只会一种语言,今天我们就来使用go语言来读取API来下载妹子图吧,有需要的宅男们可以参考下。

学了一天golang,一边看文档一边写的go读取分析json并下载图片
json api为爱壁纸HD mac 1920x1200版本,高清妹子图

总结:go+json=shit

package main
import (
  "fmt"
  "io"
  "io/ioutil"
  "net/http"
  "os"
  "path/filepath"
  "strconv"
  //"encoding/json"
  "strings"
  "github.com/bitly/go-simplejson"
)
const (
  DataRoot   = "./tmp/" // 存放封面图的根目录
  TimeoutLimit = 10    // 设置超时时间
  PageUrl   = "http://api.lovebizhi.com/macos_v4.php?a=category&spdy=1&tid=3&order=hot&color_id=3&device=105&uuid=436e4ddc389027ba3aef863a27f6e6f9&mode=0&retina=0&client_id=1008&device_id=31547324&model_id=105&size_id=0&channel_id=70001&screen_width=1920&screen_height=1200&bizhi_width=1920&bizhi_height=1200&version_code=19&language=zh-Hans&jailbreak=0&mac=&p={pid}"
)
// 壁纸类型,有编号,长宽和URL
type Wallpaper struct {
  Pid   int
  Url   string
  Width  int
  Height  int
}
// 将图片下载并保存到本地
func SaveImage(paper *Wallpaper) {
  res, err := http.Get(paper.Url)
  defer res.Body.Close()
  if err != nil {
    fmt.Printf("%d HTTP ERROR:%s", paper.Pid, err)
    return
  }
  //按分辨率目录保存图片
  Dirname := DataRoot + strconv.Itoa(paper.Width) + "x" + strconv.Itoa(paper.Height) + "/"
  if ! isDirExist(Dirname) {
    os.Mkdir(Dirname, 0755);
    fmt.Printf("dir %s created\n", Dirname)
  }
  //根据URL文件名创建文件
  filename := filepath.Base(paper.Url)
  dst, err := os.Create(Dirname + filename)
  if err != nil {
    fmt.Println("%d HTTP ERROR:%s", paper.Pid, err)
    return
  }
  // 写入文件
  io.Copy(dst, res.Body)
}
func isDirExist(path string) bool {
  p, err := os.Stat(path)
  if err != nil {
    return os.IsExist(err)
  } else {
    return p.IsDir()
  }
}
func main() {
  //检查并创建临时目录
  if ! isDirExist(DataRoot) {
    os.Mkdir(DataRoot, 0755);
    fmt.Println("dir %s created", DataRoot)
  }
  //生成一个数据序列,用来获取分页
  pow := make([]int, 2)
  for i := range pow {
    if (i > 0) {
      url := strings.Replace(PageUrl, "{pid}", strconv.Itoa(i), -1);
      fmt.Println(i, url);
      response, err := http.Get(url)
      if( err != nil) {
        fmt.Println(err)
        continue
      }
      body, _ := ioutil.ReadAll(response.Body)
      js, err := simplejson.NewJson(body)
      //遍历data下的所有数据
      data := js.Get("data").MustArray()
      for _, v := range data {
        v := v.(map[string]interface{})
        for kk, vv := range v {
          if(kk == "file_id") {
            //这里 vv 是一个[]interface{} json.Number,不知道怎么取出值,这里用了比较傻的Sprintf
            vv := fmt.Sprintf("%s", vv)
            imgid,_ := strconv.Atoi(vv)
            url := fmt.Sprintf("http://s.qdcdn.com/c/%d,1920,1200.jpg", imgid)
            fmt.Println(kk, imgid, url);
            paper := &Wallpaper{imgid, url, 1920, 1200}
            SaveImage(paper);
          }
        }
      }
    }
  }
  fmt.Println("oh yes, all job done.")
}

以上就是本文的全部内容了,希望大家能够喜欢。

相关文章

  • 深入了解Golang中的反射机制

    深入了解Golang中的反射机制

    反射是指在程序运行时动态地检查和修改对象的能力,在Go语言中,通过反射可以在运行时检查变量的类型、获取结构体字段和方法的信息,以及动态调用方法等操作,本文将带你深入了解Golang中的反射机制,感兴趣的同学可以跟着小编一起来学习
    2023-05-05
  • 浅谈Go中数字转换字符串的正确姿势

    浅谈Go中数字转换字符串的正确姿势

    这篇文章主要介绍了浅谈Go中数字转换字符串的正确姿势,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • GoLang bytes.Buffer基础使用方法详解

    GoLang bytes.Buffer基础使用方法详解

    Go标准库中的bytes.Buffer(下文用Buffer表示)类似于一个FIFO的队列,它是一个流式字节缓冲区,我们可以持续向Buffer尾部写入数据,从Buffer头部读取数据。当Buffer内部空间不足以满足写入数据的大小时,会自动扩容
    2023-03-03
  • 深入理解golang chan的使用

    深入理解golang chan的使用

    本文主要介绍了golang chan的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • go 实现简易端口扫描的示例

    go 实现简易端口扫描的示例

    该功能实现原理很简单,就是发送socket连接(IP+端口),如果能连接成功,说明目标主机开放了某端口。当要大量扫描端口时,就需要写并发编程了。
    2021-05-05
  • go语言实现同步操作项目示例

    go语言实现同步操作项目示例

    本文主要介绍了go语言实现同步操作项目示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 利用golang实现pdf中自动换行的表格

    利用golang实现pdf中自动换行的表格

    这篇文章主要给大家介绍了如何利用golang实现pdf中自动换行的表格,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Golang通脉之map详情

    Golang通脉之map详情

    这篇文章主要介绍了Golang通脉之map,Go语言中提供的映射关系容器为map,其内部使用散列表(hash)实现,map 是一种无序的键值对的集合。map 最重要的一点是通过 key 来快速检索数据,key 类似于索引,指向数据的值 map 是一种集合,所以可以像迭代数组和切片那样迭代它
    2021-10-10
  • GoLang Time时间操作函数讲解

    GoLang Time时间操作函数讲解

    在日常开发中,我们避免不了时间的使用,我们可能需要获取当前时间,然后格式化保存,也可能需要在时间类型与字符串类型之间相互转换等。本文将会对 Go time 包里面的常用函数和方法进行介绍,需要的可以参考一下
    2023-01-01
  • 在Go中构建并发TCP服务器

    在Go中构建并发TCP服务器

    今天小编就为大家分享一篇关于在Go中构建并发TCP服务器的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10

最新评论