现在已经更新到一个uid即可多线程获取收藏夹下的所有图片。
新的代码有空再发,下面的是旧代码。
-----------------------------------
一个链接,就可以下载收藏夹的所有图片了,也就是“我的喜欢”的所有图片。
半次元的coser们都是那么好看,每次都会忍不住去点赞收藏,时不时还会把这些图片保存下来作为壁纸,但是图片一张一张的下不完,那有没有办法一下子下载呢?
现在我非常的需要一个可以下载所有图片的办法,只要一个链接就可以下载自己喜欢的图片了
话不多说,直接上代码!
一、需要用到的库
import datetime
import requests
import json
import re
import os
二、请求头
一次请求可能不会一下子成功,所以要请求多次,如果大于请求10次,则不再请求
def get_res(url): #网页请求,当错误过多则跳过此链接
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.82 Safari/537.36',
#'cookie':'',#如果自己的喜欢设置了只能自己看,那就填写自己的cookie
}
count= 0
while True:
count+=1
try:
res = requests.get(url, headers=headers,timeout = 10)
res.encoding = 'utf-8'
except:
pass
else:
if res.status_code == 200:
return res
if count>= 10:
return False
三、获取第一个喜欢页面
第一个页面前35个喜欢的信息在网页源代码中
def first_favor_page(uid): #我的喜欢第一个页面,前35个喜欢
url = 'https://bcy.net/u/'+uid+'/like'
res=get_res(url)
pattern='window.__ssr_data = JSON.parse\("(.*?)"\);\n window._UID_ ='
text=re.findall(pattern,res.text)[0].replace('\\"', '"').replace('u002F', '').replace('\\\\', '/')
item_id=re.findall('"item_id":"(.*?)"',text)
urls=[]
for i in range(len(item_id)):
urls.append('https://bcy.net/item/detail/'+item_id[i]+'?_source_page=profile')
return urls
四、获取余下的喜欢页面
余下的喜欢页面文件保存在下面的文件之中(一个文件包含35个喜欢的url)
def all_favor_page(url): #获取我的喜欢所有页面,35个喜欢为一个喜欢页面
uid=re.findall('uid=(.*?)&ptype=',url)[0]
try:
urls=first_favor_page(uid)
while True:
print(url)
res = get_res(url)
List = res.json()['data']['list']
item_id_list = []
since_list = []
for i in range(len(List)):
item_id_list.append('https://bcy.net/item/detail/' + List[i]['item_detail']['item_id'] + '?_source_page=profile')
since_list.append(List[i]['since'])
urls=urls+item_id_list
url = 'https://bcy.net/apiv3/user/favor?uid=2448850&ptype=like&mid=2448850&since=' + since_list[-1] + '&size=35'
except:
return urls
五、获取图集标签
这段代码可有可无,这是给图片命名用的
def get_label(res): #获取一个图集的标签
text1 = re.findall('<div class="tag-group">(.*?)</div>', res.text)[0]
text2 = re.findall('<span>(.*?)</span></a>', text1)
label = ' '.join(text2)
file_pattern='\/:.?"<>|'
for pat in file_pattern:
label=label.replace(pat,'')
return label
六、下载图片
def download(url, path): # 下载图集链接下的图片
if not os.path.exists(path):
os.mkdir(path)
res = get_res(url)
t=re.findall('<div class="meta-info mb20"><span>(.*?)</span>',res.text)[0].split(' ')[0] #图集发布时间
label=get_label(res)
try:
pattern='window.__ssr_data = JSON.parse\("(.*?)"\);\n window._UID_ ='
target_data =re.findall(pattern,res.text)[0].replace('\\"', '"').replace('u002F', '').replace('\\\\', '/')
except:
pass
else:
target_img_data = json.loads(target_data, strict=False)['detail']['post_data']['multi']
num = len(os.listdir(path))
i=0
print("-----开始下载!------")
for img_data in target_img_data:
img_url = img_data['original_path']
if img_url.find('jpg') >= 0:
img_fomat = '.jpg'
elif img_url.find('png') >= 0:
img_fomat = '.png'
elif img_url.find('gif') >= 0:
img_fomat = '.gif'
else:
img_fomat = '.jpg'
num += 1
i+=1
name = str(datetime.date.today())+'('+str(num) +')'+'['+t+']'+'['+label+']'+ img_fomat
print("下载进程:{}/{} 文件名:{} 已下载数目:{} ".format(i,len(target_img_data),name,num),end='')
print("文件路径:",path)
img_content = get_res(img_url).content
with open(path+ "/" + name, 'wb') as f:
f.write(img_content)
print("-----下载完成!------")
七、主函数
def main(url, path):
page_url_list=all_favor_page(url)
Len=len(page_url_list)
page_url_list=page_url_list[::-1]
for i in range(Len): #单线程,如果觉得下载慢,可以把for循环弄成多线程
print('我的喜欢页面获取超链接进程:{}/{}'.format(i+1,Len))
try:
print(page_url_list[i])
download(page_url_list[i], path + "//")
except:
pass
if __name__ == '__main__':
#如果我的喜欢设置了只能自己看,就在get_res(url)中填写自己的cookie
path='D://bcy' #保存路径,文件夹自己会生成
url = ''#填写请求网址
main(url, path)
那么,我们需要获取哪一个链接呢?
点击F12后,鼠标滚轮下拉页面,当刷新出来第一个favor(喜欢的页面文件),将此处的“请求网址”的值填写到主函数的url中。
点击运行,当所有喜欢的页面文件(一个文件包含35个喜欢的url)获取完,提取出需要的图集url后,然后就可以下载图片了