Hawk: 无编程抓取淘女郎的所有高清照片
1.这是什么鬼?
哦?美女?
最近看了这一篇文章:http://cuiqingcai.com/1001.html
大概说的是用Python和Pyspider(这货好像是我的一位师兄写的,吓尿),抓取淘宝淘女郎的所有美女照片。只是里面还要敲一堆代码,还要用其他动态js运行框架,看着好不烦人啊。
Hawk是沙漠君开发的一款爬虫和清洗工具,目前已经在Github开源:
https://github.com/ferventdesert/Hawk
最近沙漠君很开心啊,开发的Hawk在GitHub上上百个star,还有歪果仁来帮忙做英文国际化,哈哈哈。
那既然如此,我也用Hawk练练手,基本无需编程,直接无视动态js调用,下载高清图片。造福各位园友。
这简直就是用Hawk做坏事,顺便炫技啊~~
2.先让兄弟们饱饱眼福?
先看看抓取的效果,我才不直接放高清图呢!

恩,先去下载软件吧,在百度云盘(这货最近经常脑抽),如果你之前下过软件,一定要更新Hawk开头的dll和exe文件,其他不需要。因为勤劳的沙漠君又更新代码了...
http://pan.baidu.com/s/1c8zBiQ 密码:4iy0
注意三个后缀名为config和xml的配置文件一定要下载回来,之后双击Hawk.exe.
我已经把工程文件共享出来了。地址在:
https://github.com/ferventdesert/Hawk-Projects/tree/master/淘女郎
在Hawk菜单->文件->加载工程,把project.xml加载进来。会是下面的样子:

然后,双击“主流程”(点这三个字所在的位置)
之后任务就会被加载进来,在右下角显示所有的任务和数据表:

接下来,在算法视图上,双击主流程,就可以看到这个任务的窗口和属性配置框了:

哈哈,不仅有详细的名字,地址,甚至还有身高体重等详细信息,各位慢慢看。
说好的保存图片呢?别急别急,这只是在模拟运行模式,保存图片这种有副作用的任务是不会执行的。
那我的图片保存在哪里了?注意看到刚才的project.xml文件同目录下,还有主流程.py,这是一个用于配置流程的py脚本。我把一部分内容贴在下面:
#########下面是正式配置文件
#是否要抓取图片?
get(主流程.etls,-1).Enabled=True;
#照片保存路径
path='D:\淘女郎'
#将相册表保存起来吗?
get(相册.etls,-1).Enabled=True;
#保存大图吗?False则只保存小图
find(相册.etls,lambda x:x.Name=='大图').Enabled=True
#每个女郎最多抓取多少张照片
照片数量控制.Take=1000
find(相册.etls,lambda x:x.Name=='图片位置').NewValue=path;
我应该不用解释了吧?对文件进行修改,注意编码格式是UTF-8,然后在模块管理卷展栏的主流程位置点右键,执行任务脚本:

它就会对当前的任务进行修改,如果下面的日志文件显示:

那么脚本没有语法错误,已经成功提交。
之后,激动人心的时刻到了,在属性对话框点击执行:

然后,20个并行抓取任务线程就已经开始了:

系统会自动维持线程列表中的线程数量,只有旧任务工作完毕后,才会添加新的线程进来。
下面的三个表,分别是淘女郎信息表,相册信息表,和照片信息表。采集完毕后,你可以点右键,导出到excel,csv..

至于图片嘛,看看你设置的那个文件夹吧:

Enjoy!
3.代码是怎么写的?
Hawk本身是开源的,本质上是个编译和解释器。生成的xml就是代码和控制逻辑。很多个模块构成处理链条,你可以控制链条上的模块数量,就能观察数据是如何被采集和处理的。
整个程序包含两个流程:
- 主流程:负责从页面生成淘女郎的详细信息列表
- 相册:负责从淘女郎的id和姓名,获取其对应的照片。
主流程:获取女孩信息
先看主流程,我们把调试数量改为1,勾选显示调试详情,点击下一步:

会有下面的信息显示出来,绿色代表该模块输入的列,蓝色代表输出的列。在调试模块属性中显示的是当前模块的基本信息和配置。

基本的逻辑就是,生成从1到4700页的区间数,然后将它们分别转换成url:
https://mm.taobao.com/json/request_top_list.htm?page={0}
然后通过从爬虫采集,获取女孩的列表,再根据用户的id,组合出详情页,并把详情页的信息附加到当前表。将表的内容写入到“淘女郎”表,再针对每个女孩的id,去获取她的相册信息。
相册:获取单个女孩的照片
如果你直接双击相册模块,肯定是出现下面的情况,什么数据都没有:

为什么呢?因为没有提供数据源。在主流程中,相册模块会读取主流程的id和名字两个列的内容,作为输入参数。但独立运行时,需要两个从文本生成来提供任务参数。
因此,我们勾选那两个从文本生成的单选框,表示启用之:
再点刷新,是不是就都有了?

你也可以单步调试,看看这个模块是怎么获得的。基本流程如下:
- 通过女孩的id,组合出相册的url,比如下面:
mm.taobao.com/self/album/open_album_list.htm?_charset=utf-8&user_id%20=687471686 - 通过一个网页采集器,名称为相册列表获取相册
- 再通过相册ID,获取相册的URL。相册的URL需要构造请求,获得的是Json。
- 把Json的头部Jsonp和末尾的括号去掉,形成正确格式的json
- 送入文本到Json转换模块,得到的是字典
- 使用Python转换器,提取里面的picList,再转换为文档列表。这就是照片列表
- 将路径和相册id,组合成实际要保存的图片的位置
- 加入保存超链接文件,会把指定url的文件保存到指定位置
欣赏完相册是怎么执行的之后,在切换回主流程之前,记得把那两个从文本生成关掉。否则会影响主流程的调用。
有两种方法,一种是在主流程任务那里,执行任务脚本,系统会自动操作。
也可以直接在相册的属性对话框中,点击编辑集合,把最上面两个的启用去掉:

值得一提的是,模块上都有标签属性,你可以给某一组的模块打上固定的标签,在外部的python代码中通过标签搜索这些模块,进行批量处理。具体可以参考刚才的那个py文件。
3.下一篇文章的内容?
限于篇幅,本文没有详细地讲解如何模拟动态请求,如何探测请求的内容,这些都会在下一篇文章介绍。
Hawk系列文章:
Hawk-数据抓取工具:简明教程
Hawk: 20分钟无编程抓取大众点评17万数据
etlpy: 并行爬虫和数据清洗工具
有任何问题,欢迎随时交流。
Hawk: 无编程抓取淘女郎的所有高清照片的更多相关文章
- Hawk: 20分钟无编程抓取大众点评17万数据
1. 主角出场:Hawk介绍 Hawk是沙漠之鹰开发的一款数据抓取和清洗工具,目前已经在Github开源.详细介绍可参考:http://www.cnblogs.com/buptzym/p/545419 ...
- Asp.net 使用正则和网络编程抓取网页数据(有用)
Asp.net 使用正则和网络编程抓取网页数据(有用) Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </su ...
- Node JS爬虫:爬取瀑布流网页高清图
原文链接:Node JS爬虫:爬取瀑布流网页高清图 静态为主的网页往往用get方法就能获取页面所有内容.动态网页即异步请求数据的网页则需要用浏览器加载完成后再进行抓取.本文介绍了如何连续爬取瀑布流网页 ...
- 《Python编程第4版 下》高清PDF|百度网盘免费下载|Python基础编程
<Python编程第4版 下>高清PDF|百度网盘免费下载|Python基础编程 提取码:tz5v 当掌握Python的基础知识后,你要如何使用Python?Python编程(第四版)为这 ...
- 《Python编程第4版 上》高清PDF|百度网盘免费下载|Python基础编程
<Python编程第4版 上>高清PDF|百度网盘免费下载|Python基础编程 提取码:8qbi 当掌握Python的基础知识后,你要如何使用Python?Python编程(第四版)为 ...
- Python爬无止境,获得王者荣耀全部高清皮肤
作为一名热爱王者两年的程序员,早就想爬取所有英雄皮肤的高清照片,在设个幻灯片放映,真香,这次只用16行代码就能实现,对于新手拿这个作为实战练手项目既简单又容易上手,快来尝试下. 百度"王者荣 ...
- 用C++实现网络编程---抓取网络数据包的实现方法
一般都熟悉sniffer这个工具,它可以捕捉流经本地网卡的所有数据包.抓取网络数据包进行分析有很多用处,如分析网络是否有网络病毒等异常数据,通信协议的分析(数据链路层协议.IP.UDP.TCP.甚至各 ...
- Python -- 网络编程 -- 抓取网页图片 -- 豆瓣妹子
首先分析页面URL,形如http://dbmeizi.com/category/[1-14]?p=[0-476] 图片种类对应编号: 1:'性感', 2:'有沟', 3:'美腿', 4:'小露点', ...
- Python -- 网络编程 -- 抓取网页图片 -- 图虫网
字符串(str)编码成字节码(bytes),字节码解码为字符串 获取当前环境编码:sys.stdin.encoding url编码urllib.parse.quote() url解码urllib.pa ...
随机推荐
- 我对 Java 标识符的分类命名方法
我对 Java 的各种标识符有一套固定的分类方法,以下分享一下我的命名方法以及进行一些说明. # 前缀: 方法 方法:f_doSomeThing().分类词是 f,采自 [f]unction 方法,也 ...
- MongoDB aggregate 运用篇
基础知识 操作符介绍: $project:包含.排除.重命名和显示字段 $match:查询,需要同find()一样的参数 $limit:限制结果数量 $skip:忽略结果的数量 $sort:按照给定的 ...
- 【Postgresql】数据库函数
1.Postgresql查询前几条记录的SQL语句 select * from table where ...... LIMIT N ; 2.SQL limit integer offset int ...
- spring mvc + ehcache 利用注解实现缓存功能
我的spring是3.1的,因为项目需求,需要在查询时候加上缓存,小白一个,完全没有用过缓存(ehcache),摸索了一天终于会了一点通过注解来使用ehcache进行缓存,立刻给记录下来. 首先 我的 ...
- 第一章-第十五题(谈谈你对压力的看法,以及怎么和别人合作, 帮助别人,把压力转化为动力,在互相帮助的环境中成长。)--By林培文
压力是一把双刃剑,有害也有利,重点是如何看待压力,从而做到趋利避害,化压力为动力.对于当前的我来说,压力利大于弊.形成这一想法,我经历了好几个阶段.第一个阶段是小学时代,那会整天就知道玩,也没什么压力 ...
- 浅谈C#中常见的委托<Func,Action,Predicate>(转)
一提到委托,浮现在我们脑海中的大概是听的最多的就是类似C++的函数指针吧,呵呵,至少我的第一个反应是这样的. 关于委托的定义和使用,已经有诸多的人讲解过,并且讲解细致入微,尤其是张子阳的那一篇.我就不 ...
- 字节流与数据类型的相互转换---使用struct模块
字节流与数据类型的相互转换---使用struct模块 http://blog.csdn.net/Sunboy_2050/article/details/5974029 Python是一门非常简洁的语言 ...
- CYQ.Data V5 分布式缓存MemCached应用开发介绍
前言 今天大伙还在热议关于.NET Core的东西,我只想说一句:在.NET 跨平台叫了这么多年间,其实人们期待的是一个知名的跨平台案例,而不是一堆能跨平台的消息. 好,回头说说框架: 在框架完成数据 ...
- Java工作环境笔记
环境 1. Jvm最简生存指南: http://www.importnew.com/10127.html 2. 所有路径中,不要出现中文,即使开始的时候,调试Tomcat时,路径有中文也可以,你真不知 ...
- SQL SERVER 2016 AlwaysOn 无域集群+负载均衡搭建与简测
之前和很多群友聊天发现对2016的无域和负载均衡满心期待,毕竟可以简单搭建而且可以不适用第三方负载均衡器,SQL自己可以负载了.windows2016已经可以下载使用了,那么这回终于可以揭开令人憧憬向 ...