zoukankan      html  css  js  c++  java
  • 批量下载 Bing 墙纸

    cn.bing.com 的背景图片的质量还是很高的,值得下载。

    package main
    
    import (
    	"compress/gzip"
    	"fmt"
    	"io/ioutil"
    	"log"
    	"net/http"
    	"net/url"
    	"os"
    	"path"
    	"regexp"
    	"strings"
    )
    
    var (
    	httpc = &http.Client{}
    
    	regWallpaper = regexp.MustCompile(`http://s.cn.bing.net/az/hprichbg/rb/[a-zA-z0-9_-]*_1920x1080.jpg`)
    )
    
    //判断网页是否使用 gzip 压缩,如果是则进行解压
    func ungzipRespBody(resp *http.Response) (b []byte, err error) {
    	body := resp.Body
    	if strings.Contains(resp.Header.Get("Content-Encoding"), "gzip") {
    		body, err = gzip.NewReader(resp.Body)
    		if err != nil {
    			return nil, err
    		}
    	}
    	defer body.Close()
    
    	return ioutil.ReadAll(body)
    }
    
    func setHeaders(req *http.Request) {
    	req.Header.Set("Accept-Encoding", "gzip, deflate")
    	req.Header.Set("User-Agent", "Mozilla/5.0 (Ubuntu) Chrome/38.0.2125.122")
    }
    
    //获取页面
    func HttpGet(url string) ([]byte, error) {
    	req, err := http.NewRequest("GET", url, nil) //创建 request
    	if err != nil {
    		return nil, err
    	}
    	setHeaders(req)
    
    	resp, err := httpc.Do(req) //发送请求
    	if err != nil {
    		return nil, err
    	}
    
    	return ungzipRespBody(resp)
    }
    
    //下载文件
    func Downfile(url, target string) (err error) {
    	body, err := HttpGet(url)
    	if err != nil {
    		return err
    	}
    
    	return ioutil.WriteFile(target, body, os.ModePerm)
    }
    
    func main() {
    	body, err := HttpGet("http://cn.bing.com/HPImageArchive.aspx?format=js&idx=1&n=10")
    	if err != nil {
    		log.Panic(err)
    	}
    
    	wallpaper := regWallpaper.FindAll(body, -1)
    
    	for i, wpaper := range wallpaper {
    		wStr := string(wpaper)
    
    		u, err := url.Parse(wStr)
    		if err != nil {
    			log.Print(err)
    			continue
    		}
    		filename := path.Base(u.Path)
    
    		err = Downfile(wStr, filename)
    		if err != nil {
    			log.Print(err)
    			continue
    		}
    
    		fmt.Printf("%d. Downloaded %s
    ", i, filename)
    	}
    }
    
  • 相关阅读:
    AJAX请求 $.post方法的使用
    通过jQuery Ajax使用FormData对象上传文件
    iframe跨域访问
    js编码解码
    ajax头像上传
    无边框窗体和用户控件以及权限
    只开启一个窗体和进程以及多线程的操作
    通过一个窗体操作另一个窗体
    流和打印控件用法
    listview和简单的记事本操作
  • 原文地址:https://www.cnblogs.com/bing-l/p/4251669.html
Copyright © 2011-2022 走看看