一直想把必应上的壁纸批量下载下来,可惜一直没找到源网站,今天发现在天堂图片网上有必应的壁纸,所以写了一个小爬虫来爬取一下图片看看
网址在此:
http://www.ivsky.com/bizhi/bing_v1704/
首先我们需要一个函数来打开网页,获得网页源码内容,这个函数可以这样写

def getHtml(url):
    #url open打开网页
    page = request.urlopen(url)  
    html = page.read() #read()方法用于读取URL上的数据
    html = str(html)
    return html

打开网页来分析一下,右击网页,检查

可以看到,我们需要的第一张图片包含在”/bizhi/bing_v48967/pic_771940.html” 这个页面中,要抓取需要的图片,必须先提取出图片对应的页面地址(注意,后面有一个”img src=”http://img.ivsky.com/img/bizhi/t/201805/09/bing.jp***开看一下就知道这个只是图片的缩略图,并不是我们想要的图片。第一张图片对应的网页找到了,其他的图片也一样找到对应的页面。因此我们需要一个函数,从原始的页面源代码中提取出所需要的图片对应的页面。这个函数可以这样写

#获取页面列表
def getHtmlList(html):
    #根据页面的命名构造正则表达式
    reg = r'<a href="(/bizhi/bing_v48967/pic_.+?\.html)"'
    imgre = re.compile(reg)
    #找出所有符合正则表达式的字符串,
    htmllist = re.findall(imgre,html)
    l = set()
    for i in range(len(htmllist)):
        #网页地址是相对路径,需要添加域名
        htmllist[i] = 'http://www.ivsky.com' + htmllist[i]
        #利用set来避免重复添加
        if htmllist[i] not in l:
            l.add(htmllist[i])
    #最后得到的集合l就是图片对应的页面列表 
    return l

再来打开任意一张图片对应的页面

找到图片对应的路径(途中红框所示),下载图片即可。同样的我们需要一个函数来找到这个路径,并下载图片,这个函数可以这样写

def getImg(html,id):
    #分析网页,提取图片地址对应的正则表达式
    reg = r'<img id="imgis" src=\\\'(http://.+?\.jpg)'
    imgre = re.compile(reg)     #re.compile() 可以把正则表达式编译成一个正则表达式对象.
    imglist = re.findall(imgre,html)   
    #对于这个程序,每个页面只包含一张高清大图,图片地址保存在imglist[0]里面
    #图片可能因为某些原因,下载不成功,执行urlretrieve函数会报错,我们使用try except来增强程序健壮性
    try:
        request.urlretrieve(imglist[0],'.\spider\data\\bing\%d.jpg'%id, showProcessBar)
        #print("%s download success"%x)
        return 0
    except :
        return -1
    #下载成功,返回0,失败返回-1

同时,我们定义一个回调函数,显示每张图片的下载进度

def showProcessBar(a,b,c):  
    '''''回调函数 a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 '''  
    percent=100.0*a*b/c  
    if percent > 100:  
        percent = 100  
    #显示下载进度
    print ('[downloading:] %.2f%%' % percent)  

再定义一个函数,调用getImg,下载得到的列表当中的每一张图片

def getImage(htmllist):
    i = 0
    for key in htmllist:
        html = getHtml(key)
        html = str(html)
        if (getImg(html, i) == 0):
            print("%s download success"%i)
        else: 
            print("%s download failed" %i)
        i+=1

所需要的函数全部完成,调用即可下载图片

url = "http://www.ivsky.com/bizhi/bing_t2824/"
h = getHtml(url)
l= getImgList(h)
getImage(l)

程序执行结果
控制台输出如下

对应的文件夹下面也有了我们要的图片

程序源码可以在这里下载
https://github.com/zkangHUST/Spider/blob/master/1.py

这个程序还有很多不完美的地方,比如提取网址的正则表达式写的不好,还可以改进,或者使用beautiful soup 来提取,效果更高,另外程序是单进程的,可以多开几个进程加快下载速度。等等诸如此类的缺点还有很多,下一版本再改进吧。