学习python做一个图片分割和爬取的小工具

摘要

论文介绍了利用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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341