使用Python2.7和火狐浏览器下载QQ空间好友相册(二)
来源:互联网 发布:程序员高清logo 编辑:程序博客网 时间:2024/05/31 06:21
原来的文章由于用到了curl的命令,比较麻烦,而且带上cookie之后还是有一部分无法下载,所以用httplib2代替了curl、urllib、urllib2的一些功能。重新写了一个代码
前面文章的代码不再维护
前一篇文章在这里:使用Python2.7和火狐浏览器下载QQ空间好友相册
Python2.7代码如下:
# -*- coding: UTF-8 -*-import osimport reimport jsonimport datetimeimport shutilimport httplib2# 获取原始curl请求,相册fcg_list_album_v3相片cgi_list_photoorigin_album = ''origin_photo = ''origin_album_url = re.search(r'curl\s\"(?P<url>.*?)\"',origin_album).group('url')origin_photo_url = re.search(r'curl\s\"(?P<url>.*?)\"',origin_photo).group('url')cookie = re.search(r'\"Cookie:\s(?P<url>.*?)\"',origin_photo).group('url')print origin_album_urlprint origin_photo_urlprint cookie# 获取目标QQfp = open('qqlist.txt', 'r')qqlist = fp.readlines()for i in range(len(qqlist)): qqlist[i] = qqlist[i][:-1]fp.close()h = httplib2.Http()headers={'Cookie': cookie}for target in qqlist: if len(target) == 0 : # 防止因为出现空行删除所有照片 continue log = { } log['qq'] = target log['access'] = 1 # 是否允许访问 log['time'] = datetime.datetime.now() # 下载完成后记录花费的时间 log['album_count'] = 0 # 相册总数 log['photo_count'] = 0 # 照片总数 print('当前QQ:' + target) try: os.makedirs('photos/' + target) # 建立相应的文件夹 except : shutil.rmtree('photos/' + target) # 无论文件夹是否为空都移除该文件夹 os.makedirs('photos/' + target) # 先得到正确的url,然后执行获取json数据 hostUin = origin_album.split('&hostUin=')[1].split('&')[0] url = origin_album_url.replace(hostUin, target) # 替换被访问者 url = url.replace('&pageNumModeSort=40', '&pageNumModeSort=100') # 显示相册数量 resp, content = h.request(url, 'GET',headers=headers) #print content jsonstr = content[content.find('(') + 1: content.find(')', -1) - 1] # json字符串,去除不标准的json数据 output = json.loads(jsonstr) # 最终json数据 if output['code'] == -3000: # 对不起,您尚未登录或者登录超时。 print output['message'] break if output['code'] == -4009: log['access'] = 0 # 是否允许访问 fp = open('photos/' + target + '/log.txt', 'w') # 日志文件,记录时间与数量 fp.writelines(str(log)) fp.close() continue # 相册没有分类时 #print jsonstr albumList = [] if 'albumListModeSort' in output['data']: # 相册没有分类,目前这一类占大多数 print 'type1' if output['data']['albumListModeSort'] == 'null': print 'noalbum' break print u'第一个相册名称:' + output['data']['albumListModeSort'][0]['name'] # 输出第一个相册名称 albumList = output['data']['albumListModeSort'] else: # 相册有分类 print 'type2' print u'第一个相册名称:' + output['data']['albumListModeClass'][0]['albumList'][0]['name'] # 输出第一个相册名称 albumList = [dict() for i in range(0, output['data']['albumsInUser'])] count = 0 # 重新构造albumList for i in range(0, len(output['data']['albumListModeClass'])): for j in range(0, output['data']['albumListModeClass'][i]['totalInClass']): albumList[count] = output['data']['albumListModeClass'][i]['albumList'][j] count = count + 1 if count > output['data']['albumsInUser']: # 对跳出条件加强控制 break theSameAlbumName = 0 # 防止相册同名 for album in albumList: if not album: # 字典为空跳出,上面的output['data']['albumsInUser']是可访问相册数。 continue log['album_count'] += 1 print u'当前相册:' + str(album['classid']) + album['name'] if album['allowAccess'] == 0: # 相册无法直接访问(需要密码或者禁止访问) continue # album['id']就是照片列表的ID # 获取照片列表数据 hostUin = origin_photo.split('&hostUin=')[1].split('&')[0] topicId = origin_photo.split('&topicId=')[1].split('&')[0] url = origin_photo_url.replace(hostUin, target) url = url.replace(topicId, album['id']) url = url.replace('&pageNum=30', '&pageNum=600') # QQ空间每个相册最大貌似不会超过512 resp, content = h.request(url, 'GET',headers=headers) #print content jsonstr = content[content.find('(') + 1: content.find(')', -1) - 1] #json字符串 output = json.loads(jsonstr) #json字符串转字典 if (output['code'] == -4404): continue # 相册名里面会不会也有奇葩名字呢 filt = re.compile(r'\\|/|:|\*|\?|<|>|\||\.') album['name'] = re.sub(filt, '', album['name']) # 我服都服了,QQ空间居然还允许同名的相册。。。 albumname = str(album['classid']) + album['name'].replace(' ', '') filelist = os.listdir('photos/' + target + '/') temp = albumname.encode('gbk') # encode的作用是将unicode编码转换成其他编码的字符串,由于文件列表filelist里是gbk编码,保存一致才能比较 if (temp in filelist) or (len(albumname) == 0): # 编号,防止同名 albumname = albumname + '_' + str(theSameAlbumName) theSameAlbumName += 1 os.makedirs('photos/' + target + '/' + albumname) # 防止相片同名 same = 0 # 获取该相册下的每一张照片,如果相册为空,那么output['data']['photoList'] = None,output['data']['totalInAlbum']=0 photoList = output['data']['photoList'] if output['data']['totalInAlbum'] == 0: continue for photo in photoList: log['photo_count'] += 1 print(u'当前图片:' + photo['name']) # 图片格式由photo['phototype']字段(整型)控制 # 1:jpg # 3:png phototype = {'1': '.jpg', '2': '.gif', '3': '.png', '5': '.jpg', '10': '.jpg'} try: format = phototype[str(photo['phototype'])] except: format = '.jpg' # 建立文件夹并下载图片 # QQ图片里面有太多的特殊字符了 photoname = photo['name'] filelist = os.listdir('photos/' + target + '/' + albumname) for i in range(len(filelist)): filelist[i] = filelist[i][:-4] photoname = photoname.replace(' ', '') # 文件名中不能有特殊字符 filt = re.compile(r'\\|/|:|\*|\?|<|>|\||\.|\n|\t|\"') photoname = re.sub(filt, '', photoname) if (photoname in filelist) or (len(photoname) == 0): photoname = photoname + '_' + str(same) same += 1 path = 'photos\\' + target + '\\' + albumname + '\\' + photoname + format try: resp , content = h.request(photo['url'], 'GET', headers=headers) open(path, 'wb').write(content) except httplib2.HttpLib2Error as e: print('保存图片出错') fp = open('photos/' + target + '/log.txt', 'w') # 日志文件,记录时间与数量 log['time'] = (datetime.datetime.now() - log['time']).seconds log['time'] = str(log['time']) + 's' fp.writelines(str(log)) fp.close() print('当前QQ:' + target + '下载完毕')
0 0
- 使用Python2.7和火狐浏览器下载QQ空间好友相册(二)
- 使用Python2.7和火狐浏览器下载QQ空间好友相册
- Python2.7获取QQ空间部分好友
- Python2.7获取QQ空间好友头像
- Python2.7获取QQ空间全部好友
- Python2.7获取QQ好友头像
- work_weipa_使用shareSDK实现一键分享(QQ好友和空间、微信好友和朋友圈、新浪微博)
- android QQ空间,QQ好友分享 SDK具体使用过程
- android 实现QQ好友分享和QQ空间分享
- android 实现QQ好友分享和QQ空间分享
- 如何批量把下载QQ空间相册图片
- QQ 空间相册新功能
- firefox57浏览器下载,火狐firefox 57正式版32位,64位下载,安装和使用笔记
- 源生集成QQ分享到好友和空间
- iOS QQ空间 好友分享
- 下载旧版火狐浏览器
- QQ空间相册脸部识别
- 模仿新浪微博“@”好友搜索功能(支持IE和火狐浏览器)-(咋个办呢 zgbn)
- 怎么改变ADS1.2的字体大小
- 自学QT之判断输入内容实现按钮可用或者不可用
- Intent的显式与隐式用法
- Cocos 3D功能初探学习笔记(1)---摄像机
- sizeof在32位和64位机器上的运行结果
- 使用Python2.7和火狐浏览器下载QQ空间好友相册(二)
- LeetCode_invert binary tree
- 关于html、servlet、msql中的编码问题
- 用IDEA建立一个web工程的步骤
- c++虚函数、多态性与虚表
- struts2常用常量总结
- Vuforia开发技巧-用手指拖拽Augmented模型
- 1053. Path of Equal Weight (30)
- OpenWRT定制按键功能