一直以后其实都对壁纸没有太大的要求,因为一般都看不到,默认该怎么样就怎么样,但时间长了未免就还是有点疲劳,于是想找点好看点的壁纸轮着换,后来找到了一个站(Artpip),里面的都是一些艺术家的作为,主要涉及油画、抽像等风格,虽然它本身就有提供windows与mac的客户端的,但就是没有linux的(当然也是能理解),在windows里查了一下桌面端好像也没有把壁纸给下下来,那没办法,只能自己想办法解决了。
Artpip这站好像主要是做艺术画定制的服务的,在上面选定一幅作品后就可以制作成一个相框之类的,当然我的目的并不是作画框,但好就好在站上就已经有各种类型的作品图片,粗略看了一下,感觉还是可以想办法从官网上把所有的作品壁纸给下下来的。
站点分析
粗略地进行了一些可行性分析后,既然是要爬,那还是得了解一下这个站的一些概况。
官网首页下展示的是各个艺术家的代表作品,如下
点击其中一张图,可以进入到这个艺术家的主场,除了能看到封面上的那张图的大图外,还能看到这位艺术家的其他作用,如
在定制信息里有当前选定作品的图片,查看了一下这图的源码信息
看到这图的地址为
但这图的分辨率是比较小的,在如今1080p的显示器到处都是的年代,这个分辨率那是肯定不够看的,不过看这文件命名”QP-medium.jpg“,那是不是可以理解为大图就是”QP-large.jpg”,把地址换成
结果验证成功。
于是很容易就得出爬虫的策略:
- 获取首页上的艺术家地址
- 获取这个艺术家其中一幅作品的地址
- 获取作品的图片地址
- 将图片地址转换成大图地址
- 下载
- 重复以上步骤直到各有艺术家的作品都已经下载
获取艺术家信息
第一步就是先能获取所有艺术家的信息,以及它们是怎么跳转到自己的主场的。本来想着说这个页面一拉下来源码里就会有对应的信息,结果一看页面的源码(刚刚看的都是F12里已经经过JS处理好的最终源码),发现根本就没有艺术家的那些信息,想必是页面加载后经过JS进行加载动态嵌入的,这特么就麻烦了,要么就依赖浏览器解析,要么就得依赖其他的爬虫引擎,但其实我是都不想引用这些东西的,一来麻烦,二来也有学习成本,我只是想爬点图片而已。
既然是动态去获取的,那就看一下抓包的结果。以www.artpip.com 作过滤,然后刷新页面,得到这样的结果
因为我已经在chrome里刷新过页面,有一些资源是直接使用缓存的,这样可以避免过多的请求干扰到我分析,因为我觉得这种动态请求应该是无论有没打开过都应该要发送才对的。还好数据不多,get请求就两个,一下子就发现了一个”api/featured”的接口,直接访问
直接就能得到了结果,这个接口返回的就是所有的艺术家信息,一个完整的艺术家信息如下:
1 | { |
其中包括之前分析的大图片地址都清楚写出来了,验证了之前的想法。
于是这一步就是可以认为只是json的解析工作而已,通过遍历整个“artworks”字段,得到所有的艺术家信息,其中“_id”就是对应的艺术家id,可以通过这个id构建出这个艺术家的主场地址,如Alfred Sisley的id为57a4c7d070f12152abac9559,则地址为
其他所有都是这样操作即可。
获取艺术作品信息
到达了主场后,这个艺术家的作品信息也是通过接口去获取的,如法炮制即可。
请求
http://www.artpip.com/api/artists/57a4c7ce70f12152abac9546?page=1
就可以获取到这一页的信息了。需要注意的是,这里有个页数,可以理解为有可能是有多页的,这个页数会在这个接口里返回,如果不带page参数的话当前访问的页数也为null。
需要判断是不是把所有页面都已经遍历过了。
作品下载
下载就相对比较简单了,使用urllib2.read的功能直接获取数据流写入到文件就可以了。但因为是直接从wiki上获取图片的(=_=|| artip也是从wiki上拿来的,原图就在上面),国内的话速度比较差,所以考虑做了一个进度显示,核心代码如下:
1 | def download(self,dirName,fileName,url,rateHook=None): |
完整代码
完整的下载代码如下,允许下载不同的艺术家的作品都使用不同的线程执行,提高并行效率。但测试过程中比较蛋痛,因为这个站的服务器经常down,估计我测试的这天不知道是顶不住我的请求还是真的是不行,差不多down了一天了=。=,所以测试可能不是很完善,以后再完善一下。
1 | #!/usr/bin/python |
运行效果如图:
因为站点不稳定的关系,我只爬到了一位的作品。之后再补上。