Mind+ python爬虫、GUI、pillow制作一个个性签名
mind+更新到了1.7版本后,新增了python模式,在论坛中也看到了很多大神发的帖子,今天我也来试试!我选择用使用爬虫、tkinter(GUI工具)和图像处理(pillow)制作一个个性签名的程序。
功能介绍
利用GUI(图形用户界面)的工具制作一个弹窗窗口,当输入人名时,能够自动跳转到相应的网址爬出自己所要的数据,再结合图像处理工具pillow进行图像处理,最终在本地文件中生成个性签名。
知识储备
1、爬虫:“爬虫”是一种形象的说法。我们把互联网比喻成一张大网,爬虫是一个程序或脚本在这种大网上爬走。碰到虫子(资源),若是所需的资源就获取或下载下来。这个资源通常是网页、文件等等。可以通过该资源里面的url链接,顺藤摸瓜继续爬取这些链接的资源。
2、tkinter:tkinter也叫tk接口,是tk图形用户界面工具包标准的python接口。tk是一个轻量级的跨平台图像用户界面(GUI)的开发工具。
3、pillow:pillow是一个基础的图形处理库。我们可以使用pillow库来进行图像读取与存储、图像的剪切合并、图像格式的转换等操作。
4、正则表达式:简称RE,又称规则表达式,它不是某个编程语言所特有的,是计算机科学的一个概念,通常被用来检索和替换符合某些规则的文本。
软件准备
1、mind+ 1.7及以上版本
2、打开mind+,选择python模式并新建一个“个性签名.py”的文件
3、双击新建的文件,即可打开文件进行程序的编写
4、安装需要的库文件,pillow库和requests库
功能实现
一、利用GUI(图形用户界面)的工具制作一个弹窗窗口
1、制作图像界面,输入以下代码
from tkinter import *
#创建窗口
rview=Tk()
#标题
rview.title("个性签名")
#窗口大小 长高用小写x隔开
rview.geometry("600x300")
#消息循环 显示窗口
rview.mainloop()
2、点击运行程序
3、运行效果
4、按照自己的功能需求完善修改和增加代码
from tkinter import *
#创建窗口
rview=Tk()
#标题
rview.title("个性签名")
#窗口大小 长高用小写x隔开
#rview.geometry("600x300")
#窗口基于屏幕的坐标 +x轴+y轴
rview.geometry("+500+200")
#创建lab标签
labelx=Label(rview,text="签名",fg="red",font=("微软雅黑",30))
#显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐
labelx.grid(row=0,column=0)
#创建输入框
entryx=Entry(rview,font=("微软雅黑",20))
#显示输入框
entryx.grid(row=0,column=1)
#消息循环 显示窗口
rview.mainloop()
5、运行程序,得到了我想要的效果(也可以按照自己的想法进行修改)
6、接下来增加按钮模块功能代码,在这里写了一个butonck函数,用来存放点击按钮时做出的一些反应,并调用它让它显示出来。
from tkinter import *
from tkinter import messagebox
def butonck():
#改变lab颜色
labelx["fg"]="blue"
#获取输入框值
textx=entryx.get()
#去掉字符串前后空格
textx=textx.strip()
if textx=='':
#弹出提示框
messagebox.showinfo("提示","输入不可为空")
#创建窗口
rview=Tk()
#标题
rview.title("个性签名")
#窗口大小 长高用小写x隔开
#rview.geometry("600x300")
#窗口基于屏幕的坐标 +x轴+y轴
rview.geometry("+500+200")
#创建lab标签
labelx=Label(rview,text="签名",fg="red",font=("微软雅黑",30))
#显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐
labelx.grid(row=0,column=0)
#创建输入框
entryx=Entry(rview,font=("微软雅黑",20))
#显示输入框
entryx.grid(row=0,column=1)
#创建按钮
buttonx=Button(rview,text="确定",font=("微软雅黑",30),command=butonck)
#显示按钮
buttonx.grid(row=1,column=2)
#消息循环 显示窗口
rview.mainloop()
7、运行效果
当输入为空时,弹出另一个窗口提示输入不能为空
当输入有内容时,则lab标签名字由红变蓝
哇!!!好不容易啊,终于做成了我想要的输入框。接下来我就要实现点击按钮时能够利用request爬到网站的数据了。找了一下相应的网址,找到了一个符合我需求的网址:http://www.uustv.com/
接下来进行下一步!!!
二、利用爬虫获取网站数据
1、利用requests库,以post请求方式,发送http网络请求
import requests
data={'mind':'hello'} #表单参数
#对需要爬取的网页发送请求
response=requests.post('http://www.uustv.com/',data=data)
#以文本形式打印网页源码
print(response.text)
2、点击运行程序,可以从终端看到我们爬到的数据
3、用浏览器打开我们需要爬的网站(建议使用谷歌浏览器),打开开发者工具
打开后
此时你仔细去对比和我们爬出来的数据是一致的。
4、通过网站爬出自己想要的内容,这里我们需要的内容是,生成个性签名的部分。
5、找到我们需要爬出的数据
import requests
import re #正则表达式
#网页中所需要输入的汉字及格式
datax={
"word":"hello",
"sizes":60,
"fonts":"lfc.ttf",
"fontcolor":"#000000"
}
#对需要爬取的网页发送请求
response=requests.post('http://www.uustv.com/',data=datax)
#防止中文显示乱码
response.encoding="utf-8"
#获取网站源码
htmlx=response.text
#选择需要的源码段
zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括号里的.*?表示要取的值,这种方式可以获取动态数据,当输入的内容不同时,会自动获取不同的内容
三、通过图像处理(pillow)库处理图像并生成本地文件
1、编写程序生成本地文件
import requests#导入requests库
import re #正则表达式
from PIL import Image,ImageTk#导入pillow库
#网页中所需要输入的汉字及格式
datax={
"word":"hello",
"sizes":60,
"fonts":"lfc.ttf",
"fontcolor":"#000000"
}
#对需要爬取的网页发送请求
response=requests.post('http://www.uustv.com/',data=datax)
#防止中文显示乱码
response.encoding="utf-8"
#获取网站源码
htmlx=response.text
#选择需要的源码段
zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括号里的.*?表示要取的值,这种方式可以获取动态数据,当输入的内容不同时,会自动获取不同的内容
#获取网页图片地址,利用正则表达式的检索功能
imagex=re.findall(zz,htmlx)
#获取图片数据内容
imagedatax=requests.get("http://www.uustv.com/"+imagex[0]).content
#打开本地文件
ff=open('{}.gif'.format("hello"),"wb")
#将获取到的图片及内容写入本地文件
ff.write(imagedatax)
2、点击运行程序,之后点击刷新文件夹按键
当然此时我们可以进行个性签名的查看
这里我们还可以把输入的"hello"改成其它文字,你可以试试哦!!!(但是注意:代码中所涉及到的内容需全改,否则代码会报错)
四、把所有功能结合起来
1、我们跳转到网页进行数据的爬取,其实是当我们点击“确认”按钮时进行的操作,所以我们把图像处理(pillow)库处理图像并生成本地文件的代码段放到之前写的butonck函数就好了。之前我们只进行了是否为空的判断,所以加入else判断,也就是当输入的内容不为空时就能实现个性签名的功能。所以代码如下
def butonck():
#改变lab颜色
labelx["fg"]="blue"
#获取输入框值
textx=entryx.get()
#去掉字符串前后空格
textx=textx.strip()
if textx=='':
#弹出提示框
messagebox.showinfo("提示","输入不可为空")
else:
#网页中所需要输入的汉字及格式
datax={
"word":"hello",
"sizes":60,
"fonts":"lfc.ttf",
"fontcolor":"#000000"
}
#对需要爬取的网页发送请求
response=requests.post('http://www.uustv.com/',data=datax)
#防止中文显示乱码
response.encoding="utf-8"
#获取网站源码
htmlx=response.text
#选择需要的源码段
zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括号里的.*?表示要取的值,这种方式可以获取动态数据,当输入的内容不同时,会自动获取不同的内容
#获取网页图片地址
imagex=re.findall(zz,htmlx)
#获取图片数据
imagedatax=requests.get("http://www.uustv.com/"+imagex[0]).content
#打开本地文件
ff=open('{}.gif'.format("hello"),"wb")
#将获取到的数据写入本地文件
ff.write(imagedatax)
2、以上功能是静态获取输入的内容,显示我们需要动态获取,所以需要把代码中输入的内容"hello"改为前面获取框的值,也就是textx。所以代码修改为
def butonck():
#改变lab颜色
labelx["fg"]="blue"
#获取输入框值
textx=entryx.get()
#去掉字符串前后空格
textx=textx.strip()
if textx=='':
#弹出提示框
messagebox.showinfo("提示","输入不可为空")
else:
#网页中所需要输入的汉字及格式
datax={
"word":textx,
"sizes":60,
"fonts":"lfc.ttf",
"fontcolor":"#000000"
}
#对需要爬取的网页发送请求
response=requests.post('http://www.uustv.com/',data=datax)
#防止中文显示乱码
response.encoding="utf-8"
#获取网站源码
htmlx=response.text
#选择需要的源码段
zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括号里的.*?表示要取的值,这种方式可以获取动态数据,当输入的内容不同时,会自动获取不同的内容
#获取网页图片地址
imagex=re.findall(zz,htmlx)
#获取图片数据
imagedatax=requests.get("http://www.uustv.com/"+imagex[0]).content
#打开本地文件
ff=open('{}.gif'.format(textx),"wb")
#将获取到的数据写入本地文件
ff.write(imagedatax)
3、最后我们再利用tkinter和pillow的功能在界面显示出我们的个性签名
#利用tk和pillow的功能在界面显示获取的内容
bmx=ImageTk.PhotoImage(file='{}.gif'.format(textx))
lab2=Label(rview,image=bmx)
lab2.bm=bmx
lab2.grid(row=2,columnspan=2)
4、完整代码如下
from tkinter import *
from tkinter import messagebox
import requests#导入requests库
import re #正则表达式
from PIL import Image,ImageTk#导入pillow库
def butonck():
#改变lab颜色
labelx["fg"]="blue"
#获取输入框值
textx=entryx.get()
#去掉字符串前后空格
textx=textx.strip()
if textx=='':
#弹出提示框
messagebox.showinfo("提示","输入不可为空")
else:
#网页中所需要输入的汉字及格式
datax={
"word":textx,
"sizes":60,
"fonts":"lfc.ttf",
"fontcolor":"#000000"
}
#对需要爬取的网页发送请求
response=requests.post('http://www.uustv.com/',data=datax)
#防止中文显示乱码
response.encoding="utf-8"
#获取网站源码
htmlx=response.text
#选择需要的源码段
zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括号里的.*?表示要取的值,这种方式可以获取动态数据,当输入的内容不同时,会自动获取不同的内容
#获取网页图片地址
imagex=re.findall(zz,htmlx)
#获取图片数据
imagedatax=requests.get("http://www.uustv.com/"+imagex[0]).content
#打开本地文件
ff=open('{}.gif'.format(textx),"wb")
#将获取到的数据写入本地文件
ff.write(imagedatax)
#利用tk和pillow的功能在界面显示获取的内容
bmx=ImageTk.PhotoImage(file='{}.gif'.format(textx))
lab2=Label(rview,image=bmx)
lab2.bm=bmx
lab2.grid(row=2,columnspan=2)
#创建窗口
rview=Tk()
#标题
rview.title("个性签名")
#窗口大小 长高用小写x隔开
#rview.geometry("600x300")
#窗口基于屏幕的坐标 +x轴+y轴
rview.geometry("+500+200")
#创建lab标签
labelx=Label(rview,text="签名",fg="red",font=("微软雅黑",30))
#显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐
labelx.grid(row=0,column=0)
#创建输入框
entryx=Entry(rview,font=("微软雅黑",20))
#显示输入框
entryx.grid(row=0,column=1)
#创建按钮
buttonx=Button(rview,text="确定",font=("微软雅黑",30),command=butonck)
#显示按钮
buttonx.grid(row=1,column=2)
#消息循环 显示窗口
rview.mainloop()
5、运行效果
这样我们的项目就完成了,现在你可以尝试爬一下其它网页的内容了!
更多基础教程可查看:https://mindplus.dfrobot.com.cn/Python