设为首页 收藏本站
查看: 986|回复: 0

[经验分享] 百度空间相册下载器 python实现 by Gods_巨蚁(原创)

[复制链接]

尚未签到

发表于 2015-4-24 05:47:14 | 显示全部楼层 |阅读模式
  最近学习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)
#[尾页]
patLastPage = re.compile(
r'''
\[尾页\]
''',
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()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-60023-1-1.html 上篇帖子: Python之位移操作符所带来的困惑 下篇帖子: Python 文件Hash(MD5,SHA1)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表