golang版本的图片爬虫,效果如下

github链接地址:https://github.com/lengyue1084/sspider

里面有可执行文件,使用了go的协程以及一些特性,新手可以拿来学习...

当然你也可以爬一些你想爬的图片,找到图片列表初始页,就可以一页一页爬取了。

编译后的可执行文件下载地址:https://download.csdn.net/download/lengyue1084/12926501

执行界面如下图

采集结果如下图

说明:代码如下,有兴趣的可以拿去玩一下,参考了一些网上的代码,按照如下规则输入命令都可以采集(建议修改一下里面的demo网址,或者协程设置少一点,不要把人家的站搞挂了)。

###########################################:
胖达图片采集器v0.1
该版本支持采集列表规则,页码{{n}}为变量
如:《https://www.58pic.com/collect/fav-{{n}}.html》
其中n为页码,起始页码一般默认为1
###########################################:
命令列表:
1、设置采集前缀 如:https://www.58pic.com/collect/fav-
2、设置采集后缀 如:.html,根据实际情况设置,默认为空
3、设置起始页码 如:1,默认值为1
4、设置最大页码 如:999,根据需要采集的页面列表采集设置默认为999
5、设置最大线程数默认8 
6、开始采集 
8、退出程序

代码入下:

package mainimport ("bufio""fmt""github.com/PuerkitoBio/goquery""io""log""math/rand""net/http""os""path""strconv""strings""sync""time"
)
var MaxGoroutineNum = 8
var Scheme = "https"
var SaveFolder      = "/images/"
var StartUrl = "https://www.58pic.com/collect/fav-1.html"//var StartUrlPre = "https://www.58pic.com/collect/fav-"
//var StartUrlend =".html"
var StartUrlPre = "https://www.58pic.com/collect/fav-1"
var StartUrlend =".html"var CurentPageNum = 1
var MaxPageNum = 999
var pageUrlChan = make(chan string, 50)
var headers = map[string][]string{"Accept":                    []string{"text/html,application/xhtml+xml,application/xml", "q=0.9,image/webp,*/*;q=0.8"},"Accept-Encoding":           []string{"gzip, deflate, sdch"},"Accept-Language":           []string{"zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4"},"Accept-Charset":            []string{"utf-8"},"Connection":                []string{"keep-alive"},"DNT":                       []string{"1"},"Host":                      []string{"www.58pic.com"},"Referer":                   []string{"https://www.58pic.com/collect/fav-1.html"},"Upgrade-Insecure-Requests": []string{"1"},"User-Agent":                []string{"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36"},
}var wg sync.WaitGroup
func main() {// 从标准输入流中接收输入数据input := bufio.NewScanner(os.Stdin)fmt.Printf("###########################################:\n")fmt.Printf("胖达图片采集器v0.1\n")fmt.Printf("该版本支持采集列表规则,页码{{n}}为变量\n如:《https://www.58pic.com/collect/fav-{{n}}.html》\n其中n为页码,起始页码一般默认为1\n")fmt.Printf("###########################################:\n")fmt.Printf("命令列表:\n1、设置采集前缀 如:https://www.58pic.com/collect/fav-\n")fmt.Printf("2、设置采集后缀 如:.html,根据实际情况设置,默认为空\n")fmt.Printf("3、设置起始页码 如:1,默认值为1\n")fmt.Printf("4、设置最大页码 如:999,根据需要采集的页面列表采集设置默认为999\n")fmt.Printf("5、设置最大线程数默认8 \n")fmt.Printf("6、开始采集 \n")fmt.Printf("8、退出程序 \n")fmt.Printf("请输入命令:\n")// 逐行扫描for input.Scan() {cmd := input.Text()// 输入bye时 结束switch cmd {case "1":fmt.Printf("请输入采集前缀:")for input.Scan(){s := input.Text()StartUrlPre = sfmt.Println("您输入的值为采集前缀为:",s)fmt.Printf("请输入命令:\n")break;}case "2":fmt.Printf("请输入采集后缀:")for input.Scan(){s := input.Text()StartUrlend = sfmt.Println("您输入的值为采集后缀为:",s)fmt.Printf("请输入命令:\n")break;}case "3":fmt.Printf("设置起始页码:")for input.Scan(){s := input.Text()CurentPageNum, _ = strconv.Atoi(s)fmt.Println("您输入起始页码默认为:",s)fmt.Printf("请输入命令:\n")break;}case "4":fmt.Printf("设置最大页码:")for input.Scan(){s := input.Text()MaxPageNum, _ = strconv.Atoi(s)fmt.Println("您输入的最大页码为:",s)fmt.Printf("请输入命令:\n")break;}case "5":fmt.Printf("设置最大线程数:")for input.Scan(){s := input.Text()MaxPageNum, _ = strconv.Atoi(s)fmt.Println("您输入的最大线程数为:",s)fmt.Printf("请输入命令:\n")break;}case "6":goto startcase "8":fmt.Printf("程序即将退出~\n")CountTime(5)os.Exit(0)default:fmt.Printf("请输入命令前的序号比如 1~\n")}}//fmt.Printf("Please type in something:\n")
start://判断存储文件夹是否存在if err := MkDirForImages(); err != nil {fmt.Println(err.Error())}wg.Add(MaxGoroutineNum)for i := 0; i < MaxGoroutineNum; i++ {go getAndSaveImages(i)}scheme := StartUrlPre[0:5]if scheme != Scheme{Scheme = "http"}fmt.Println(Scheme)setNextPageUrl()wg.Wait()
}func MkDirForImages() error {rootpath, _ := os.Getwd()SaveFolder = rootpath + SaveFolder + time.Now().Format("2006-01-02") + "/"f, err := os.Open(SaveFolder)defer f.Close()if err != nil && os.IsExist(err) {return nil}if err := os.MkdirAll(SaveFolder, 0777); err != nil {fmt.Println("创建文件夹失败:", err)return err}os.Chmod(SaveFolder, 0777)fmt.Println("文件夹创建成功:", SaveFolder)return nil
}func getAndSaveImages(i int) {//out := <- pageUrlChan//log.Println(out)for url := range pageUrlChan {fmt.Println("携程开启:", i)fmt.Println("携程开启爬取的url:", url)getPageUrlV2(url)//out := <- pageUrlChan//log.Println(out)}wg.Done()
}
func getPageUrlV2(url string) {// Request the HTML page.res, err := http.Get(url)if err != nil {log.Println("抓取分页请求失败:",err)return//log.Fatal("请求失败:",err)}defer res.Body.Close()if res.StatusCode == 200 {doc, err := goquery.NewDocumentFromReader(res.Body)if err != nil {log.Println("读取分页html失败",err)}// Find the review itemsdoc.Find("img").Each(func(i int, s *goquery.Selection) {// For each item found, get the band and titleimageSrc, _ := s.Attr("src")if imageSrc != "" {str := ""imageSrc = strings.Replace(imageSrc, " ", "", -1)if imageSrc[0:4] != "http" && imageSrc[0:5] != "https"  {if imageSrc[0:2] != "//" && imageSrc[0:3]!= "://"{str = Scheme + "://"}else if imageSrc[0:2] == "//" {str = Scheme + ":"}else if imageSrc[0:2] == "://" {str = Scheme}}imageSrc = str + imageSrcfmt.Printf("获取图片地址: %d: %s\n", i, imageSrc)saveImage(imageSrc)}})}returnlog.Println("status code error: %d %s", res.StatusCode, res.Status)//log.Fatalf("status code error: %d %s", res.StatusCode, res.Status)// Load the HTML document}func saveImage(imageUrl string) {res := getReponseWithGlobalHeaders(imageUrl)if err := recover(); res == nil {log.Println("Skip panic2",  err)return}defer func() {if err := res.Body.Close(); err != nil {fmt.Println(err)}}()// 获取图片扩展名fileNameExt := path.Ext(imageUrl)if fileNameExt != ".png" || fileNameExt != ".jpg" || fileNameExt != ".bmp" || fileNameExt != ".gif" {fileNameExt = ".jpg"}// 图片保存的全路径savePath := path.Join(SaveFolder, strconv.Itoa(rand.Int())+fileNameExt)log.Println("savePath", savePath)imageWriter, _ := os.OpenFile(savePath, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0777)length, _ := io.Copy(imageWriter, res.Body)fmt.Println(savePath + " image saved! " + strconv.Itoa(int(length)) + " bytes." + imageUrl)
}func getReponseWithGlobalHeaders(url string) *http.Response {req, _ := http.NewRequest("GET", url, nil)if headers != nil && len(headers) != 0 {for k, v := range headers {for _, val := range v {req.Header.Add(k, val)}}}res, err := http.DefaultClient.Do(req)if err != nil {if err := recover(); err != nil {log.Println("Skip panic",  err)}log.Println(err)}return res
}
func setNextPageUrl() {defer close(pageUrlChan)for {fmt.Println(CurentPageNum)pageUrlChan <- (StartUrlPre + strconv.Itoa(CurentPageNum) + StartUrlend)CurentPageNum++if CurentPageNum == MaxPageNum {break}}}func CountTime(num int) {if num > 0 {fmt.Printf("倒计时:%d秒\n",num)time.Sleep(time.Duration(1) * time.Second)CountTime(num - 1)}
}func Dump(s string)  {fmt.Println("您输入的值为:",s)
}

go写的图片爬虫,支持单页以及列表相关推荐

  1. Java实现PDF文件转图片(支持单页和多页)

    目录 一.背景 二.maven环境 2.1.依赖 2.2.插件 三.PDF工具类 四.实践 4.1.单页PDF形式的发票转为图片 4.2.多页PDF文档转为图片 结语 一.背景   很多小伙伴们不知道 ...

  2. python如何写一个图片进去_python写个图片爬虫

    [root@MGServer pythonscript]# vim getimg.py #!/usr/bin/python #encoding:utf8 import requests,sys,re ...

  3. Node学习记录: 图片爬虫

    一 const request = require('request'); request 对http进行封装的npm request(url,(err,req)=>{ let body=req ...

  4. sqlite 统计每张表的记录数_Excel单页式人事管理表,档案记录,自带查询统计,简单实用...

    Hello大家好,我是帮帮.今天跟大家分享一张Excel单页式人事管理表,日常档案记录,自带查询统计,简单实用. 为了让大家能更稳定的下载模板,我们又开通了全新下载方式(见文章末尾),以便大家可以轻松 ...

  5. 上树建站教程:新手单页网站制作教程上集

    功能强大. 链接.文件下载等功能,一份源程序可以制造出无数个网站,只需一些超级简单的 页面程序可以随意的编辑.修改,包括:图片.文案.背景.图片滚动  单页型网站:就是一个独立页面的网站,是一个纯HT ...

  6. java图片爬虫脚本_代码下载

     这篇文章主要介绍了,如何用纯java写一个图片爬虫,美女图片爬虫代码分享,本文以采集抓取美女图片为例,需要的朋友可以参考下继续鼓捣爬虫,你懂的! 1.需要用到核心架包 <dependency& ...

  7. 多城市企业站群(单页版)

    之前找看到一款多城市的SEO系统,只有单页面,全国城市的,排名很好. 找了很久才找到这套程序,这套也是单页版的城市分站企业站群(只有首页),并且支持自定义,域名泛解析后使用! 程序介绍 多城市站群系统 ...

  8. java sql编辑器 动态报表 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫...

    A代码编辑器,在线模版编辑,仿开发工具编辑器,pdf在线预览,文件转换编码 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,快速开发利器)+快速表单构建器 freemaker模版技术 , ...

  9. 数据库备份还原 quartz定时任务调度 自定义表单 java图片爬虫

    获取[下载地址]   QQ 313596790 三大数据库 mysql  oracle  sqlsever   更专业.更强悍.适合不同用户群体 [新录针对本系统的视频教程,手把手教开发一个模块,快速 ...

最新文章

  1. 作为本科大学生比较适合的水准比较好的,嵌入式软件系统的会议
  2. Android内部自带的SQLite数据库操作dos命令
  3. 三种网络协议的连接方式
  4. call_user_func_array
  5. 计算机相关知识抢答题题库,计算机基础知识抢答赛题库
  6. 比CMD更强大的命令行:WMIC后渗透利用(系统命令)
  7. win10系统与时间服务器同步超时,如何解决Win10系统时间无法同步的问题?
  8. 后台管理系统 - 页面布局设计
  9. 弘扬中国文化创作发展文学建设事业,间谈小说 “文味”和“接笔 ”的看法...
  10. 有关凸集的证明例题_凸集/凸函数习题
  11. 每个人心里一亩一亩田,每个人心中一个一个梦
  12. 十一,常量(constant)详细讲解
  13. Eclipse 前进一步 快捷键 (eclipse实用快捷键)
  14. RTOS系统全Thumb编译+Neon加速火力全开
  15. jQuery选择器(二)
  16. 机器学习模型什么时候需要做数据标准化?
  17. CenOs安装jdk
  18. 当前数据库普遍使用wait-for graph等待图来进行死锁检测
  19. TCP/IP五层模型基本协议及相关报文知识
  20. LikeLib侧链:搭建区块链系统信任传递桥梁

热门文章

  1. 微信分享接口调用(自测通过可以用)
  2. string中c_str()用法总结
  3. 维基解密曝CIA 入侵苹果、安卓机、电视,快来围观8761份泄密文
  4. 阿里云数加产品家族图首次亮相
  5. Social Network 社交网络分析
  6. MVVM架构之自动增删改的极简RecycleView的实现
  7. 基于vue的video播放组件
  8. php面试题之一——PHP核心技术(高级部分)
  9. iOS 自己封装的SDK 打包与合并,新手教程!!!
  10. 艰困之道中学到的经验教训