go实现抓妹子图片

1:学习练手用的

2:我也是看到http://www.oschina.net/code/snippet_2362573_48180这篇文章后发现妹子图这个网站结构比较简单,实现起来easy

3:代码还有很多优化的地方,怕老板看见只能回家搞了

4:欢迎指正

直接上代码

package main

import (
"bytes"
"fmt"
"io/ioutil"
"net/http"
"os"
"regexp"
"strconv"
)

const (
PATH string = "/Users/caozhipan/Desktop/meizi" //文件存储路径
STARTURL string = "http://www.mzitu.com/model" //妹子图模块列表页url
CONCURRENCY int = 3 //并发下载数
)

var (
c1 chan string //通道:负责STARTURL,以后可以做成从命令参数里读取哦
c2 chan string //通道: 负责传输所有的模块url
c3 chan []string //通道:负责传输imgUrl
c4 chan int //通道: 负责传输每张图片的下载完成状态
c5 chan int //通道:负责传输当前下载数
)

func init() {
c1 = make(chan string, 1)
c2 = make(chan string, 100)
c3 = make(chan []string, 1000)
c4 = make(chan int, 3)
c5 = make(chan int, 10)
go CgetList()
go Cdownload()
}
func main() {
c1 <- STARTURL
go CgetModel()
num := 0
for count := range c5 {
num = num + count
fmt.Println("已下载:", num)
}
}

//调度器, 拉取所有模块
func CgetModel() {
modelPage := getPage(<-c1)
for i := 1; i <= modelPage; i++ {
modelUrl := STARTURL + "/page/" + strconv.Itoa(i)
c2 <- modelUrl
}
}

//调度器拉取所有图片url,这里其实还可以多分一层
func CgetList() {
k := 0
tmp := make([]string, 3)
for modelUrl := range c2 {
imgLists := getList(modelUrl)
for _, imgList := range imgLists {
imgPage := getPage(imgList)
for j := 1; j <= imgPage; j++ {
imgUrl := imgList + "/" + strconv.Itoa(j)
if k < CONCURRENCY {
tmp[k] = imgUrl
k++
} else {
c3 <- tmp
k = 0
}
}
}
if k != 0 {
c3 <- tmp
k = 0
}
}

}

//调度器, 下载图片
func Cdownload() {
for imgUrls := range c3 {
if len(imgUrls) > 0 {
for _, imgUrl := range imgUrls {
go func() {
download(imgUrl)
c4 <- 1
}()
}
num := 0
for k := range c4 {
num = num + k
if num == len(imgUrls) {
c5 <- num
break
}
}
}
}
}

//图片列表
func getList(url string) (l []string) {
reg, _ := regexp.Compile(`<h2><a href="(http://www.mzitu.com/\d*)" title="(.*?)" target="_blank">.*?</a></h2>`)
_, html, _ := getHtml(url)
lists := reg.FindAllStringSubmatch(html, 1000)
for _, list := range lists {
l = append(l, list[1])
}
return
}

//下载html
func getHtml(url string) (error, string, error) {
response, err := http.Get(url)
defer response.Body.Close()
html, err1 := ioutil.ReadAll(response.Body)
return err, string(html), err1
}

//获取最大分页
func getPage(url string) (page int) {
_, html, _ := getHtml(url)
reg, _ := regexp.Compile(`<span>(\d*)</span>`)
s := reg.FindAllStringSubmatch(html, 200)
if len(s) < 2 {
fmt.Println("获取失败")
os.Exit(-1)
}
page, _ = strconv.Atoi(s[len(s)-1][1])
return

}

//下载图片
func download(url string) {
reg, _ := regexp.Compile(`<p><a href="http:\/\/www.mzitu.com/.*?" ><img src="(.*?)" alt="(.*?)" /></a></p>`)
reg1, _ := regexp.Compile(`http:\/\/pic\.dofay\.com/(.*)`)
_, html, _ := getHtml(url)
iterms := reg.FindAllStringSubmatch(html, 100)
for _, iterm := range iterms {
imgUrl := iterm[1]
imgPath := reg1.FindAllStringSubmatch(imgUrl, 100)
imgPaths := bytes.Split([]byte(imgPath[0][1]), []byte("/"))
path := PATH + "/" // + iterm[2]
imgResponse, _ := http.Get(imgUrl)
defer imgResponse.Body.Close()
imgByte, _ := ioutil.ReadAll(imgResponse.Body)
pInfo, pErr := os.Stat(path)
if pErr != nil || pInfo.IsDir() == false {
errDir := os.Mkdir(path, os.ModePerm)
if errDir != nil {
fmt.Println(errDir)
os.Exit(-1)
}
}
fn := path + "/" + string(imgPaths[len(imgPaths)-1])
_, fErr := os.Stat(fn)
var fh *os.File
if fErr != nil {
fh, _ = os.Create(fn)
} else {
fh, _ = os.Open(fn)
}
defer fh.Close()
fh.Write(imgByte)
}
}
时间: 2024-10-10 20:26:04

go实现抓妹子图片的相关文章

Python Show-Me-the-Code 第 0013 题 抓取妹子图片 使用scrapy

第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-) 参考代码 完整代码 思路: 其实这个可以不用scrapy,就用正则匹配+request应该就可以完成任务了.我想练习下scrapy,于是就用scrapy做这个了. 这个只要求爬一个网页上的图片,所以也不用写什么follow规则,算是比较简单的.通过分析链接里的妹子图片的标签,发现百度贴吧里发的图片是带BDE_Image这个类的,所以就好办了,直接用xpath把所有img标签中带BDE_Image类的全

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)

这道题是一道爬虫练习题,需要爬链接http://tieba.baidu.com/p/2166231880里的所有妹子图片,点进链接看一下,这位妹子是日本著名性感女演员--杉本由美,^_^好漂亮啊,赶紧开始爬吧. 以下就是我的爬虫步骤: 一.获取页面 虽然request和beautifulsoup模块方便又好用,但是我还是决定使用传统的urllib和urllib模块,毕竟对这两个模块熟悉之后,就能基本明白爬虫的原理和实现啦. 首先是导入模块,除了前面提到的两个模块,我们还要导入re模块,使用正则表

python shell 爬虫 妹子图片

最近开始学Python,人们学一门语言潜移默化的第一个命令往往那个就是 hello world! 这里也差不多,用python写了个小爬虫,爬妹子图的"照片".感觉效率好慢,应该是代码的问题, 在此献丑了!!! 需要安装两个好用的库,分别是 requests 和 Beautifulsoup,安装十分简单回头补上! 嗯~就这样 代码在 Python 2.7.8  以及 Python 3.4.1 下都可以测试通过! #coding:utf-8 import requests from bs

Python3使用百度人脸识别接口识别高颜值妹子图片

一.在百度云平台创建应用 为什么要到百度云平台创建应用,首先来说是为了获取获取access_token时需要的API Key和Secret Key 至于为什么需要API Key和Secret Key才能获取access_token,应该一是为了推广一下百度云二是为了获取一些统计数据.微信苹果要你们搞得,度娘就不能要你们搞得?不要纠结 1.访问百度AI开放 平台:http://ai.baidu.com/ 2."产品服务"----"人脸检测" 3. "立即使用

Python3+scrapy+selenium+BaiduAI识别并下载花瓣网高颜值妹子图片

一.说明 1.1 背景说明 上周在"Python3使用百度人脸识别接口识别高颜值妹子图片"中自己说到在成功判断颜值后,下截图片并不是什么难点. 直观感觉上确实如此,你判断的这个url适不适合下载,适合我就去下不适合就不去下,这算什么难点呢. 但事实经常没有想象的那么简单,所以决定去验证一下.结果再次证实自己想简单了,程序的编写和调试花了一周的业余时间,好在总算完成了. 1.2 程序编写过程说明 我以花瓣网http://huaban.com/favorite/beauty/入手,首先确定

Node批量抓取高清妹子图片

node爬虫很有意思,看大神都是各种爬小说,爬图片,爬视频等等.自己也是刚了解,希望可以共同学习~ 代码如下: //依赖模块 var fs = require('fs'); var request = require("request"); var cheerio = require("cheerio"); var mkdirp = require('mkdirp'); //目标网址 var url = 'http://www.win4000.com/meinvta

python多任务抓取虎牙妹子图片

import re import urllib.request import gevent def download(image_download, images_path,i): headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36"}

3·15晚会观感 游侠教你1分钟通过WIFI抓妹子信息

央视3·15晚会刚刚给大家演示了WIFI的风险,坦白的说,很多朋友喜欢在咖啡馆.茶馆.宾馆等公众场合登录WIFI进行各种操作,相当不安全! 现在,游侠安全网给大家演示下,如何在1分钟内完成钓鱼WIFI热点的创建并开始抓取别人密码--做这个仅仅是为了让各位有一个心理准备:公众WIFI很危险!如果你去犯罪,游侠可以很负责的告诉你:警察叔叔想抓你的话,还是有办法的!很多比这高明的都抓进去了. 话说,某日,我在星巴克看到一个姑娘正在上51job找工作(对不起,用你当例子了),姑娘又长得很好看--想搭讪又

爬取妹子图片

学习练习爬虫的时候写了一个爬取妹子的小程序玩玩. from bs4 import BeautifulSoup import requests import os from threading import Thread ''' soup.find( name , attrs , recursive , string , **kwargs )函数 name:查找哪一个标签 attrs:标签里的指定那个参数,比如class 注意: BeautifulSoup()返回的类型是<class 'bs4.B