源码实例-表情包爬取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | import requests from lxml import etree import os import sys from urllib.parse import quote # 对汉字进行URL编码,URL编码的方式是把需要编码的字符转化为 %xx 的形式 import tkinter as tk import tkinter.messagebox import threading # 使用线程可解决UI界面卡死问题 import time # 本项目主要使用time.sleep()进行延时 # import PythonMagick # 图片处理 class the_emoticon(): def __init__( self ): # 创建UI图形化界面 self .window = tk.Tk() # 创建最上层主窗口 # 将图片转换成ico格式 # self.logo = PythonMagick.Image('./logo.png') # self.logo.sample('128x128') # self.logo.write('./logo.ico') # self.window.iconbitmap('./logo.ico') self .window.title( "表情包批量下载工具 - 黑客零" ) # 窗口标题 self .sw = ( self .window.winfo_screenwidth() - 400 ) / 2 # 得到屏幕宽度 self .sh = ( self .window.winfo_screenheight() - 150 ) / 2 # 得到屏幕高度 self .window.geometry( "400x150+%d+%d" % ( self .sw, self .sh)) # 窗口大小+窗口位置 self .window.resizable( 0 , 0 ) # 设置窗口大小不可缩放,防止用户调整尺寸 # 定义Label组件用于显示字体 self .tit = tk.Label( self .window, text = "表情包官网:http://www.doutula.com/" , font = ( "华文行楷" , 14 )).place(x = 60 , y = 10 ) self .tit1 = tk.Label( self .window, text = "(平均一页可爬取12x6=72张表情包)" , font = ( "华文行楷" , 8 )).place(x = 100 , y = 30 ) self .pages = tk.Label( self .window, text = "表情包页数:" , font = ( "微软雅黑" , 10 )).place(x = 80 , y = 50 ) self .majors = tk.Label( self .window, text = "表情包主题:" , font = ( "微软雅黑" , 10 )).place(x = 80 , y = 80 ) # 分别定义两个输入框(爬取页数,爬取主题) self .var_page = tk.StringVar() self .var_major = tk.StringVar() self .entry_page = tk.Entry( self .window, textvariable = self .var_page) self .entry_page.place(x = 160 , y = 50 ) self .entry_major = tk.Entry( self .window, textvariable = self .var_major) self .entry_major.place(x = 160 , y = 80 ) # 按钮组件,点击触发函数(通过线程解决UI界面卡死问题) self .button = tk.Button( self .window, text = '开始爬取' , font = '15' , command = lambda : self .thread_it( self .get_tar)) self .button.place(x = 160 , y = 110 ) self .window.mainloop() # 启动主窗口循环 # 使用线程解决UI界面卡死问题(要加入self,否则报错) def thread_it( self , func, * args): '''将耗时的操作函数打包进线程''' # 创建 t = threading.Thread(target = func, args = args) # 守护 t.setDaemon( True ) # 启动 t.start() # 阻塞 -- 卡死界面 # t.join() # 主要表情包获取函数 def get_tar( self ): # 获取表情包页数和主题 try : xx = self .var_page.get() x = int (xx) y = self .var_major.get() except : # print("请输入规范内容!") result = tkinter.messagebox.askokcancel(title = '警告' , message = '请重新打开本软件并输入规范内容!' ) self .button[ 'command' ] = result sys.exit( 0 ) self .window.destroy() # 首先在当前目录下创建文件夹"表情包" path = f ".\表情包\{y}" isExists = os.path.exists(path) if not isExists: os.makedirs(path) # 改变按钮状态 if self .button[ 'text' ] = = '开始爬取' : self .button[ 'text' ] = '爬取中...' self .button.config(state = "disabled" ) # 共爬取x页表情包 for i in range (x): # 获取页面数据 headers = { 'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.129 Safari/537.36' } url = "http://www.doutula.com/search?type=photo&more=1&keyword=" + quote(y) + "&page=" + str (i) html = requests.get(url, headers = headers).text # print(html) # 解析出其中的表情包数据 html_xpath = etree.HTML(html) # 如果是选取的是第一个div,可以将div[1]简写成div;选择src属性的超链接会改变,data-original才是真实超链接(应该是反爬虫机制) imgs = html_xpath.xpath( '//*[@class="container"]/div/div/div[2]/div/div/div/div/a/img/@data-original' ) # print(imgs) num = 0 # 保存表情包数据到文件夹中 for img in imgs: num + = 1 try : res = requests.get(img, headers = headers).content img_name = img.split( '/' )[ - 1 ].split( '.' )[ - 1 ] # 通过split()方法,根据/将字符串img分割开,并取出/分割的最后一部分字符串作名字 img_path = f "{path}\{y}{num}.{img_name}" # 构造路径地址 with open (img_path, 'wb' ) as files: files.write(res) # print(img.name + " ====> 保存成功!") except : pass # 爬取失败直接忽视 # print("表情包全部爬取完毕!") # 改变按钮状态 if self .button[ 'text' ] = = '爬取中...' : self .button[ 'text' ] = '爬取成功' time.sleep( 2 ) self .button[ 'text' ] = '开始爬取' self .button.config(state = "normal" ) if __name__ = = '__main__' : the_emoticon() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构