go語言讀取json并下載高清妹子圖片
更新時間:2015年03月20日 14:29:54 投稿:hebedich
前面我們介紹了使用python下載高清妹子圖,作為程序猿,我們當然不能只會一種語言,今天我們就來使用go語言來讀取API來下載妹子圖吧,有需要的宅男們可以參考下。
學了一天golang,一邊看文檔一邊寫的go讀取分析json并下載圖片
json api為愛壁紙HD mac 1920x1200版本,高清妹子圖
總結(jié):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)
}
//根據(jù)URL文件名創(chuàng)建文件
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() {
//檢查并創(chuàng)建臨時目錄
if ! isDirExist(DataRoot) {
os.Mkdir(DataRoot, 0755);
fmt.Println("dir %s created", DataRoot)
}
//生成一個數(shù)據(jù)序列,用來獲取分頁
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下的所有數(shù)據(jù)
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.")
}
以上就是本文的全部內(nèi)容了,希望大家能夠喜歡。
您可能感興趣的文章:
- Go語言中轉(zhuǎn)換JSON數(shù)據(jù)簡單例子
- Go語言對JSON進行編碼和解碼的方法
- 在Go語言程序中使用gojson來解析JSON格式文件
- 使用Go語言解析動態(tài)JSON格式的方法
- 詳解Go語言RESTful JSON API創(chuàng)建
- 關(guān)于go語言載入json可能遇到的一個坑
- Go語言的JSON處理詳解
- 在Go語言中使用JSON的方法
- Go語言結(jié)構(gòu)體定義和使用方法
- 淺談Go語言中的結(jié)構(gòu)體struct & 接口Interface & 反射
- Go語言指針訪問結(jié)構(gòu)體的方法
- go語言使用第三方包 json化結(jié)構(gòu)體操作示例
相關(guān)文章
簡單了解Go語言中函數(shù)作為值以及函數(shù)閉包的使用
這篇文章主要介紹了簡單了解Go語言中函數(shù)作為值以及函數(shù)閉包的使用,是golang入門學習中的基礎(chǔ)知識,需要的朋友可以參考下2015-10-10
go實現(xiàn)一個內(nèi)存緩存系統(tǒng)的示例代碼
本文主要介紹了go實現(xiàn)一個內(nèi)存緩存系統(tǒng)的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-10-10

