zoukankan      html  css  js  c++  java
  • 百度空间相册下载器 python实现 by Gods_巨蚁(原创)

    最近学习python中,感觉python确实挺好用

    昨晚加今天实现了一个 百度空间 相册下载器

    下面开放源代码,作者:Gods_巨蚁,转载注明出处

    新QQ:1443561883

    #coding: UTF-8
    
    import urllib, re, os
    
    __metaclass__ = type	#使用新类
    
    class AntAlbumDownload:
    	'''
    	用于下载百度空间相册照片
    	'''
    	#imgarr[len]={purl:"/zhongji/album/item/8177718de7d67312b21bba72.html", psrc:"http://hiphotos.baidu.com/zhongji/abpic/item/8177718de7d67312b21bba72.jpg", 
    	#		psize:"300*200 61K", pcmtNum:0, pname:"移动.gif",
    	#		pedit:  '' ,
    	#		pid:"8177718de7d67312b21bba72",
    	#isMobileUp:0,
    	#isLocked:0				};
    	
    	#相册网页信息匹配
    	patPage = re.compile(
    		r'''
    		imgarr\[len\]={purl:"(.*?)",
    		.*?
    		psrc:"(.*?)",
    		.*?
    		pname:"(.*?)"
    		.*?
    		pid:"(.*?)"
    		.*?};
    		''',
    		re.VERBOSE
    	)
    	#测试相册网页
    	pat = re.compile(r'imgarr\[len\]={purl:".*?",.*?psrc:".*?",.*?')
    	
    	#var Session = {
    	#spaceURL: "/zhongji",
    	#isHost: false,         // 是否是空间主人
    	#isLogin: false,
    	#isActive: false,
    	#isShowVcode: true,    
    	#userName: "饥饿蚂蚁",   // 空间主人用户名
    	#userNameEnc:    "%BC%A2%B6%F6%C2%EC%D2%CF", 
    	#visitorName:    "",
    	#visitorURL: "\/index.html",        // 
    	#refer: "http:\/\/hi.baidu.com\/zhongji\/album\/%D7%CA%C1%CF%D6%D0%B5%C4%CD%BC%C6%AC\/index\/2",
    	#spaceDomain: 'http://hi.baidu.com',
    	#spaceStaticDomain: 'http://hi.bdimg.com',
    	#portraitDomain: 'http://tx.bdimg.com',
    	#photoDomain: 'http://hiphotos.baidu.com',
    	#hiupDomain: 'http://hiup.baidu.com',
    	#spToken: 'd3981061a624c51023d46bcdc8336fd4'
    	#};
    	
    	#图片网页信息匹配
    	patImage = re.compile(
    		r'''
    		var\ Session\ =\ {
    		.*?
    		spaceURL:\ "(.*?)",
    		.*?
    		userName:\ "(.*?)",	# 空间主人用户名
    		.*?
    		photoDomain:\ '(.*?)',
    		.*?};
    		''',
    		re.VERBOSE
    	)
    	#测试图片网页
    	pat2 = re.compile(r'''
    		var\ Session\ =\ {
    		.*?
    		spaceURL.*?
    		userName:.*?
    		photoDomain:
    		''',
    		re.VERBOSE
    	)
    
    	def __init__(self):
    		pass
    		
    	def _getPageText(self, url):
    		#获取一个网页的内容,并且替换掉所有换行符
    		page = urllib.urlopen(url)
    		text = page.read()
    		page.close()
    		
    		#这里很关键,去除换行符		
    		text = text.replace('\r\n', ' ')
    		text = text.replace('\n', ' ')
    		return text
    
    	def setAttr(self, name = '', url = ''):
    		if not name:
    			self.nameAlbum = raw_input('I will create the album directory, Input the name:')
    		else:
    			self.nameAlbum = name
    				
    		if not url:
    			self.urlAlbum = raw_input('Input the URL of the album:')
    		else:
    			self.urlAlbum = url
    			
    		self.countAnalysisPage = 0
    		
    		#百度空间特殊性
    		#若URL中包含#,则提取#后的URL替换当前URL
    		loc = self.urlAlbum.find('#')
    		if loc != -1:
    			self.urlAlbum = 'http://hi.baidu.com' + self.urlAlbum[loc+1:]
    		
    		
    		#如果已经包含页数信息,特将当前页数改为0
    		#若不包含页数信息,加上/index/0
    				
    		#patFirst = re.compile(
    		#	r'''
    		#	(.*?)/index/([0-9]+)
    		#	''',
    		#	re.VERBOSE
    		#)
    		#urlFirst = patFirst.search(self.urlAlbum)
    		#if urlFirst:
    		#	self.urlAlbum = urlFirst.group(1) + '/index/0'
    		#else:
    		#	self.urlAlbum += '/index/0'
    		
    		#新方法
    		self.urlAlbum = self._getIndexPageUrl(0)
    
    		print '解析到相册首页URL为: ', self.urlAlbum
    		
    		cmd = 'md ' + self.nameAlbum
    		os.system(cmd)
    		
    	
    	def analysisImagePage(self, url, imageId):
    		'''
    		分析相片网页,获取相片实际地址
    		'''
    		text = self._getPageText(url)
    		
    		print '分析图片页 当前页:%3d' % self.countAnalysisPage
    		self.countAnalysisPage += 1
    		
    		#if self.pat2.search(text):
    		#	print 'analysisImagePage ok'
    		
    		urlImage = self.patImage.search(text)
    		
    		return urlImage.group(3) + urlImage.group(1) + '/pic/item/' + imageId +'.jpg'
    
    	
    	def _getIndexPageUrl(self, iPage):
    		#获得当前相册页码为iPage的网页地址
    		patIndexPage = re.compile(
    			r'''
    			(.*?)/index/([0-9]+)
    			''',
    			re.VERBOSE
    		)
    		urlIndexPage = patIndexPage.search(self.urlAlbum)
    		
    		if urlIndexPage:
    			return urlIndexPage.group(1) + '/index/' + str(iPage)
    		else:
    			return self.urlAlbum + '/index/' + str(iPage)
    	
    	def analysis(self, countPage):
    		'''
    		分析相册网页内容
    		参数countPage表示分析的页数,0表示分析所有页
    		
    		'''
    		print '开始分析页面'
    		
    		#存放图片下载地址
    		images = []
    		
    		#表示总页数
    		maxPage = 0
    		
    		#读取相册首页内容
    		textPage = self._getPageText(self.urlAlbum)
    		
    		#<a  href="#/zhongji/album/%D7%CA%C1%CF%D6%D0%B5%C4%CD%BC%C6%AC/index/3">[尾页]</a>	
    		patLastPage = re.compile(
    			r'''
    			<a.+?href="\#.+?/index/([0-9]+?)">\[尾页\]</a>
    			''',
    			re.VERBOSE
    		)
    		
    		urlLastPage = patLastPage.search(textPage)
    		
    		if urlLastPage:
    			#如果找到 [尾页] 匹配,则可以得到相册最大页数
    			print '尾页匹配成功'
    			maxPage = int(urlLastPage.group(1))
    		else:
    			print '尾页匹配失败'
    			maxPage = 0
    		
    		
    		#参数countPage为0时,表示分析相册所有页面
    		#参数countPage不允许超过总页数
    		if countPage == 0 or countPage > maxPage + 1:
    			countPage = maxPage + 1
    		
    		for iPage in xrange(countPage):
    			print '分析相册 当前页:%3d' % (iPage)
    			if iPage != 0:
    				#获得页码为iPage的页码类容
    				urlIndexPage = self._getIndexPageUrl(iPage)
    				textPage = self._getPageText(urlIndexPage)
    			
    			for imagePage, imageSmall, imageName, imageId in self.patPage.findall(textPage):
    				#print 'href:', imagePage
    				#print 'imageSmall:', imageSmall
    				#print 'name:', imageName
    				#print 'id:', imageId
    				#imagePages.append(imagePage)
    				
    				#原图所在网页URL
    				urlImagePage = 'http://hi.baidu.com' + imagePage
    				#print 'ulrImage:', urlImagePage
    				#print imageId
    				
    				#获取原图URL
    				urlImage = self.analysisImagePage(urlImagePage, imageId)
    				#print 'ulrImage:', urlImage
    				images.append(urlImage)
    		
    		print '分析完成,开始下载'
    		
    		max = len(images)
    		
    		#显示图片URL,并且下载图片到 已命名文件夹
    		for index, image in enumerate(images):
    			#设置保存路径
    			pathImage = r'%s\%04d.jpg' % (self.nameAlbum, index)
    			
    			#下载图片
    			urllib.urlretrieve(image, pathImage)
    			
    			print pathImage
    			print '下载完成%.1f:%%' % ((index+1)*100.0/max)
    		
    	
    	def download(self, countPage = 0):
    		'''
    		下载相册图形
    		countPage表示页数,0表示下载所有图片
    		'''
    		self.analysis(countPage);
    	
    		#for i in xrange(countPage):
    			
    
    def main():
    	album = AntAlbumDownload()
    	album.setAttr('', '')
    	album.download(0)
    
    main()
    	
    

    本站内容均为原创,转载请注明出处
    作者:Gods_巨蚁 QQ:517377100
    出处:http://www.cnblogs.com/gods/
    多编码 多总结 厚积薄发
    Github博客 hungryant.github.io
  • 相关阅读:
    文件夹生成zip
    html 字符串 生成 pdf 完美解决中文不显示
    layui 数据表格+分页+搜索+checkbox+缓存选中项数据
    排序算法总结
    排序算法(10)--Distribution Sorting--分布排序[2]--Radix Sort--基数排序
    排序算法(8)--Merge Sorting--归并排序--Merge sort--归并排序
    [Android]在Dagger 2中使用RxJava来进行异步注入(翻译)
    [Android]使用Dagger 2进行依赖注入
    [Android]Android端ORM框架——RapidORM(v2.1)
    [Android]使用MVP解决技术债务(翻译)
  • 原文地址:https://www.cnblogs.com/gods/p/2022332.html
Copyright © 2011-2022 走看看