成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

python制作微博圖片爬取工具

瀏覽:25日期:2022-06-29 16:42:33

有小半個月沒有發博客了,因為一直在研究python的GUI,買了一本書學習了一些基礎,用我所學做了我的第一款GUI——微博圖片爬取工具。本軟件源代碼已經放在了博客中,另外軟件已經打包好上傳到網盤中以供下載學習。

一.準備工作

本次要用到以下依賴庫:re json os random tkinter threading requests PIL 其中后兩個需要安裝后使用

二.預覽1.啟動

python制作微博圖片爬取工具

2.運行中

python制作微博圖片爬取工具

3.結果

這里只將拿一張圖片作為展示。

python制作微博圖片爬取工具

三.設計流程

設計流程分為總體設計和詳細設計,這里我會使用viso畫出幾個流程圖,用以展示我的思路,其中詳細設計部分,我列舉了兩個函數實現的具體流程。

1.總體設計

python制作微博圖片爬取工具

此圖為整個系統的整體流程也是本GUI軟件的使用過程。

2.詳細設計

在此列舉兩個函數一個是搜索按鈕觸發的wb_search函數,一個是開始爬取按鈕觸發的wb_pics_parse函數。

2.1wb_search函數

python制作微博圖片爬取工具

2.2wb_pics_parse函數

python制作微博圖片爬取工具

四.源代碼

import jsonimport randomimport reimport osfrom tkinter import *from tkinter import messageboxfrom tkinter import ttkimport requestsimport threadingfrom 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 uadef wb_search(): #先清空lsibox1內容,便于新內容顯示 listb1.delete(0,END) url1=’https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D3%26q%3D{}%26t%3D0’ headers={’User-Agent’:get_ua()} key_word = e1.get() global user_id_list user_id_list=list() if len(key_word)!=0: #若用戶輸入了user_id,則去獲取screen_name if re.match(’d{10}’,key_word): user_id_list.append(key_word) url2 = f’https://m.weibo.cn/api/container/getIndex?uid={key_word}&containerid=100505{key_word}’ r1 = requests.get(url2, headers=headers) _data = json.loads(r1.text) screen_name = _data[’data’][’userInfo’].get(’screen_name’) l3.place(x=120, y=42) l3_var.set(f’搜索成功’) l3[’background’] = ’green’ listb1.insert(END, screen_name) #否則根據關鍵字去搜索用戶信息,顯示在listbox中 else: aim_url=url1.format(key_word) r=requests.get(aim_url,headers=headers) _json=json.loads(r.text) try:#若出現了IndexError則表明沒有檢索到用戶信息users=_json[’data’][’cards’][1].get(’card_group’)relevant_num=len(users)l3.place(x=105, y=42)l3_var.set(f’搜索到了 {relevant_num} 個用戶’)l3[’background’]=’green’for user_ in users: user_info=user_.get(’user’) user_name=user_info.get(’screen_name’) id = user_info.get(’id’) ''' 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?containerid={container_id}’ spider = WeiBo_pics_Spider(start_url) t1.config(state=’normal’) # 將Text開啟,置為可讀可寫狀態 l3.place(x=120, y=42) l3_var.set(f’正在運行......’) l3[’background’] = ’green’ for pic_url in spider.get_pics_url(): filename = pic_url.split(’/’)[-1] # 字符串切割,切割出前10個字符串 filename = filename[10:] thread_it(spider.download_pics,pic_url,filename)#搜索后,但是沒選擇用戶,會報TclError錯誤,此except就用來捕獲這個異常except TclError: messagebox.showwarning(title=’警告’, message=’請選擇一個用戶!’) l3.place(x=105, y=42) l3_var.set(f’請選擇一個用戶!’) l3[’background’] = ’red’#獲取當前選中項目(使用索引) else:messagebox.showwarning(title=’警告’,message=’請檢查路徑!’)l3.place(x=80, y=42)l3_var.set(f’請檢查路徑!’)l3[’background’] = ’red’ else: messagebox.showwarning(title=’警告’, message=’您未選擇磁盤!’) l3.place(x=85, y=42) l3_var.set(f’請檢查是否選擇了磁盤!’) l3[’background’] = ’red’ else: messagebox.showwarning(title=’警告’, message=’請輸入關鍵字!’) l3.place(x=110, y=42) l3_var.set(f’請輸入關鍵字!’) l3[’background’] = ’red’def open_disk(): disk=c1.get() big_dir=disk+’:/WeiBo_Pics’ if len(disk)==1: try: if not os.path.exists(big_dir):os.mkdir(big_dir) os.startfile(big_dir) except: messagebox.showwarning(title=’警告’,message=’選中的磁盤不存在!’) l3.place(x=110, y=42) l3_var.set(f’選中的磁盤不存在!’) l3[’background’] = ’red’ else: messagebox.showwarning(title=’警告’, message=’您未選中磁盤!’) l3.place(x=115, y=42) l3_var.set(f’您未選中磁盤!’) l3[’background’] = ’red’def window_quit(): ret=messagebox.askyesno(title=’提示’,message=’是否要退出?’) if ret==True: window.destroy() window.quit()def e1_clear(): e1.delete(0,END)def print_path(event): #要使用完整的路徑 global disk disk = c1.get() disk_path=c1.get()+’:/’ if len(disk)==1: if os.path.exists(disk_path): messagebox.showinfo(title=’提示’,message=f’文件將存儲到:{disk}:/WeiBo_Pics目錄下’) else: messagebox.showerror(title=’錯誤’,message=’選定磁盤不存在!’) l3.place(x=100, y=42) l3_var.set(f’選中的磁盤不存在!’) l3[’background’] = ’red’ else: messagebox.showwarning(title=’警告’, message=’請先選定磁盤!’) l3.place(x=120, y=42) l3_var.set(f’請先選定磁盤!’) l3[’background’] = ’red’def switch(): if r1_var.get()==0: r1_var.set(1) else: r1_var.set(0)def escape(event): window_quit()def enter(event): wb_search()’’’解決程序卡死的重要方法,避免子線程和Ui線程在同一個線程’’’def thread_it(func, *args): ’’’將函數打包進線程’’’ # 創建 t = threading.Thread(target=func, args=args) # 守護 !!! t.setDaemon(True) # 啟動 t.start() # 阻塞--卡死界面! # t.join()window=Tk()width=310height=395screenWidth = window.winfo_screenwidth() # 獲取顯示區域的寬度screenHeight = window.winfo_screenheight() # 獲取顯示區域的高度left = (screenWidth - width) / 2top = (screenHeight - height) / 2window.geometry('%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)#默認選中為1check1=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 微博圖片爬取的資料請關注好吧啦網其它相關文章!

標簽: 微博 Python
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
久久久www| 国产精品一区二区三区网站| 美女脱光内衣内裤视频久久影院| 亚洲欧洲精品一区二区| 国产视频一区二区在线| 99精品视频中文字幕| 日韩一区二区三区视频在线观看| 免费av成人在线| 色偷偷久久人人79超碰人人澡 | 欧美精品少妇一区二区三区| 美女性感视频久久| 在线一区二区三区做爰视频网站| 日韩精品欧美成人高清一区二区| 久久男女视频| 日本亚洲天堂网| 在线免费观看视频一区| 久久成人精品无人区| 欧美日韩视频专区在线播放| 国产在线不卡一卡二卡三卡四卡| 91精品国产一区二区三区蜜臀| 国产一区二区伦理片| 正在播放一区二区| 国产成人精品网址| 久久综合色播五月| 欧美三级网页| 亚洲精品va在线观看| 性感少妇一区| 日韩国产欧美视频| 欧洲色大大久久| 久久97超碰国产精品超碰| 88在线观看91蜜桃国自产| 国产成人精品www牛牛影视| 精品日韩欧美在线| 欧美另类视频在线| 1024亚洲合集| 免费亚洲网站| 欧美aaa在线| 欧美日韩三级在线| 成人av片在线观看| 日本一区二区三区电影| 亚洲国产午夜| 天天综合网 天天综合色| 欧美在线视频你懂得| 国产精品66部| 久久噜噜亚洲综合| 精品999网站| 亚洲自拍与偷拍| 91国产福利在线| 国产成人精品aa毛片| 国产亚洲制服色| 亚洲黄色大片| 免费欧美在线视频| 91精品国产aⅴ一区二区| 91在线小视频| 亚洲男人的天堂在线观看| 一本到三区不卡视频| 国产一区中文字幕| 日本一区二区三区久久久久久久久不 | 91视频www| 亚洲私人影院在线观看| 久久综合九色综合久99| 国产毛片精品一区| 国产精品护士白丝一区av| 欧美亚洲三区| 国产成人免费9x9x人网站视频| 中文一区在线播放| 一本色道久久综合亚洲91| 福利一区在线观看| 亚洲视频免费在线| 欧美色国产精品| 91视频观看视频| 天天影视涩香欲综合网| 精品日产卡一卡二卡麻豆| 99在线热播精品免费99热| 精品在线观看视频| 国产亲近乱来精品视频| 蜜桃av久久久亚洲精品| 丁香另类激情小说| 亚洲精品成人少妇| 欧美一区日韩一区| 一本久道久久久| 国产精品一区二区在线观看网站| 中文字幕亚洲成人| 欧美精品日日鲁夜夜添| 亚洲欧洲一级| 国产精品 欧美精品| 亚洲欧美另类小说| 欧美一二三区在线| 国产精品亚洲产品| 成人黄色av电影| 午夜视频一区二区三区| 精品国产91久久久久久久妲己| 亚洲欧美日韩在线观看a三区| 岛国精品一区二区| 午夜精品一区在线观看| 国产亚洲精久久久久久| 日本韩国一区二区三区| 合欧美一区二区三区| 国产一区久久久| 一区二区在线免费观看| 精品国产一区二区精华| 色偷偷成人一区二区三区91| 欧美+亚洲+精品+三区| 免费成人av资源网| 中文字幕人成不卡一区| 欧美精品成人一区二区三区四区| 亚洲大胆视频| 成人深夜福利app| 热久久一区二区| 综合色中文字幕| 精品久久久久av影院| 在线视频国内自拍亚洲视频| 亚洲经典在线| 成人av电影免费在线播放| 日韩福利视频导航| 亚洲三级视频在线观看| 久久在线观看免费| 欧美日韩1234| 美女黄网久久| 在线日本成人| 97久久精品人人澡人人爽| 精品一区在线看| 午夜精品影院在线观看| 亚洲欧洲av一区二区三区久久| 欧美va日韩va| 欧美日韩精品三区| 久久久精品国产一区二区三区| 国产在线欧美| 99视频国产精品| 国产毛片精品一区| 蜜桃久久久久久久| 亚洲成人精品一区| 亚洲免费伊人电影| 日本一区二区三区电影| 精品欧美久久久| 欧美撒尿777hd撒尿| 老**午夜毛片一区二区三区| 亚洲啪啪91| 国产一区自拍视频| 91首页免费视频| 国产成人av电影| 国模套图日韩精品一区二区| 日韩精品电影在线| 亚洲午夜激情网页| 亚洲三级小视频| 中文字幕一区二区三区在线播放 | 亚洲国产精品久久人人爱| 成人免费一区二区三区视频| 精品电影一区二区三区| 91.com在线观看| 欧美日韩一级片在线观看| 久久婷婷影院| 美女黄色成人网| 国产精品一区毛片| 亚洲国产一区二区三区a毛片| 欧美日韩一区二区三区在线观看免 | 91精品综合久久久久久| 91九色02白丝porn| 老司机精品视频网站| 久久精品99| 六月婷婷久久| 亚洲欧美春色| 性欧美暴力猛交另类hd| 羞羞视频在线观看欧美| 国产日韩精品久久| 国产精品亚洲综合色区韩国| 亚洲精品无人区| 日韩亚洲国产欧美| 一区在线免费| 国内在线观看一区二区三区| 欧美视频1区| 亚洲一二区在线| 伊人成人在线| 在线日韩视频| 国产精品久久久久久模特| 国产精品资源| 亚洲欧美日韩国产一区二区| 国产亚洲精品自拍| 亚欧美中日韩视频| 色诱亚洲精品久久久久久| 色婷婷av一区二区三区gif | 亚洲国产婷婷| 99视频+国产日韩欧美| 国产日韩精品久久| 久久综合九色综合欧美狠狠| 在线视频一区二区免费| 欧美精品欧美精品系列| 日韩一区二区在线播放| 2021久久国产精品不只是精品 | 日韩影院精彩在线| 欧美96一区二区免费视频| 激情综合五月天| 国产精品456| 91在线观看成人| 国产一区自拍视频| 在线亚洲观看| 日本高清不卡视频| 91精品欧美久久久久久动漫| 2020国产精品| 国产三级精品在线|