与大家一起分享刚刚写好的py.
#!/usr/bin/env python # -*- coding: utf-8 -*- import urllib import urllib2 import os import re import sys def trypicdir(picpath): if not os.path.exists(picpath): #下载到的本地目录,路径不存在时创建一个 os.makedirs(picpath) #显示下载进度 def schedule(a,b,c): ‘‘‘‘‘ a:已经下载的数据块 b:数据块的大小 c:远程文件的大小 ‘‘‘ per = 100.0 * a * b / c if per > 100 : per = 100 print (‘%.2f%%‘ % per) #获取html源码 def getHtml(url): page = urllib.urlopen(url) html = page.read() return html #正则匹配分页 def findPage(html): myItems = re.findall(‘<span>(\d*)</span>‘, html, re.S) if myItems : return myItems.pop() else: return 0 #正则匹配列表 def findList(html): Items = re.findall(‘<span><a href="http://www.mzitu.com/(\d*)" target="_blank">(.*?)</a></span>‘, html, re.S) myItems=[] for i in Items: myItems.append((i[0])) return myItems #下载图片 def downloadImg(url_pic,picpath): tmppic = re.findall("http:\/\/www.mzitu.com/(.*?)$",url_pic,re.S)[0] picfile = picpath+‘/%s.jpg‘ % ‘_‘.join(tmppic.split(‘/‘)) html=getHtml(url_pic) myItems = re.findall(‘<p><a href="http:\/\/www.mzitu.com/.*?" ><img src="(.*?)" alt=".*?" /></a></p>‘,html,re.S) print (‘正在下载%s图片存储到本地%s..... ‘%(url_pic,picfile)) try: urllib.urlretrieve(myItems[0], picfile, schedule) except: print (‘下载%s图片存储到本地%s失败,请检查链接是否有问 ‘%(url_pic,picfile)) #单个美女连接下载 def getdowns(modelUrl,picpath): listHtml=getHtml(modelUrl) TotablNum=findPage(listHtml) if TotablNum != 0: for i in range(1,(int(TotablNum)+1)): downloadImg(url_pic=‘%s/%s‘%(modelUrl,i),picpath=picpath) else: downloadImg(url_pic=‘%s‘%(modelUrl),picpath=picpath) ‘‘‘ 思路: 1、获取所有美女连接列表。 2、获取单个美女总连接数。 3、下载。 ‘‘‘ if __name__ == ‘__main__‘: #picpath=r"F:\9tmp_pic" picpath=‘/tmp/pic_tmp‘ trypicdir(picpath=picpath) listHtml = getHtml(‘http://www.mzitu.com/model‘) #这是其中一个模块的url,可以添加不同的模块url从而达到整站爬取。 listContent = findList(listHtml) #print ("listContent:",listContent) for m in listContent: getdowns(modelUrl=‘http://www.mzitu.com/%s‘%m,picpath=picpath) print ("恭喜,所有美女图片已经下载完成。")
效果图:
本文出自 “都市布衣” 博客,请务必保留此出处http://sunday208.blog.51cto.com/377871/1880967
原文地址:http://sunday208.blog.51cto.com/377871/1880967