码迷,mamicode.com
首页 > 编程语言 > 详细

用python批量下载wallheaven网站图片

时间:2015-08-10 14:56:41      阅读:2091      评论:0      收藏:0      [点我收藏+]

标签:python   爬虫   variety   

这要从很早以前说起,那个时候是刚开始玩Ubuntu,但是ubuntu的壁纸不太好看,所以我就想方设法找到很漂亮的壁纸来替换原先的,但是我又想让壁纸像幻灯片一样播放,但是ubuntu不像windows,没有这样的功能,所以只能上网找办法来解决,最后终于在ubuntu论坛看到了variety这个东东,这个东西用起来确实很酷,可以自己编辑图片源,但是它本身默认带了几个源,而恰好其中就有wallheaven(那个时候还是wallpaper,之后网站改了叫做wallheaven),所以我就到wallheaven上去逛了逛,结果眼前一亮,完全满足了眼睛的贪婪,真是太漂亮了,各种自然摄影以及设计图,简直大饱眼福。

之后,我在win下面的壁纸看厌了的时候,就会去wallheaven上面看看,换张新的,缓解缓解审美疲劳。可是,每次这样去搞有点太麻烦了,每次都要下载,有没有什么一劳永逸的办法呢?这个时候就想到了爬虫,既然要写爬虫肯定要确定目标,当然就是唯美的天堂wallheaven了,可是之前的下载经验告诉我wallheaven的图片貌似在数据库中都是已编号的形式存在的,这就简单了不少,因为要下载所有的图片不需要搞什么解析html之类,网址几乎都一样,只需要改变***.jpg就可以了,所以只要一个简单的for循环就可以搞定,话不多说,借用linus的话“talk is cheap ,show me your code”,下面我们直接看代码:


import urllib2
from urllib2 import HTTPError, URLError
import math
import sys
import time

print "The start time: "+time.ctime()
x = input("Start value:")
y = input("Stop value:")
k = y-x
for i in range(x, y+1):
    url = 'https://wallpapers.wallhaven.cc/wallpapers/full/wallhaven-'+str(i)+'.jpg'
    req = urllib2.Request(url)
    req.add_header("User-agent", "Mozilla 5.10")
    name = 'H:\\pic\\'+str(i)+'.jpg'
    try:
        conn = urllib2.urlopen(req)
        f = open(name, 'wb')
        f.write(conn.read())
        f.close()
        if k < 100:
            sys.stdout.write("Computing: [%s%s] %.2f%%\r" % ('#' * (i-x) , '-' * (y-i), (i-x)*100/k))
            sys.stdout.flush()
            time.sleep(0.01)
        else:
            sys.stdout.write("Computing: [%s%s] %.2f%% \r" % ('#' * ((i-x)/(k/50)) , '-' * ((y-i)/(k/50)), (i-x)*100.0/k))
            sys.stdout.flush()
            time.sleep(0.01)
    except HTTPError ,e:
        i = i+1
    except URLError, e:
        print "The server\'s  something is wrong!"
        break
print "\nThe finished time: "+time.ctime()
print 'pic saved'
要下载图片就要用到python中的一个模块urllib2,其实之前我用的是urllib,但是突然出现了一个问题,就是访问网站被禁止。这个问题找了好久才找出来,因为我发现图片改本就下载不下来,就想会不会是这个模块有问题。所以我就到百度上随便搜了一个图片,找到它的网址来进行实验,结果可以的。这个时候我就傻眼了,这到底是为什么呢,因为用浏览器访问确实是可以的,没办法我就打印了一下url.urlopen(url),结果其中有一句是这么写的“the site‘s owner banned your access to this website”。原来是这样,竟然禁止我访问,可是浏览器可以访问的啊,这就牵扯到了一个问题,User-agent就是用户代理,也就是说只有通过浏览器网站才允许用户访问,所以直接用urlopen去连接肯定就不行。这还不简单,我们伪装成浏览器不就行了吗,既然要伪装成浏览器,我们用urllib就不行了,因为它没有request,它只能接受url,这意味着我们不能用它来伪装user-agent,所以只能改用urllib2。这样就可以用request来设置http的header来伪装user-agent欺骗网站,果然成功了。

上面的代码还有k<100的判断这个是干什么呢,这个其实是命令行的缓冲区问题,因为当k小于100的时候后面打印的显示进度的字符串是在缓冲区的宽度范围之内的;而当大于100的时候,我们就要重新设置了,如果还用那个的话,k有多大,字符串就有多大,我们的字符在当前行的缓冲区就不够了,就会调到下一行,而后面的清除缓冲区知识清楚了上一行,这样看起来就会糟糕很多,所以只是为了看起来好看,没有其他的什么含义。

上面的代码有两个一场的处理,一个是http错误,另一个是url错误的处理。因为我在下载的时候发现,有时候http请求会出现错误,这个时候程序就会因为一场而自动退出,这样就太不好了,每次出现异常就需要重启程序,这不是一个程序员该干的事啊,应该让程序来帮助我们来解决这些事情,python是一门面向对象的变成语言,所以对于异常的处理那是小菜一碟。

整个程序就是这样子,短短30多行,就可以满足我们的要求,如果不是为了好看,上面的代码还可以精简。下面看看下载的图片:技术分享

到写这篇博客之时,已经下载了大概有13000多张了,但是其中有一些图片太露骨了,所以我就想将其删除,但是太多了,总不能手动去完成,所以就想用图像识别的办法来批处理,至于处理办法,请大家看我下篇博客。



    
        

版权声明:本文为博主原创文章,未经博主允许不得转载。

用python批量下载wallheaven网站图片

标签:python   爬虫   variety   

原文地址:http://blog.csdn.net/yuanpengfred/article/details/47396869

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!