GoLang爬取花瓣网美女图片
由于之前一直想爬取花瓣网(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爬取花瓣网美女图片相关推荐
- java的简单网络爬虫(爬取花瓣网的图片)
因为本人对爬虫比较感兴趣,加上之前也写过一些简单的python爬虫,所以在学完java基础后写了一个简单的网络图片爬虫.废话不多说直接上过程代码.(爬取的图源来自花瓣网:https://huaban. ...
- 程序员的快乐-用python爬取彼岸网美女图片
初入红尘,不知人间疾苦, 暮然回首,已是苦中之人. 这杯中 酒三分, 这酒中 悲七分. 关关难过 关关过, 夜夜难熬 夜夜熬. 愿这世间爱恨情仇尽融于酒, 将这风尘作酒 一饮消愁! 这是枕上诗书里的一 ...
- 爬虫爬取二次元网站美女图片
爬虫爬取二次元网站美女图片 前言 xpath解析 需求分析 代码编写 总代码 前言 本次需要爬取二次元网站cos板块下的图片 需要用到request模块与lxml模块,所以请提前安装好这两个模块,打开 ...
- Python爬虫之爬取绝对领域美女图片
Python爬虫之爬取绝对领域美女图片 第一步: 导入模块: import requests from lxml import etree 第二步:定义函数: def get_url(start_ur ...
- 2021-7-30 Python-爬虫练手:爬取高质量美女图片
爬取高质量美女图片 目标网站 思路分析 封面页 用bs4确定封面页图片链接 拿到图片链接和名称 保存封面 子页面(套图) 确定子页面位置 获取子页面里图片位置和图片名称 保存组图 完整代码 运行结果 ...
- python爬取街拍美女图片
python爬取街拍美女图片 完整代码: import requests from urllib.parse import urlencode import os from hashlib impor ...
- Java爬虫之利用Jsoup+HttpClient爬取类叔叔不约匿名聊天网站的图片,未果——后爬取某网站美女图片案例
博主最近学了一点爬虫的知识,闲着无聊,秉承学以致用的理念,于是突然想到何不挑战一下,爬取一些叔叔不约网站的图片,来巩固一下所学知识(#滑稽).说干就干,打开eclipse或idea,创建maven工程 ...
- Scrapy--使用phantomjs爬取花瓣网图片
新建一个scrapy工程 (python35) ubuntu@ubuntu:~/scrapy_project$ scrapy startproject huaban 添加一个spider (pytho ...
- Python3 urllib 爬取 花瓣网图片
点我去我的github上看源码 **花瓣网是动态的,所以要抓包分析,但我真的累的不行,不想写教程了,我源码里有注释
- Python爬取mn52网站美女图片以及图片防盗链的解决方法
防盗链原理 http标准协议中有专门的字段记录referer 一来可以追溯上一个入站地址是什么 二来对于资源文件,可以跟踪到包含显示他的网页地址是什么 因此所有防盗链方法都是基于这个Referer字段 ...
最新文章
- 如何在Postfix中设置邮件转发
- 利用partial快乐驱动开发
- latex伪代码添加注释_Latex中文期刊投稿使用:以《系统工程学报》为例
- 在jMeter里如何创建用户定义的能生成随机数的变量
- android 中文参数,(原)Android: 启动另外的APP及传递参数
- redis-py说明文件(转)
- 跟着例子一步步学习redux+react-redux[转载]
- 早上收到这样一份通知,求一无漏洞框架,无力吐槽
- day 11 Python课上练习解释与基础知识练习题试题一
- python制作无限弹窗_Python无限弹窗,开机启动,打包为exe程序
- UniWebView3 使用中遇到的坑
- python 查询ip工具
- 通过读取原始星历文件数据推算GPS卫星位置坐标
- [Excel函数] 逻辑判断函数
- R 回归 虚拟变量na_【R语言进阶】Logistic回归及哑变量设置
- 面试官都会问些什么问题?
- Debian7系统安装python3
- 宝宝的眼睛与微量元素的关系
- 100/1000BASE-T1多端口测试方案
- 【绝对详细!不好使你顺着网线敲我!】Django3.1在Ubuntu16.04上的部署
热门文章
- web漏洞扫描器原理_面向WEB的分布式漏洞扫描器的设计与实践
- java常见面试题:Java程序员面试题(五)
- g ++在linux下编译rapidxml 使用与过程中出现的问题解决
- 关于CUTFTP如何免费下载
- Lightbox插件
- cad vba 打开文件对话框_CADvba开发手册.doc
- 安装SqlServer 2017 时出现“Polybase要求安装Oracle JRE 7 更新51(64位)或更高版本规则失效”报错的解决办法
- Firefox浏览器如何安装Alexa工具条
- ASP+ACCESS校园网物品交易平台
- 如何查看计算机的硬盘序列号,电脑上的硬盘序列号如何查