[Asm] 纯文本查看 复制代码import requests

import os

import time

from threading import Thread

import threadpool

import traceback

import tkinter

from tkinter import *

import threading

from tkinter import messagebox

import win32clipboard as wc

from tkinter import filedialog

def async(f):

def wrapper(*args, **kwargs):

thr = Thread(target=f, args=args, kwargs=kwargs)

thr.start()

return wrapper

class zhihu(object):

def __init__(self):

self.id = None

self.headers = {

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/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.更多好玩软件、资源欢迎')

def gui_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)

# 获取粘贴板里的内容

def getCopyTxet(self):

try:

wc.OpenClipboard()

copytxet = wc.GetClipboardData()

wc.CloseClipboard()

self.input_var.set(str(copytxet))

except:

pass

def thread_wenti_jc(self):

t = threading.Thread(target=self.wenti_jc)

t.setDaemon(True)

t.start()

def thread_get_offset(self):

t = threading.Thread(target=self.get_offset)

t.setDaemon(True)

t.start()

def thread_browse_folder(self):

t = threading.Thread(target=self.browse_folder)

t.setDaemon(True)

t.start()

# 浏览本地文件夹,选择保存位置

def browse_folder(self):

# 浏览选择本地文件夹

save_address = filedialog.askdirectory()

if len(save_address) != 0:

self.wt_file_var.set(save_address)

# 把获得路径,插入保存地址输入框(即插入input_save_address输入框)

# input_save_address.insert(0, save_address)

def wenti_jc(self):

wt_data = self.input_wtid.get()

if len(wt_data) == 0:

tkinter.messagebox.showerror('错误提示', '请先输入问题ID或链接')

else:

try:

if wt_data.isdigit():

url = 'https://www.zhihu.com/api/v4/questions/{}/answers'.format(wt_data)

r = requests.get(url, headers=self.headers)

if r.status_code == 200:

self.totals = int(r.json()['paging']['totals'])

self.title = r.json()['data'][0]['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)

if wtids and len(wtids[0]) != 0:

url = 'https://www.zhihu.com/api/v4/questions/{}/answers'.format(wtids[0])

r = requests.get(url, headers=self.headers)

if r.status_code == 200:

self.totals = int(r.json()['paging']['totals'])

self.title = r.json()['data'][0]['question']['title']

self.id = int(wtids[0])

tkinter.messagebox.showinfo('问题链接正确', '你本次要下载的问题为“%s”' % self.title)

else:

tkinter.messagebox.showerror('问题链接输入错误', '请检查你的问题链接并重新输入')

else:

if '/question/' in wt_data:

wtids = wt_data.split('/question/')

for wtid in wtids:

if wtid.isdigit():

url = 'https://www.zhihu.com/api/v4/questions/{}/answers'.format(wtid)

r = requests.get(url, headers=self.headers)

if r.status_code == 200:

self.totals = int(r.json()['paging']['totals'])

self.title = r.json()['data'][0]['question']['title']

self.id = int(wtid)

tkinter.messagebox.showinfo('问题链接正确', '你本次要下载的问题为“%s”' % self.title)

else:

tkinter.messagebox.showerror('问题链接输入错误', '请检查你的问题链接并重新输入')

else:

tkinter.messagebox.showerror('问题链接输入错误', '请检查你的问题链接并重新输入')

except:

tkinter.messagebox.showerror('错误提示', '抱歉,出现未知错误,请稍后再试')

def get_offset(self):

if self.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)

if not folder: # 判断是否存在文件夹如果不存在则创建为文件夹

os.makedirs(self.file_path) # makedirs 创建文件时如果路径不存在会创建这个路径

# else:

# print('该问题内容已经有啦~')

# sys.exit()

if self.totals % 20 == 0:

self.max = int(self.totals / 20)

else:

self.max = int(self.totals / 20) + 1

for m in range(self.max):

offset = m * 20

self.get_urls(offset)

time.sleep(3)

[url=home.php?mod=space&uid=512266]@Async[/url] # 开启异步线程执行 调用一次开启一个线程

def get_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()

if self.stop_num == 0:

self.ok_var.set('已完成 1%')

datas = r['data']

for data in datas:

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('

video_urls = re.findall('"z-ico-video">(.*?)', content, re.S)

if img_urls:

for i in range(len(img_urls)):

file_name = '{}({})_{}'.format(name, otherStyleTime, i + 1)

img_names.append(file_name)

if len(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) for req in results]

pool.wait()

if video_urls:

for i in range(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)

if len(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) for req in results]

pool.wait()

self.stop_num += 1

ok_num = round(self.stop_num / self.max, 2)

self.ok_var.set('已完成 {}%'.format(int(ok_num * 100)))

if self.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

def save_img(self, img_url, img_name):

suffix = None

if '.jpg' in img_url:

suffix = '.jpg'

elif '.gif' in img_url:

suffix = '.gif'

try:

img = requests.get(img_url, headers=self.headers)

if img.status_code == 200:

with open(self.file_path + '/' + img_name + suffix, "wb") as f:

f.write(img.content)

# time.sleep(0.5)

else:

pass

except:

pass

def save_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)

if video.status_code == 200:

with open(self.file_path + '/' + video_name + '.mp4', "wb") as f:

f.write(video.content)

# time.sleep(0.5)

else:

pass

except:

print(traceback.format_exc())

def main():

# 初始化对象

L = zhihu()

# 进行布局

L.gui_arrang()

# 主程序执行

tkinter.mainloop()

if __name__ == '__main__':

main()

python 动图_【Python】知乎回答下载神器,图片/视频/gif动图均可下载相关推荐

  1. 树莓派python开发教程_树莓派Raspberry开发从基础到进阶视频+设计资料超详细教程下载...

    课程内容 [初级篇]重点推荐:树莓派开发实战视频教程+文档教程(含源码) 课程目录 教学视频与源代码 1.[进阶篇]Raspberry详细视频教程 树莓派基础 安装树莓派的操作系统 远程登录和使用树莓 ...

  2. python绘制三维矢量图_【知乎专栏】让你的论文图表更sexy

    原标题:[知乎专栏]让你的论文图表更sexy 有些同学在写论文的时候光注意文字的阐述,忽略掉了一个重要因素--图表.插入的图表不仅无意义,有时候甚至造成图表影响了文章内容表达.下面干货满满,十分钟教你 ...

  3. 利用python爬取_在知乎上利用Python爬取了三百万数据!服务器崩了!企业级大项目...

    请各位注意: 以下所有分析结果都基于我抓取到的这300万用户的个人信息,非权威分析,仅供参考. 数据抓取时间为2017年7月份,用户数据会随着时间推移而变化,所以该报告具有一定时效性. 知乎的用户个人 ...

  4. 加载gif动图_【知乎编辑技巧】GIF动图 的插入 2020.05

    GIF动图,相比视频,打开的成本会更低一些,能够展示有限的动画和过程 我研究了一下如何插入比较高画质的GIF @知一声 考虑在PC端价格视频转动图的功能吗~ 有个前提-- 除非GIF带来的阅读提升感受 ...

  5. python知识笔记_[Python笔记]第一篇:基础知识

    二.为什么要使用Python 优点: 学习成本低 开发效率高–拥有丰富而且强大的第三方库 高级语言–不用关心底层运作细节 可扩展性–Python是一门胶水语言,能于其他语言如C ,C#进行扩展 缺点: ...

  6. python 病毒 基因_#Python#提取基因对应的蛋白质名

    提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...

  7. python网易云_[Python] 网易云歌单/歌曲下载

    界面化 可以根据歌单 / 歌曲ID 下载 歌单/歌曲. eg: 歌单ID: https://music.163.com/#/playlist?id=3233380300 中的 3233380300 运 ...

  8. python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘

    1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...

  9. python下载神器_python 视频下载神器(you-get)的具体使用

    you-get是github上python的一个开源库(https://github.com/soimort/you-get),使用you-get你只需要取得视频所在网页链接地址就可以很轻松的下载下来 ...

最新文章

  1. 自定义控件详解(三):Canvas效果变换
  2. java程序员修炼之道
  3. matlab中quat2angle,RPY_Euler_Quaternion_AngleAxis角度转化:Matlab、Python、Halc
  4. 西门子s7 计算机通讯,西门子s7-200 plc通讯连不上怎么办?
  5. python基础(1)——简介与安装
  6. 一个简单的文本编译器
  7. Autodesk Eagle入门之-开启旅程
  8. vue3.0实现jsoneditor组件
  9. 使用Java生成验证码
  10. 51单片机学习入门(三):串口
  11. 实习日记——Day11
  12. Ubuntu 18.04.6 允许root用户登录桌面
  13. k8s学习笔记——ceph rbd本地手动挂载
  14. html跳转qq浏览器,导入其他书签
  15. 企业级服务器固态硬盘,普通SSD与企业SSD的区别_Intel服务器CPU_企业存储技术与评测-中关村在线...
  16. 云适配CEO陈本峰:移动办公真正产生商业价值要落到实际场景中
  17. 开源风暴吞噬AI界?从Stable Diffusion的爆火说起
  18. 《红楼梦》-正文第三十九回名師誦読文稿
  19. ASP 3.0高级编程(一)
  20. mysql设置主键约束为降序_MySQL约束的概述 - osc_tko37abm的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. 奇异值分解(SVD)原理总结
  2. MFC+HPSocket+log4cplus的TCP助手(一、界面绘制)
  3. MATLAB2020a 安装教程
  4. java使用snmp协议
  5. PAT 名人堂与代金券(结构体多条件排序)
  6. [PS小教程]漂亮色调一秒变出来
  7. 【6种解决办法汇总】win10删除桌面文件需要刷新才会消失如何解决
  8. 如何从Linux命令行截屏
  9. ABAP 出库单打印
  10. 矩阵论 什么是度量矩阵