摘要
论文介绍了利用python实现分割本地图片,爬取网站图片的功能。该项目能够自由选择分割方式,以及选择爬取图片的类型,完成此项目运用了python中的tkinter,os,urllib等模块,使用了python创建窗口,文件夹,点击按钮进入其它文件等的功能。
[if !supportLists]一. [endif]引言。
现在Python拥有许多模块,只要调用模块内容,就能很简便的写出一些功能。
我设计了一款关于图片分割,下载的小工具,不用PS这些软件,就能轻松的分割图片,下载图片也不用一张张图片慢慢下载,只要输入关键字就能下载相关图片。
[if !supportLists]二. [endif]系统结构。
系统结构图
系统流程图流程图
[if !supportLists]三.[endif]实现代码。
1、设置一个窗口:
2、设置背景图片:
3、按钮的设置:
1、先创建个分割图片的函数
一开始使用的是指定图片,这是之后完全的
2、创建函数,用来选择要分割的图片:
3、按钮来触发事件:
就是爬取百度图片,模仿于网上各位大佬的,大家可去看看,文章来自:
https://blog.csdn.net/hust_bochu_xuchao/article/details/79431145
[if !supportLists]1、 [endif]查看百度图片源码
查看源码时,点击下一页发现只有pn和gsm发生了变化
到目前为止,我知道的是:pn参数代表的是页数;word参数自然是关键词,需要转换编码格式。
所以,可以拼接出page请求的URL,代码如下:
[if !supportLists]2、 [endif]找到网页中的图片地址
·右键 查看网页源代码,然后点击那些分类,就是男女类似的关键词,然后就能获取如图下
·双击Name下面的网址后即可打开,分析JSON数据可知,发现一张图片有4种URL:fromURL,middleURL,thumbURL,objURL,前三种有反爬措施,因此采用objURL.其中的字段objURL,即表示了原图的下载地址。
但是objURL是经过加密的数据,需要经过解密才能正常使用,关于objURL解密可以看博文http://7dwww.com/article/36.html。
·根据URL地址,得到图片地址的代码为:
3、下载图片并保存
(四)完整代码
from tkinter import *
import os
#窗口设置
root =Tk()
root.geometry("1920x1080")#窗口大小
root.title("图片下载分割")#窗口标题
#背景图片
photo =PhotoImage(file="index.gif")
theLabel = Label(root,
justify=LEFT,#对齐方式
image=photo,#加入图片
compound = CENTER,#字体在图片前显示
fg = "white")#前景色
def image():
os.system("python image.py")
def download():
os.system("python download.py")
#按钮组件
#按钮的名字,字体,大小,颜色,按钮事件
B1 = Button(root,text="分割图片", font=("宋体",12), width=16,heigh=4, bg="#906b73", command=image)
B2 = Button(root,text="下载图片", font=("宋体",12),width=16,heigh=4, bg="#906b73",command=download)
#按钮位置
B1.place(relx=0.2,rely=0.5,anchor="center")
B2.place(relx=0.8,rely=0.5,anchor="center")
theLabel.pack()
root.mainloop()
from PIL import Image
from PIL import *
from tkinter importTk,mainloop,Label,Place
from tkinter import Button,Entry
from tkinter import filedialog
import os
root = Tk()
root.geometry("200x200")
'''
def num():
Label(root ,text="平行分割").grid(row = 0,column=0)
Label(root ,text="竖直分割").grid(row = 1,column=0)
e1= Entry(root)
e2= Entry(root)
e1.grid(row= 0,column=1,padx=10,pady=5)
e2.grid(row= 1,column=1,padx=10,pady=5)
m= e1.get()
n= e2.get()
return m,n
'''
#选择图片
def callback():
fileName = filedialog.askopenfilename()
return fileName
def break_up():
#image = '1.jpg'
#获得函数返回值
filename = callback()
# res = num()
# m = res([0])
# n = res([1])
img = Image.open(filename)
#在工作目录创建文件夹用来存放分割的图片
o = os.path.exists('fen')
if o==0:
os.mkdir('fen')
os.chdir('fen')
size = img.size
#print(size)
#分割方式
n=int(input("请输入平行分割块数:"))
m=int(input("请输入竖直分割块数:"))
#准备将图片切割成m*n张小图片
weight = int(size[0] // n)
height = int(size[1] // m)
#切割后的小图的宽度和高度
#print(weight, height)
for j in range(n):
for i in range(m):
box = (weight * i, height * j,weight * (i + 1), height * (j + 1))
region = img.crop(box)
region.save('分割_{}{}.png'.format(j, i))#保存图片
#but1=Button(root,text='确定',command=num).pack()
#按钮的设置
but2=Button(root,text='选择图片',command=break_up)
but2.place(relx=0.5,rely=0.5,anchor="center")
mainloop()
# coding=utf-8
"""根据搜索词下载百度图片"""
import re
import sys
import urllib
import os
import requests
import random
from tkinter importTk,mainloop,Label,Place,Entry,Button
def getPage(keyword,page,n):
page=page*n
keyword=urllib.parse.quote(keyword,safe='/')
url_begin="http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word="
url = url_begin+ keyword +"&pn=" +str(page) +"&gsm="+str(hex(page))+"&ct=&ic=0&lm=-1&width=0&height=0"
#代理IP
proxies =['101.254.136.130:443','114.234.80.188:9000']
proxy = random.choice(proxies)
proxy_support =urllib.request.ProxyHandler({'http':proxy})
opener =urllib.request.build_opener(proxy_support)
urllib.request.install_opener(opener)
return url
def get_onepage_urls(onepageurl):
try:
html = requests.get(onepageurl).text
except Exception as e:
print(e)
pic_urls = []
return pic_urls
pic_urls = re.findall('"objURL":"(.*?)",',html, re.S)
return pic_urls
def down_pic(pic_urls):
"""给出图片链接列表, 下载所有图片"""
o = os.path.exists('pict')
if o==0:
os.mkdir('pict')
os.chdir('pict')
for i, pic_url in enumerate(pic_urls):
try:
pic = requests.get(pic_url, timeout=15)
string =str(i + 1) + '.jpg'
with open(string,'wb') as f:
f.write(pic.content)
print('成功下载第%s张图片: %s'% (str(i + 1), str(pic_url)))
except Exception as e:
print('下载第%s张图片时失败:%s' % (str(i + 1), str(pic_url)))
print(e)
continue
'''
root = Tk()
root.geometry("100x100")
Label(root ,text="输入关键字下载").grid(row = 0,column=0)
e1= Entry(root)
e1.grid(row= 0,column=1,padx=10,pady=5)
w= e1.get()
but2=Button(root,text='确定',command=root.quit)
but2.grid(row=1,column=0,padx=10,pady=5)
'''
if __name__ == '__main__':
w= input("请输入关键词:")
keyword = w #关键词, 改为你想输入的词即可, 相当于在百度图片里搜索一样
page_begin=0
page_number=30
image_number=3
all_pic_urls = []
while 1:
if page_begin>image_number:
break
print("第%d次请求数据",[page_begin])
url=getPage(keyword,page_begin,page_number)
onepage_urls= get_onepage_urls(url)
page_begin += 1
all_pic_urls.extend(onepage_urls)
down_pic(list(set(all_pic_urls)))
mainloop()
[if !supportLists]四.[endif]实验。
[if !supportLists]五.[endif]总结和展望。
总结:该小工具是吧两个小功能合在一起,说起来也不复杂,比较难的还是第二个爬取图片的操作,一开始我是在小甲鱼视频里学的,但以前能爬的网站现在可能有改变了,需要自己改下操作。还有小工具还有不足之处,就是连续选择分割图片时会不停在里面创建文件夹放分割图片,有的图片会爬取失败。
参考文章:
[1] https://www.cnblogs.com/loyolh/p/12313210.html
[2] https://blog.csdn.net/hust_bochu_xuchao/article/details/79431145