有小半个月没有发博客了,因为一直在研究python的GUI,买了一本书学习了一些基础,用我所学做了我的第一款GUI——微博图片爬取工具。本软件源代码已经放在了博客中,另外软件已经打包好上传到网盘中以供下载学习。
一.准备工作
本次要用到以下依赖库:re json os random tkinter threading requests PIL 其中后两个需要安装后使用
二.预览
1.启动
2.运行中
3.结果
这里只将拿一张图片作为展示。
三.设计流程
设计流程分为总体设计和详细设计,这里我会使用viso画出几个流程图,用以展示我的思路,其中详细设计部分,我列举了两个函数实现的具体流程。
1.总体设计
此图为整个系统的整体流程也是本GUI软件的使用过程。
2.详细设计
在此列举两个函数一个是搜索按钮触发的wb_search函数,一个是开始爬取按钮触发的wb_pics_parse函数。
2.1wb_search函数
2.2wb_pics_parse函数
四.源代码
import json import random import re import os from tkinter import * from tkinter import messagebox from tkinter import ttk import requests import threading from PIL import Image,ImageTk """ 1.07使用check button 实现下载完打开文件夹操作,注册了enter、esc热键,优化了一些体验 1.08 1.更新了关键字、磁盘、用户判断逻辑 2.将之前的线程池改为多线程来执行下载操作 1.13说明:如果在下载过程变慢,可能是软件正在解析图片地址或者就是您的网络不行 """ class WeiBo_pics_Spider(object): def __init__(self,start_url): self.start_url=start_url #解析出图片地址 def get_pics_url(self): i = 1 global a_flag a_flag = True while True: url = self.start_url + '&page={}'.format(i) headers = {'User-Agent': get_ua()} r = requests.get(url, headers=headers) _json = json.loads(r.text) items = _json["data"]["cards"] flag = _json['ok'] if flag == 1 and a_flag: # 爬取数据标志+一个手动控制标志 for v in items: picslist = v.get('mblog') if picslist is not None: img_urls = picslist.get('pics') if img_urls != None: for img_url_ in img_urls: img_url = img_url_['large']['url'] yield img_url else: #1.06页数显示出现问题 t1.insert(END, f'***在第{i}页终止***\n') t1.see(END) t1.update() if r1_var.get() == 1: big_dir=disk+':/WeiBo_Pics' os.startfile(big_dir) break i += 1 #下载图片 def download_pics(self,url,filename): headers={'User-Agent': get_ua()} r = requests.get(url, headers=headers) big_dir=disk+':/WeiBo_Pics' aim_path=big_dir+'/'+user_name_selected try: os.makedirs(aim_path) except: pass with open(aim_path + '\\' + filename, 'wb')as f: f.write(r.content) # 保证焦点始终在最下 t1.see(END) # 下载完一张刷新一次 防止界面卡死崩溃 t1.insert(END, f'{filename}\n') window.update() def get_ua(): first_num = random.randint(55, 62) third_num = random.randint(0, 3200) fourth_num = random.randint(0, 140) os_type = [ '(Windows NT 6.1; WOW64)', '(Windows NT 10.0; WOW64)', '(X11; Linux x86_64)', '(Macintosh; Intel Mac OS X 10_12_6)' ] chrome_version = 'Chrome/{}.0.{}.{}'.format(first_num, third_num, fourth_num) ua = ' '.join(['Mozilla/5.0', random.choice(os_type), 'AppleWebKit/537.36', '(KHTML, like Gecko)', chrome_version, 'Safari/537.36'] ) return ua def wb_search(): #先清空lsibox1内容,便于新内容显示 listb1.delete(0,END) url1='https://m.weibo.cn/api/container/getIndex""" 1.02的一种思路,使用一个列表存储screen_name和uid,两者用;(自定义字符,但应避免较少冲突) 当获取Uid时,直接切割字符串,取Listbox所选项索引,按索引在列表表值(uid) #使用字符串拼接 格式:screen_name+';'+str(id) # user_data = user_name + ';' + str(id) """ user_id_list.append(id) listb1.insert(END,user_name) except IndexError:#如果没有检索到用户,就会报列表索引错误 messagebox.showinfo(title='提示', message='没有检索到相关用户,请更换关键字或使用用户id搜索!') l3.place(x=85, y=42) l3_var.set(f'请更换关键字或用户id搜索!') l3['background']='yellow' #没有检索到用户的话,提示之后,e1获得焦点之后,清除用户之前输入 e1.bind('WM_TAKE_FOCUS', e1_clear()) else:#处理没有输入关键字 messagebox.showinfo(title='info',message='请输入关键字!') l3.place(x=110, y=42) l3_var.set(f'请输入关键字!') l3['background'] = 'red' def wb_pics_parse(): key_word=e1.get() select_path=c1.get() #1.先判断关键字是否输入 if len(key_word)!=0: #2.再判断是否选择了磁盘 if len(select_path)==1: #3.判断所选路径是否存在 if not os.path.exists(select_path): #4.判断是否在列表框选择了用户名 try: # 直接获取选中项目 """1.05获取Listbox user_name_selected真费劲""" global user_name_selected user_name_selected=listb1.get(listb1.curselection()) user_name_index = listb1.curselection()[0] user_id = user_id_list[user_name_index] container_id = '107603' + str(user_id) start_url = f'https://m.weibo.cn/api/container/getIndex"%dx%d+%d+%d" % (width, height, left, top)) window.resizable(0,0) window.title('微博图片采集工具-v1.08') #设置图标 ico_path=r'./rely/icon.ico' window.iconbitmap(ico_path) #插入图片到Label中 photo = Image.open("./rely/w_b.png") # 括号里为需要显示在图形化界面里的图片 photo = photo.resize((150, 40)) # 规定图片大小 img0 = ImageTk.PhotoImage(photo) l1=ttk.Label(window,imag=img0,justify='center') l1.pack() l3_var=StringVar() l3=ttk.Label(window,background='yellow',textvar=l3_var) l3.place(x=120,y=42) l3_var.set('还没搜索') l1=ttk.Label(window,text='关键字或\n用户id:') l1.place(x=13,y=60) e1=ttk.Entry(window,justify='center') e1.place(x=80,y=65) l4=ttk.Label(window,text='磁盘:') l4.place(x=13,y=100) disk_list=['C','D','E','F','G','H','I'] c1=ttk.Combobox(window,justify='center',state='readonly',width=17,value=disk_list) #Combobox默认选中索引为0的项目 即 C盘 c1.bind('<<ComboboxSelected', print_path) c1.place(x=80,y=100) r1_var=IntVar() r1_var.set(1)#默认选中为1 check1=Checkbutton(window,text='下载完\n打开文件夹',command=switch) check1.place(x=223,y=90) b1=ttk.Button(window,text='搜索',command=lambda:thread_it(wb_search),width=7) b1.place(x=230,y=63) l5=ttk.Label(window,text='用户列表:') l5.place(x=13,y=150) lb1_var=StringVar() listb1=Listbox(window,justify='center',listvariable=lb1_var,width=20,height=4) listb1.place(x=80,y=135) b2=ttk.Button(window,text='开始爬取',command=lambda :thread_it(wb_pics_parse,),width=7) b2.place(x=230,y=160) l6=ttk.Label(window,text='状态:') l6.place(x=13,y=280) t1=Text(window,width=23,font=('times new roman',10),state='disable') t1.place(x=80,y=230,height=140) b3=ttk.Button(window,text=' 打开\n文件夹',width=7,command=open_disk) b3.place(x=230,y=230) b3=ttk.Button(window,text='退出',width=7,command=window_quit) b3.place(x=230,y=315) f1 = ttk.LabelFrame(window) f1.place(x=65,y=350) l6=ttk.Label(f1,text='敬告:本软件仅供学习交流使用!',foreground='red') l6.pack(anchor="w",fill=X) #绑定esc键---退出 window.bind('<Escape>',escape) #使用return键给输入框Entry绑定enter事件---search搜索 e1.bind('<Return>',enter) #加入主窗口销毁事件 window.protocol('WM_DELETE_WINDOW',window_quit) window.mainloop()
五.总结说明
本软件仅供学习交流使用!图源水印,在此仅作举例!
由于这是第一次做GUI,因此遇到了一些问题,在此列举一下:
1.窗口布局问题(GUI基础)
2.主窗口执行一个比较耗时操作导致卡死、崩溃(线程问题)。
3.主窗口关闭后,后台线程还在运行(线程问题)。
以上问题已经全部解决,软件切实可用。
另外,本软件有四大亮点:
1.使用线程下载图片
2.智能标签提醒
3.输入关键字直接敲回车能够完成搜索
4.Esc快速退出软件
软件打包好了放在了蓝奏云https://wws.lanzous.com/iPSpzkchj5i
以上就是python制作微博图片爬取工具的详细内容,更多关于python 微博图片爬取的资料请关注其它相关文章!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]