爬取QQ相册照片

两个主要url:

1
2
获取相册列表: https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/fcg_list_album_v3?........
获取相册内的照片: https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/cgi_list_photo?.......

过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cookie有效期一般有几个小时, 够用了
先获取所有的相册数据(相册id, name, 照片总数total)
然后循环遍历, 通过相册id获取该相册下的所有照片, 实测 pageStart=0, 最大pageNum(499), 即一次最多获取0~499 500张照片, 如果存在超过500张照片的相册,要根据total值分页获取

获取照片url的时候, 不同相册的属性名不同, 我的相册里获取照片原图url的属性,有的叫raw 有的叫origin_url,要注意处理

最终的数据结构:
[
'相册1':['url','url'......],
'相册2':['url',url',.....],
.....
]

最后可以本地保存图片还是插入数据库

http请求url,本地保存图片的话最好用多线程, 图片不是特别多的话问题不大, 图片又多(大小又大)的实测会有各种问题,可以自行优化

解析相册数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 获取所有的相册数据  主要是拿到: id name total
def parseAlbum(url, cookie):
albums = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'cookie': cookie}
res_album = requests.get(
'https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/fcg_list_album_v3?' + url,#拼上?后边的部分(每次登陆不一样,注意修改)
headers=headers).content.decode('utf-8')
try:
json_album = json.loads(res_album.split('(')[1].split(')')[0])
if ('albumListModeSort' not in json_album['data']):
print("登录状态失效,重新获取链接与cookie")
else:
for item in json_album['data']['albumListModeSort']:
albums.append({'id': item['id'], 'name': item['name'], 'total': item['total']})
return albums
except:
print("登录状态失效,重新获取链接与cookie")

获取id=xxx相册内的所有照片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/cgi_list_photo?
# 遍历所有的相册下的所有图片 id name ,每页1000
def parsePhotos(albums, cookie):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
'cookie': cookie}
if (not albums):
return
else:
for item in albums:
urls = []
id = item['id'] # 相册id
name = item['name'] # 相册name
if (name == '说说和日志相册' or name == '手机相册'):
continue
photo_list = requests.get(
'https://h5.qzone.qq.com/proxy/domain/photo.qzone.qq.com/fcgi-bin/cgi_list_photo?' +
'g_tk=905918741&callback=shine2_Callback&t=982127757&mode=0&idcNum=4&hostUin=497921268&topicId=' + id + '&noTopic=0&uin=497921268' +
'&pageStart=30&pageNum=1000&skipCmtCount=0&singleurl=1&batchId=&notice=0&appid=4&inCharset=utf-8&outCharset=utf-8&source=qzone&plat=qzone&outstyle=json&format=jsonp&json_esc=1&callbackFun=shine2&_=1533979670886',
headers=headers).content.decode('utf-8') #这里注意参数的拼接(相册的id, 超过500张照片的注意分页处理, pageStart与pageNum ,这里的没考虑分页)
photo_data = json.loads(photo_list.split('(')[1].split(')')[0])
photos = photo_data['data']['photoList']
# with open('./' + name + '.txt', 'a+') as f:
for it_photo in photos:
if it_photo['raw']: # 获取原图
urls.append(it_photo['raw'])
else:
urls.append(it_photo['origin_url'])
# f.write(it_photo['raw'] or it_photo['origin_url'] + '\n')
# f.close()
# 开启线程下载(多线程有点问题,实测照片超过四五G的时候中途经常会http请求中断)
# thread = threading.Thread(target=download, args=(name, urls))
# thread.start()
# download(name, urls)
# 写入数据库(这个最靠谱, 照片分页获取并写入数据库, 分页处理看上边注释 自行处理, 下载图片的话可以用java多线程http请求,比python靠谱的多)
savePhotos(name, urls)

数据保存部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#写入文件, 不推荐, 错误率高(主要是图片保存不完整 && http请求中断 两个问题)
# 下载 urls[ ] 图片链接, name:文件夹名
def download(name, urls):
print('开始下载 ' + name + ' 下的照片')
if os.path.exists(name):
pass
else:
os.mkdir(name)
index = 0
while index < len(urls):
photo = requests.get(urls[index]).content
img_name = '%s.jpg' % index
with open('./' + name + '/' + img_name, 'wb') as f:
f.write(photo)
index = index + 1
print(name + ' 下的照片下载完毕')


# 写入数据库, 推荐这种方式, 错误率极低
def savePhotos(name, urls):
conn = mysql.connector.connect(host='192.168.0.81', user='root', password='root', database='qzone')
cursor = conn.cursor()
index = 0
while index < len(urls):
cursor.execute("insert into photos values(null ,%s,%s)", [name, urls[index]])
index = index + 1
print("插入数据库")
conn.commit()
cursor.close()
conn.close()

源码

我的github

本文标题:爬取QQ相册照片

文章作者:啪啪啪的指针

发布时间:2018年08月11日 - 21:08

最后更新:2018年08月13日 - 11:08

原始链接:https://www.bootvue.com/2018/08/11/爬取QQ相册照片/

转载说明: 转载请保留原文链接及作者。