知乎回答图片/视频下载器【附源码】,这款下载神器由吾爱大神制作,专门用于知乎上的一些回答区域的图片/视频资源,输入知乎上的一些问题回答帖子地址,就能批量下载该回答内的全部附属图片和视频,让你轻松获取喜欢的图片资源。本次放出知乎回答下载神器PC版,附带源码可供参考,有需要的朋友们可以试试哦!
知乎回答图片/视频下载器使用说明:
直接复制想要的知乎回答页面链接
选择好保存目录
点击检测即可
知乎回答图片/视频下载器源码一览:
importrequests
importos
importtime
fromthreadingimportThread
importthreadpool
importtraceback
importtkinter
fromtkinterimport*
importthreading
fromtkinterimportmessagebox
importwin32clipboardaswc
fromtkinterimportfiledialog
defasync(f):
defwrapper(*args,**kwargs):
thr=Thread(target=f,args=args,kwargs=kwargs)
thr.start()
returnwrapper
classzhihu(object):
def__init__(self):
self.id=None
self.headers={
'User-Agent':'Mozilla/5.0(WindowsNT6.1;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36'
}
self.zh_id=1
self.zx_id=1
self.nm_id=1
self.cz_id=1
self.stop_num=0
#创建主窗口,用于容纳其它组件
self.root=tkinter.Tk()
#给主窗口设置标题内容
self.root.title("知乎问题图片/视频下载器")
width=440
height=500
#获取屏幕尺寸以计算布局参数,使窗口居屏幕中央
screenwidth=self.root.winfo_screenwidth()
screenheight=self.root.winfo_screenheight()
alignstr='%dx%d+%d+%d'%(width,height,(screenwidth-width)/2,(screenheight-height)/2)
self.root.geometry(alignstr)
self.root.resizable(width=False,height=False)
self.var=StringVar()
self.label_tips=tkinter.Label(self.root,textvariable=self.var,justify=CENTER,font=("微软雅黑",12,"bold"),fg='red')
#self.var.set('正在下载,请稍等...(共433个回答)')
self.ok_var=StringVar()
self.label_ok=tkinter.Label(self.root,textvariable=self.ok_var,justify=CENTER,font=("微软雅黑",10,"bold"),fg='Firebrick')
#self.ok_var.set('已完成13%')
self.input_var=StringVar()
self.label_wtid=tkinter.Label(self.root,text='请输入问题ID或问题链接:')
self.input_wtid=tkinter.Entry(self.root,textvariable=self.input_var,width=37)
self.button_wtzt=tkinter.Button(self.root,text="粘贴",width=6,command=self.getCopyTxet)
self.wt_file_var=StringVar()
self.wt_file_var.set('D:/ZhiHu')
self.label_wt_file=tkinter.Label(self.root,text='请选择保存目录:')
self.input_wt_file=tkinter.Entry(self.root,textvariable=self.wt_file_var,state=DISABLED,width=37)
self.button_wt_file=tkinter.Button(self.root,text="更改",width=6,command=self.thread_browse_folder)
self.button_wtjc=tkinter.Button(self.root,text="检测",width=8,command=self.thread_wenti_jc,font=("微软雅黑",12,"bold"))
self.Monitor_button=tkinter.Button(self.root,text="下载",width=8,command=self.thread_get_offset,
font=("微软雅黑",12,"bold"))
self.label_tips1=tkinter.Label(self.root,text='使用说明:')
self.label_tips2=tkinter.Label(self.root,text='1.下载前请先检测问题,以免下错资源')
self.label_tips3=tkinter.Label(self.root,text='2.问题资源为实时下载,你可随时在下载文件夹查看')
#self.label_tips4=tkinter.Label(self.root,text='3.更多好玩软件、资源欢迎')
defgui_arrang(self):
self.label_tips.place(x=52,y=28)
self.label_wtid.place(x=55,y=82)
self.input_wtid.place(x=55,y=114)
self.button_wtzt.place(x=329,y=110)
self.label_wt_file.place(x=55,y=146)
self.input_wt_file.place(x=55,y=178)
self.button_wt_file.place(x=329,y=174)
self.button_wtjc.place(x=60,y=220)
self.Monitor_button.place(x=164,y=220)
self.label_ok.place(x=300,y=233)
self.label_tips1.place(x=55,y=334)
self.label_tips2.place(x=55,y=360)
self.label_tips3.place(x=55,y=386)
#self.label_tips4.place(x=55,y=412)
#获取粘贴板里的内容
defgetCopyTxet(self):
try:
wc.OpenClipboard()
copytxet=wc.GetClipboardData()
wc.CloseClipboard()
self.input_var.set(str(copytxet))
except:
pass
defthread_wenti_jc(self):
t=threading.Thread(target=self.wenti_jc)
t.setDaemon(True)
t.start()
defthread_get_offset(self):
t=threading.Thread(target=self.get_offset)
t.setDaemon(True)
t.start()
defthread_browse_folder(self):
t=threading.Thread(target=self.browse_folder)
t.setDaemon(True)
t.start()
#浏览本地文件夹,选择保存位置
defbrowse_folder(self):
#浏览选择本地文件夹
save_address=filedialog.askdirectory()
iflen(save_address)!=0:
self.wt_file_var.set(save_address)
#把获得路径,插入保存地址输入框(即插入input_save_address输入框)
#input_save_address.insert(0,save_address)
defwenti_jc(self):
wt_data=self.input_wtid.get()
iflen(wt_data)==0:
tkinter.messagebox.showerror('错误提示','请先输入问题ID或链接')
else:
try:
ifwt_data.isdigit():
url='https://www.zhihu.com/api/v4/questions/{}/answers'.format(wt_data)
r=requests.get(url,headers=self.headers)
ifr.status_code==200:
self.totals=int(r.json()['paging']['totals'])
self.title=r.json()['data']['question']['title']
self.id=int(wt_data)
tkinter.messagebox.showinfo('问题ID正确','你本次要下载的问题为“%s”'%self.title)
else:
tkinter.messagebox.showerror('问题ID输入错误','请检查你的问题ID并重新输入')
else:
wtids=re.findall('question/(.*?)/answer',wt_data)
ifwtidsandlen(wtids)!=0:
url='https://www.zhihu.com/api/v4/questions/{}/answers'.format(wtids)
r=requests.get(url,headers=self.headers)
ifr.status_code==200:
self.totals=int(r.json()['paging']['totals'])
self.title=r.json()['data']['question']['title']
self.id=int(wtids)
tkinter.messagebox.showinfo('问题链接正确','你本次要下载的问题为“%s”'%self.title)
else:
tkinter.messagebox.showerror('问题链接输入错误','请检查你的问题链接并重新输入')
else:
if'/question/'inwt_data:
wtids=wt_data.split('/question/')
forwtidinwtids:
ifwtid.isdigit():
url='https://www.zhihu.com/api/v4/questions/{}/answers'.format(wtid)
r=requests.get(url,headers=self.headers)
ifr.status_code==200:
self.totals=int(r.json()['paging']['totals'])
self.title=r.json()['data']['question']['title']
self.id=int(wtid)
tkinter.messagebox.showinfo('问题链接正确','你本次要下载的问题为“%s”'%self.title)
else:
tkinter.messagebox.showerror('问题链接输入错误','请检查你的问题链接并重新输入')
else:
tkinter.messagebox.showerror('问题链接输入错误','请检查你的问题链接并重新输入')
except:
tkinter.messagebox.showerror('错误提示','抱歉,出现未知错误,请稍后再试')
defget_offset(self):
ifself.id==None:
tkinter.messagebox.showerror('错误提示','请先检测问题ID或链接是否正确')
else:
self.var.set('正在下载,请稍等...(共{}个回答)'.format(self.totals))
self.Monitor_button.config(state=DISABLED)
path=self.input_wt_file.get()
self.file_path='{}/{}'.format(path,self.title)
folder=os.path.exists(self.file_path)
ifnotfolder:?#判断是否存在文件夹如果不存在则创建为文件夹
os.makedirs(self.file_path)?#makedirs创建文件时如果路径不存在会创建这个路径
#else:
#???print('该问题内容已经有啦~')
#???sys.exit()
ifself.totals%20==0:
self.max=int(self.totals/20)
else:
self.max=int(self.totals/20)+1
forminrange(self.max):
offset=m*20
self.get_urls(offset)
time.sleep(3)
[url=home.php?mod=space&uid=512266]@Async[/url]?#开启异步线程执行调用一次开启一个线程
defget_urls(self,offset):
try:
url='https://www.zhihu.com/api/v4/questions/{}/answers?include=data%5B*%5D.is_normal%2Cadmin_closed_comment%2Creward_info%2Cis_collapsed%2Cannotation_action%2Cannotation_detail%2Ccollapse_reason%2Cis_sticky%2Ccollapsed_by%2Csuggest_edit%2Ccomment_count%2Ccan_comment%2Ccontent%2Ceditable_content%2Cvoteup_count%2Creshipment_settings%2Ccomment_permission%2Ccreated_time%2Cupdated_time%2Creview_info%2Crelevant_info%2Cquestion%2Cexcerpt%2Crelationship.is_authorized%2Cis_author%2Cvoting%2Cis_thanked%2Cis_nothelp%2Cis_labeled%3Bdata%5B*%5D.mark_infos%5B*%5D.url%3Bdata%5B*%5D.author.follower_count%2Cbadge%5B*%5D.topics&offset={}&limit=20&sort_by=updated'.format(
self.id,offset)
dict={
'include':'data[*].is_normal,admin_closed_comment,reward_info,is_collapsed,annotation_action,annotation_detail,collapse_reason,is_sticky,collapsed_by,suggest_edit,comment_count,can_comment,content,editable_content,voteup_count,reshipment_settings,comment_permission,created_time,updated_time,review_info,relevant_info,question,excerpt,relationship.is_authorized,is_author,voting,is_thanked,is_nothelp,is_labeled;data[*].mark_infos[*].url;data[*].author.follower_count,badge[*].topics',
'limit':20,
'offset':offset,
'sort_by':'updated'
}
r=requests.get(url,headers=self.headers,params=dict).json()
ifself.stop_num==0:
self.ok_var.set('已完成1%')
datas=r['data']
fordataindatas:
content=data['content']
name=data['author']['name']
#防止同天有多个匿名用户/已注销用户作答时文件名相同而覆盖操作
if'知乎用户'==name:
name='{}{}'.format(name,self.zh_id)
self.zh_id+=1
if'「已注销」'==name:
name='{}{}'.format(name,self.zx_id)
self.zx_id+=1
if'匿名用户'==name:
name='{}{}'.format(name,self.nm_id)
self.nm_id+=1
if'[已重置]'==name:
name='{}{}'.format(name,self.cz_id)
self.cz_id+=1
timeStamp=int(data['updated_time'])
timeArray=time.localtime(timeStamp)
otherStyleTime=time.strftime("%Y-%m-%d",timeArray)
img_names=[]
video_names=[]
img_urls=re.findall('<noscript<imgsrc="(.*?)"',content,re.S)
video_urls=re.findall('"z-ico-video"</span(.*?)</span',content,re.S)
ifimg_urls:
foriinrange(len(img_urls)):
file_name='{}({})_{}'.format(name,otherStyleTime,i+1)
img_names.append(file_name)
iflen(img_urls)==len(img_names):
data=[((img_url,img_name),None)for(img_url,img_name)in
zip(img_urls,img_names)]?#(index,i)也可以写成[index,i]
pool=threadpool.ThreadPool(20)
results=threadpool.makeRequests(self.save_img,data)
[pool.putRequest(req)forreqinresults]
pool.wait()
ifvideo_urls:
foriinrange(len(video_urls)):
file_name='{}({})_video_{}'.format(name,otherStyleTime,i+1)
video_names.append(file_name)
str_video_urls=str(video_urls)
video_ids=re.findall(".*?/video/(.*?)'",str_video_urls,re.S)
iflen(video_ids)==len(video_names):
data=[((video_id,video_name),None)for(video_id,video_name)in
zip(video_ids,video_names)]?#(index,i)也可以写成[index,i]
pool=threadpool.ThreadPool(20)
results=threadpool.makeRequests(self.save_video,data)
[pool.putRequest(req)forreqinresults]
pool.wait()
self.stop_num+=1
ok_num=round(self.stop_num/self.max,2)
self.ok_var.set('已完成{}%'.format(int(ok_num*100)))
ifself.max==self.stop_num:
tkinter.messagebox.showinfo('下载完成','你的问题资源已全部下载完毕')
self.var.set('')
self.Monitor_button.config(state=NORMAL)
self.ok_var.set('')
self.zh_id=1
self.zx_id=1
self.nm_id=1
self.cz_id=1
self.stop_num=0
except:
pass
defsave_img(self,img_url,img_name):
suffix=None
if'.jpg"/>'inimg_url:
suffix='.jpg"/>'
elif'.gif'inimg_url:
suffix='.gif'
try:
img=requests.get(img_url,headers=self.headers)
ifimg.status_code==200:
withopen(self.file_path+'/'+img_name+suffix,"wb")asf:
f.write(img.content)
#time.sleep(0.5)
else:
pass
except:
pass
defsave_video(self,video_id,video_name):
try:
url='https://lens.zhihu.com/api/v4/videos/{}'.format(video_id)
video_url=requests.get(url,headers=self.headers).json()['playlist']['LD']['play_url']
video=requests.get(video_url,headers=self.headers)
ifvideo.status_code==200:
withopen(self.file_path+'/'+video_name+'.mp4',"wb")asf:
f.write(video.content)
#time.sleep(0.5)
else:
pass
except:
print(traceback.format_exc())
defmain():
#初始化对象
L=zhihu()
#进行布局
L.gui_arrang()
#主程序执行
tkinter.mainloop()
if__name__=='__main__':
main()
Tags:知乎回答,下载器,图片视频.
小编点评:作业互动组在线使用由西西为大家强势带来,
下载小编点评:南京证券鑫易通电脑版官方下载网上交.
下载小编点评:四年级上册全套小学数学练习题软件是一款.
下载小编点评:财通证券网上股票交易系统是由财通证.
下载小编点评:超星学习助手是对于超星尔雅网课的一款学习视.
下载小编点评:BitdefenderDecryp.
下载小编点评:360团队版比原版简捷、高效,它需要在官网进行申.
下载小编点评:悦(yuè)与乐(lè),分别取字.
下载小编点评:三的某某音乐歌单下载软件是一款简单实用.
下载小编点评:A站工具姬pc电脑版是一款功能强大功能强大.
下载小编点评:男生穿衣搭配的方法,男生英伦风格服装.
下载小编点评:四川省专业技术人员继续教育网自动挂机.
下载小编点评:99客服系统客户端是一款由99宿舍网.
下载梦聊V4.2A下载
Any to Icon(ICO图像批量转换器)V3.54下载
MSS HTML Editor(html编辑器)V1.22下载
魔力时空MT(互联网娱乐应用服务平台)V1.0.0下载
Any Video Downloader Pro下载-Any Video Downloader Pro v7.22.0
upToDate Downloader下载-更新下载工具 v1.4.0.12
微博美图下载-微博美图 v1.0 免费版
鸡吉村安卓-鸡吉村游戏(暂未上线)v1.0 安卓版
蹒跚之行破解版手游下载-蹒跚之行内购破解版下载v1.2.2 安卓版
谋杀悬疑手游下载-谋杀悬疑游戏下载v1.0.5 安卓最新版
九游摸金校尉之天字卷手游下载-摸金校尉之天字卷九游版下载v5.0.1 安卓版
卫生防疫技师题库2024最新版下载-卫生防疫技师题库APP下载v5.0.2 安卓版
九游交叉次元手游下载-交叉次元九游版下载v2.5.0 安卓版