由于之前一直想爬取花瓣网(http://huaban.com/partner/uc/aimeinv/pins/) 的图片,又迫于没时间,所以拖了很久。
鉴于最近在学go语言,就刚好用这个练手了。

预览

进入网站后,首页大概是这个样子

分析

网站采用的流式布局,动态加载。未经渲染的初始页面源代码中包含有20张图片的相关信息。
每张图片有它的pin_id和key, pin_id差不多就是id,而key应该是文件的特性码,由此key拼接url可以直接得到图片的地址。

使用了动态加载,鉴于这个比较简单,就没必要用无头浏览器了, 直接需要抓包分析,来手动模拟翻页请求。

翻页的一个实例:

http://huaban.com/partner/uc/aimeinv/pins/?max=2117952645&limit=8&wfl=1

有三个参数max就是图片的id, limit是指定了返回图片的数量,而那个wfl就不知道了,变成0好像也没啥变化,就不管它了。

这里我想,要是直接把limit变成一个很大的数,翻页的过程不就省略了吗?,于是就试了个800。结果我的妈呀,它还真返回了这么多。。。

不过作为一个上进的程序员(●’◡’●),怎么能采取这种方法呢。于是继续研究,发现那个max是当前页最后一张图片的id,这样的话就好办了。

开始

首先由url获取网页返回的内容

func getHtml(url string) string{resp, err := http.Get(url)if err != nil {fmt.Println("A error occurred!")}defer resp.Body.Close()htmlBytes, err := ioutil.ReadAll(resp.Body)if err != nil {log.Fatal(err)}return string(htmlBytes)
}

然后解析该网页,包括下载该页中的图片,以及得到max值用于翻页。抓包时发现浏览器中返回的是json,我自己也试着加上Accept头,接受json类型,但返回的仍然是html,估计是少了什么header,这里我也懒得去尝试缺少啥头部了,直接对返回的html页面解析,就像第一次打开首页那样。另外由于key都位于script标签内,所以就不太适合用goquery等库了,直接用正则解析吧


func parsePage(strHtml string) string{// 利用正则爬取页面中图片的keyreg := regexp.MustCompile("\"key\":\"(.*?)\"")keys := reg.FindAllStringSubmatch(strHtml, -1)// 利用正则爬取页面中图片的pin_idrege := regexp.MustCompile(`"pin_id":(\d+),`)ids := rege.FindAllStringSubmatch(strHtml, -1)for i := 0; i < len(keys) ; i++ {key := keys[i][1]// 过滤掉非图片类型的keyif len(key) < 46{continue}fmt.Println(parseKey(key))downImg(parseKey(key))count++}// 得到用于翻页的idfmt.Println(ids[len(ids)-1][1])return ids[len(ids)-1][1]
}

其中downImg()是图片下载函数


// 图片下载函数
func downImg(url string) {// 处理前缀为//的urlif string([]rune(url)[:2]) == "//" {url = "http:" + urlfmt.Println(url)}// 解决文件无图片格式后缀的问题fileName := path.Base(url)if !strings.Contains(fileName, ".png") {fileName += ".png"}resp, err := http.Get(url)if err != nil {fmt.Println("A error occurred!")return}defer resp.Body.Close()reader := bufio.NewReaderSize(resp.Body, 32*1024)file, _ := os.Create(BasePath + fileName)writer := bufio.NewWriter(file)written, _ := io.Copy(writer, reader)fmt.Printf("Total length: %d\n", written)
}

关键的main函数是

func main() {fmt.Println("Spider Start: ------------------------------>")html := getHtml(HuabanUrl)for i := 0; i < PageNum + 1; i++ {id := parsePage(html)html = getHtml(nextPage(id))}fmt.Println("任务完成,共计下载:", count)
}

截图

运行截图

及成果截图(不是缩略图哦(●’◡’●))

完整代码位于 github.com/asche910

GoLang爬取花瓣网美女图片相关推荐

  1. java的简单网络爬虫(爬取花瓣网的图片)

    因为本人对爬虫比较感兴趣,加上之前也写过一些简单的python爬虫,所以在学完java基础后写了一个简单的网络图片爬虫.废话不多说直接上过程代码.(爬取的图源来自花瓣网:https://huaban. ...

  2. 程序员的快乐-用python爬取彼岸网美女图片

    初入红尘,不知人间疾苦, 暮然回首,已是苦中之人. 这杯中 酒三分, 这酒中 悲七分. 关关难过 关关过, 夜夜难熬 夜夜熬. 愿这世间爱恨情仇尽融于酒, 将这风尘作酒 一饮消愁! 这是枕上诗书里的一 ...

  3. 爬虫爬取二次元网站美女图片

    爬虫爬取二次元网站美女图片 前言 xpath解析 需求分析 代码编写 总代码 前言 本次需要爬取二次元网站cos板块下的图片 需要用到request模块与lxml模块,所以请提前安装好这两个模块,打开 ...

  4. Python爬虫之爬取绝对领域美女图片

    Python爬虫之爬取绝对领域美女图片 第一步: 导入模块: import requests from lxml import etree 第二步:定义函数: def get_url(start_ur ...

  5. 2021-7-30 Python-爬虫练手:爬取高质量美女图片

    爬取高质量美女图片 目标网站 思路分析 封面页 用bs4确定封面页图片链接 拿到图片链接和名称 保存封面 子页面(套图) 确定子页面位置 获取子页面里图片位置和图片名称 保存组图 完整代码 运行结果 ...

  6. python爬取街拍美女图片

    python爬取街拍美女图片 完整代码: import requests from urllib.parse import urlencode import os from hashlib impor ...

  7. Java爬虫之利用Jsoup+HttpClient爬取类叔叔不约匿名聊天网站的图片,未果——后爬取某网站美女图片案例

    博主最近学了一点爬虫的知识,闲着无聊,秉承学以致用的理念,于是突然想到何不挑战一下,爬取一些叔叔不约网站的图片,来巩固一下所学知识(#滑稽).说干就干,打开eclipse或idea,创建maven工程 ...

  8. Scrapy--使用phantomjs爬取花瓣网图片

    新建一个scrapy工程 (python35) ubuntu@ubuntu:~/scrapy_project$ scrapy startproject huaban 添加一个spider (pytho ...

  9. Python3 urllib 爬取 花瓣网图片

    点我去我的github上看源码 **花瓣网是动态的,所以要抓包分析,但我真的累的不行,不想写教程了,我源码里有注释

  10. Python爬取mn52网站美女图片以及图片防盗链的解决方法

    防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防盗链方法都是基于这个Referer字段 ...

最新文章

  1. 如何在Postfix中设置邮件转发
  2. 利用partial快乐驱动开发
  3. latex伪代码添加注释_Latex中文期刊投稿使用:以《系统工程学报》为例
  4. 在jMeter里如何创建用户定义的能生成随机数的变量
  5. android 中文参数,(原)Android: 启动另外的APP及传递参数
  6. redis-py说明文件(转)
  7. 跟着例子一步步学习redux+react-redux[转载]
  8. 早上收到这样一份通知,求一无漏洞框架,无力吐槽
  9. day 11 Python课上练习解释与基础知识练习题试题一
  10. python制作无限弹窗_Python无限弹窗,开机启动,打包为exe程序
  11. UniWebView3 使用中遇到的坑
  12. python 查询ip工具
  13. 通过读取原始星历文件数据推算GPS卫星位置坐标
  14. [Excel函数] 逻辑判断函数
  15. R 回归 虚拟变量na_【R语言进阶】Logistic回归及哑变量设置
  16. 面试官都会问些什么问题?
  17. Debian7系统安装python3
  18. 宝宝的眼睛与微量元素的关系
  19. 100/1000BASE-T1多端口测试方案
  20. 【绝对详细!不好使你顺着网线敲我!】Django3.1在Ubuntu16.04上的部署

热门文章

  1. web漏洞扫描器原理_面向WEB的分布式漏洞扫描器的设计与实践
  2. java常见面试题:Java程序员面试题(五)
  3. g ++在linux下编译rapidxml 使用与过程中出现的问题解决
  4. 关于CUTFTP如何免费下载
  5. Lightbox插件
  6. cad vba 打开文件对话框_CADvba开发手册.doc
  7. 安装SqlServer 2017 时出现“Polybase要求安装Oracle JRE 7 更新51(64位)或更高版本规则失效”报错的解决办法
  8. Firefox浏览器如何安装Alexa工具条
  9. ASP+ACCESS校园网物品交易平台
  10. 如何查看计算机的硬盘序列号,电脑上的硬盘序列号如何查