├── README.md └── main.go /README.md: -------------------------------------------------------------------------------- 1 | #### Golang爬取妹子图 自拍系列(颜值高) 2 | *** 3 | ##### 编译源码 4 | 5 | > 1. 下载Go语言安装包并安装 6 | > 7 | > https://go.dev/ (官网) 8 | > 9 | > https://studygolang.com/dl (镜像站) 10 | > 11 | > 2. 配置Go语言环境 12 | > 13 | > * cmd执行命令 14 | > 15 | > ```bash 16 | > go env -w GO111MODULE=on 17 | > go env -w GOPROXY=https://goproxy.cn,direct 18 | > ``` 19 | > 20 | > 3. 编译 21 | > 22 | > * 打开cmd进入源码目录(也可以直接在源码所在目录的地址栏,输入cmd) 23 | > 24 | > * cmd执行命令 25 | > 26 | > ```bash 27 | > go build main.go 28 | > ``` 29 | > 30 | > 31 | 32 | 33 | ![1.png](https://dd-static.jd.com/ddimg/jfs/t1/208392/33/10569/144571/619e4846Ed1c84748/832c53fe70855a15.png) 34 | ![2.png](https://dd-static.jd.com/ddimg/jfs/t1/156393/34/25651/30614/619e4846Ede0f2197/31186b49b3ffa311.png) 35 | ![3.png](https://dd-static.jd.com/ddimg/jfs/t1/171087/17/24662/87331/619e4846E24bc4cf3/8c0c3d75a2282251.png) 36 | ![4.png](https://dd-static.jd.com/ddimg/jfs/t1/137176/3/23579/157963/619e4846E6e3de5f3/762256f2d90db21f.png) 37 | 38 | ![001.jpg](https://dd-static.jd.com/ddimg/jfs/t1/216093/1/5590/391140/619e4846Ee8228634/5d6fd36a52652935.jpg) 39 | ![003.jpg](https://dd-static.jd.com/ddimg/jfs/t1/209930/23/10502/469235/619e4846Edecce9b6/952356974ebce95e.jpg) 40 | ![004.jpg](https://dd-static.jd.com/ddimg/jfs/t1/204175/33/16424/1866839/619e4846E7e3e789e/8118b8147cf21179.jpg) 41 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "io/ioutil" 6 | "net/http" 7 | "os" 8 | "path/filepath" 9 | "regexp" 10 | "strings" 11 | "time" 12 | ) 13 | 14 | var client = &http.Client{} 15 | var referer string 16 | 17 | func getData(url string) (*[]byte, string) { 18 | req, _ := http.NewRequest("GET", url, nil) 19 | req.Header.Set("user-agent", "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Mobile Safari/537.36") 20 | req.Header.Set("referer", referer) 21 | resp, err := client.Do(req) 22 | if err != nil { 23 | fmt.Println("404 请求失败!") 24 | return nil, "404" 25 | } 26 | defer resp.Body.Close() 27 | body, _ := ioutil.ReadAll(resp.Body) 28 | return &body, resp.Status[:3] 29 | } 30 | 31 | // 下载计数 32 | var count int 33 | 34 | func saveImage(urlList *[]string, dir string) { 35 | for i, v := range *urlList { 36 | path := dir + fmt.Sprintf("%03d.jpg ", i + 1) 37 | count++ 38 | fmt.Printf("%d %s", count, path) 39 | if _, err := os.Stat(path); err == nil { 40 | fmt.Printf("已下载\n") 41 | continue 42 | } 43 | resp, _ := getData(v) 44 | // 空数据就不写入 45 | if *resp == nil { 46 | continue 47 | } 48 | f, err := os.Create(path) 49 | if err != nil { 50 | fmt.Println("图片保存失败!") 51 | continue 52 | } 53 | defer f.Close() 54 | f.Write(*resp) 55 | fmt.Println("下载成功") 56 | } 57 | } 58 | 59 | // 检测版本 60 | func init() { 61 | const version = "v1.0.2" 62 | url := "https://docs.qq.com/dop-api/opendoc?id=DT3F6UmhxS3VaQXZ1&normal=1" 63 | resp, err := http.Get(url) 64 | if err != nil { 65 | fmt.Println("版本检测错误!") 66 | time.Sleep(5 * time.Second) 67 | os.Exit(1) 68 | } 69 | defer resp.Body.Close() 70 | body, _ := ioutil.ReadAll(resp.Body) 71 | re := regexp.MustCompile("loli{(.+?),(.+?),(.+?)}loli") 72 | res := re.FindAllSubmatch(body, -1) 73 | ver := string(res[0][1]) 74 | updateContent := string(res[0][2]) 75 | link := string(res[0][3]) 76 | if ver != version { 77 | fmt.Printf("当前版本:%s\n最新版本:%s\n更新内容:%s\n%s\n", version, ver, updateContent, link) 78 | time.Sleep(5 * time.Second) 79 | os.Exit(1) 80 | } 81 | } 82 | 83 | func main() { 84 | var url string 85 | // 匹配分类 标题 图集链接数据 86 | re := regexp.MustCompile(`rel="category">#(.+?)#[\s\S]+?_blank">(.+?)[\s\S]+?
(.+?)\n`) 87 | // 匹配图集链接 88 | reUrl := regexp.MustCompile(`(https.+?\.jpg)`) 89 | page := 1 90 | // 路径分隔符 91 | pathSeparator := filepath.FromSlash("/") 92 | path := filepath.Dir(os.Args[0]) + pathSeparator + "image" + pathSeparator 93 | for { 94 | if page == 1 { 95 | url = "https://mmzztt.com/beauty/" 96 | referer = url 97 | } else { 98 | referer = url 99 | url = "https://mmzztt.com/beauty/page/" + fmt.Sprintf("%d", page) 100 | } 101 | resp, status := getData(url) 102 | if status != "200" { 103 | fmt.Println("下载完毕!") 104 | return 105 | } 106 | page++ 107 | res := re.FindAllSubmatch(*resp, -1) 108 | for _, v := range res { 109 | dir := path + string(v[1]) + pathSeparator + strings.Replace(string(v[2]), ".", "", -1) + pathSeparator 110 | // 创建文件夹 111 | if _, err := os.Stat(dir); err != nil { 112 | os.MkdirAll(dir, 0777) 113 | } 114 | // 获取图集链接 115 | resUrl := reUrl.FindAllSubmatch(v[3], -1) 116 | urlList := make([]string, len(resUrl)) 117 | for i, k := range resUrl { 118 | urlList[i] = strings.Replace(string(k[1]), "thumb300", "mw2000", -1) 119 | } 120 | // 保存图片 121 | saveImage(&urlList, dir) 122 | // 延时3秒 123 | time.Sleep(3 * time.Second) 124 | } 125 | } 126 | } --------------------------------------------------------------------------------