Image Capture

在申请这个博客的时候,定了一个小目标要半个月发一篇文章,结果发现如果不发漏洞分析的话好像很难有其他的文章。在这个月的最后一天终于在 5alt 大佬的帮助和鄙视下完成了一个小爬虫工具。现写一篇文章记录一下这个工具的整个开发过程。

需求

在浏览图片类网站的时候我们经常看到一些不错的图集,想要把整个图集都下载下来满足一些奇怪的需求。这时候如果网站本身没有提供打包下载功能的话,就需要一张一张的下载图片。这种方法显然很不方便,于是便有了这个工具的想法,看到我们中意的图集时可以通过简单的操作就自动下载下来所有的图片。

最简单的办法就是使用网页爬虫对网站上的图片进行爬取。但是这种方式也有一个问题就是无法做到通用,可能针对一个网站设计的爬虫在另一个网站上就不那么适用。如果简单的把所有图片都抓取的话又会爬下来许多不需要的内容

对这个工具的要求是:准确通用少用户干预

设计

在设计这个工具时遇到了很多困难,最大的问题是工具的通用性和准确性之间的平衡。一般来说图片类的网站主要有以下四种情况

  • 每页中将图集中所有图片全部显示出来,图片链接遵循序号规则
  • 每页中只显示一个或者多个图片,图集分多页显示,图片链接遵循序号规则
  • 每页中将图集中所有图片全部显示出来,图片链接为 hash 值或者含有随机字符
  • 每页中只显示一个或者多个图片,图集分多页显示,图片链接为 hash 值或者含有随机字符

针对这样的问题,工具分为前端和后端两个部分来设计。前端使用 TamperMonkey来实现,负责对页面内容进行分析,根据网页中图片的情况动态生成模版和模版参数,并通过 HttpXMLRequest 按照一定的格式将信息发送给后端;后端是一个搭建在本地的 LocalServer,可以接收从前端传入的数据,并对数据进行解析根据模版以及模版参数进行图片抓取,同时还需要绕过网站对于爬虫的诸多检测

而以上四种情况的图片类网页,工具分别有不同的处理。针对问题的复杂性不同,这里倒叙说明一下各个情况的处理方案。

对于最后一种情况,由于图片链接没有遵循既定的格式,因此无法直接通过图片链接模版加参数的形式直接爬取。而由于页面上也不会显示所有的图片,也无法通过前端捕获图片链接。虽然图片的链接可能是不固定的,但是网页本身的链接在这些图片网站上一般都是有规律的(至少目前没有发现),那么此时就可以通过对网页进行模版加参数的形式进行爬取。前端将网页链接和网页数量传递给后端,同时分析图片的 URL 找出图片所在的目录位置,一并交给后端。后端接收到模版网页链接模版和参数之后爬取整个网页,分析抓取的网页数据,如果发现其中有与指定目录位置相同的图片链接,则对图片进行抓取。目前这种方法可以适用与那些同一图集的图片存在于同一目录下的情况,如果图片存在于不同的文件目录下,则无法达到要求

17173 图片多页显示且链接无规律

多玩图片站可以单页也可以多页

对于第三种情况,图片链接没有既定格式,但是所有的图片均能在一个页面中显示,工具直接获取页面中所有的图片节点,将图集所在目录作为模版,将符合模版格式的所有链接传递给后端,后端直接通过链接抓取

178 图片无规律但在一页

对于第一种和第二种情况,图片链接遵循序号规则,无论是否可以在一个页面中显示图集都直接解析图片链接,将模版和参数传递给后端。后端进行遍历爬取

腾讯图片链接遵循规律

实现

有了上面设计的基础,在实现上整体难度不大。这里说一下实现过程中后端对于服务器反爬虫机制的绕过。

在实际的测试中主要遇到的是两种反爬虫机制,一种是根据请求头部和 Cookie 验证,另一种是根据 IP 和访问间隔验证。请求头部的验证主要是验证 Reference 字段是否是其网站内页面。这种验证比较容易验证,工具在前端获取网页地址,作为通信的一个固定字段连同模版和参数一同发送给后端,后端请求时在头部带上这个内容即可。根据 IP 的验证则稍微费些时间,后端首先从一些免费的 IP 代理网站上动态获取代理信息,再通过代理请求图片资源。但是会出现代理失效等一系列情况,因此需要设置额外的操作来处理请求资源失败的问题。

总结

一开始写的时候只考虑了后端的操作,一直没有能找到一个通用的思路,针对不同的网站写了很多的模版。后来交流之中 salt 建议通过前后端通信的方式来传递模版,于是才有了这个工具的诞生。这里感谢 5alt 大佬的思路提供。以后工作中还是需要多开阔思路才行。

工具目前还在测试和改进中,力求可以匹配尽可能多的网站。