仅供练习GUI 和 爬虫使用
‘’’
逻辑思路
1、爬取图片import requests
2、使用tkinter 设计的GUI,输入对应的照片信息进行爬取保存
3、程序设置过期时间 时间为3个月
‘’’
from tkinter import *
from tkinter.filedialog import askdirectory,askopenfilename #获取文件夹本地路径 ,获取文件路径
from tkinter import messagebox #信息框
import json
import os
import time
import datetime
class SouGou_img():
def __init__(self):
self.window = Tk()
self.window.title('图片批量爬取') #定义窗口名称
self.juzhong() #设置一个窗口居中函数
self.window.resizable(0,0) #固定窗口大小
# photo = PhotoImage(file='chuangkou_logo.gif') #设置窗口图标 设置了图标或者图片 打包的时候需要用-D 不能用-F
# self.window.iconphoto(False, photo)
self.over_time() #过期时间
# self.open_path = StringVar() # 显示文件路径字符串
self.save_path = StringVar() # 显示文件夹字符串
self.lab1 = Label(self.window, text='搜索图片名称*:', font=('微软雅黑'),fg='red') # 搜索图片名称
self.lab2 = Label(self.window, text='数量:', font=('微软雅黑')) # 数量
self.lab3 = Label(self.window, text='白嫖的IT知识抖音号*:', font=('微软雅黑'),fg='red') # 数量
self.lab4 = Label(self.window, text='图片保存路径*:', font=('微软雅黑'),fg='red') # 图片保存路径
self.lab6 = Label(self.window, text='抖音搜索"白嫖的IT知识"获取更多实用小工具', font=('微软雅黑'), fg='green') # 标签
self.text = Text(self.window, width=63, height=14, font=('微软雅黑')) #文本显示
self.entry_name = Entry(self.window, width=15) # 搜索图片名称
self.entry_num = Entry(self.window, width=6) # 数量
self.entry_ID = Entry(self.window, width=12) # 抖音ID
self.entry_addr = Entry(self.window, textvariable=self.save_path, width=59) # 保存文件夹的路径
self.but3 = Button(self.window, text='开始爬取', relief=RAISED, bg='red', font=('微软雅黑', '8', 'bold'),
command=self.Get_Date) # #按钮点击下载
self.but2 = Button(self.window, text='选择', relief=RAISED, command=self.select2_path) # 按钮 选择保存路径
# UI界面设计
def gui_arrang(self):
"""完成页面元素布局,设置各部件的位置"""
# self.lab0.pack()
self.lab1.place(x=0, y=4) #搜索图片名称
self.lab2.place(x=230, y=4) #数量
self.lab3.place(x=330, y=4) #白嫖的IT知识 抖音号
self.lab4.place(x=0, y=30) # 保存路径
self.lab6.place(x=140, y=365)
self.but2.place(x=535, y=31) # 选择
self.but3.place(x=516, y=365) # 开始生成
self.entry_name.place(x=117, y=8)
self.entry_num.place(x=275, y=8)
self.entry_ID.place(x=485, y=8)
self.entry_addr.place(x=117, y=35)
self.text.place(x=2, y=65) #大文本
# 保存路径 文件夹路径
def select2_path(self):
path = askdirectory()
self.save_path.set(path)
# 窗口居中
def juzhong(self):
width = 575
height = 395
self.window.geometry(f'{width}x{height}') #设计的窗口大小
#居中位置 计算屏幕的居中位置
screen_width = self.window.winfo_screenwidth() / 2 - width / 2
screen_height = self.window.winfo_screenheight() / 2 - height / 2
self.window.geometry(f"+{int(screen_width)}+{int(screen_height)}") #偏移位置
# 清楚文本框内容
def clera(self):
self.text.delete('0.0','end')
def insert(self):
self.text.insert('end', '1、红色带星为必填项哦'+'\n')
self.text.insert('end','2、默认图片最小获取数量为48张'+'\n')
self.text.insert('end','3、抖音上搜索“白嫖的IT知识”进入主页就能看到抖音号啦'+'\n')
self.text.insert('end','4、爬取100张大约等待30秒即可完成'+'\n')
self.text.insert('end','====================图片链接如下===================' +'\n')
# 设置程序过期时间
def over_time(self):
over_time = '2022-08-17'
now_time = datetime.datetime.now().strftime('%Y-%m-%d')
if now_time > over_time:
messagebox.showerror('错误','使用时间已到,请联系"白嫖的IT知识"获取无限制版')
self.window.destroy()
# 获取网页数据
def Get_Date(self):
if self.entry_name.get() == '':
messagebox.showerror('错误','搜索图片名称不能为空')
elif self.entry_addr.get() == '':
messagebox.showerror('错误','保存路径不能为空')
elif self.entry_ID.get() == '193292006':
name = self.entry_name.get()
num = self.entry_num.get()
path = self.entry_addr.get() + '/'
num_1 = 0
url = f'https://pic.sogou.com/napi/pc/searchList?mode=2&start=4&xml_len={num}&query={name}'
# mode = 尺寸格式 & start = 初始显示数量 & xml_len = 初始数+需要显示多少张, & query =搜索名称
print(url)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.115 Safari/537.36'
}
html_data = requests.get(url=url,headers=headers).text #获取文本数据
json_data = json.loads(html_data) #转换为json格式
# pprint.pprint(json_data)
data_all = json_data['data']['items']
list = []
for url in data_all:
# self.text.insert('end', '图片保存成功' + '/n')
time.sleep(0.2) #停顿时间
num_1 += 1
img_url = url['picUrl'] #获取图片链接
list.append(img_url)
print(img_url)
if not os.path.exists(path+name): #如果命名的文件夹不存在 则创建
os.makedirs(path+name)
# try 当程序发生错误的时候 跳过该错误,继续运行程序
try:
img_data = requests.get(url=img_url,headers=headers).content #图片信息获取
with open(r'{0}\{1}\{2}.jpg'.format(path,name,num_1),'wb') as f:
f.write(img_data)
print(f'第{num_1}张图片保存成功')
self.text.insert('end', '图片保存成功:'+img_url + '\n')
except:
print(f'第{num_1}图片地址错误,无法保存')
messagebox.showinfo('完成',f'图片保存完,成共计{num_1}张')
else:
messagebox.showinfo('抖音号错误','抖音号不对哦')
def main():
S=SouGou_img()
S.gui_arrang() #UI
S.insert() #文本框默认内容
mainloop()
if __name__ == '__main__':
main()