教你一招520Python表白(图片,爬虫 处理)!!!

TIPS:

程序效果:
视频地址 :查看程序效果的视频。
以上效果可在下面的项目中实现,视频中出现的文字可以修改,但是为了防止个别童靴的‘’拿来主义‘’这里就不说明哪里改了,自己慢慢看。
文末获取完整项目资源,含有所有媒体资源。
(希望各位,支持,转发,点赞,关注。象征性地要一波三连,)

项目结构

废话不多说,先来看看项目:
教你一招520Python表白(图片,爬虫 处理)!!!_第1张图片
这里先介绍一下各个模块的功能
Fold_win用于生成一个窗口,主要用于最后面显示表白语句。
main主控程序,负责最后的效果呈现。
Image_c负责对图像进行处理,添加图片水印,设置壁纸。
set_p_w获取相应的图片资源和表白的句子,主要是爬虫去爬取。
这里要说明一下的是虽然爬虫会爬取相应的资源,但是有一个文件必须手动下载,也就是自己去找,如图:
教你一招520Python表白(图片,爬虫 处理)!!!_第2张图片
这三个爬虫没有去爬取需要自己下载设置,当然你可以在文末获取完整码源。

获取图片

表白么,怎么也得弄几张背景图片衬托一下。
下面是
set_p_w
文件

import requests

import os

import re

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/80.0.3987.149 Safari/537.36'}

def get_iamges():
    try:

        images_path='D:/Confession/image'
        if not os.path.exists(images_path):
            os.makedirs(images_path)

            url='http://pic.netbian.com/e/search/result/?searchid=18'

            data=requests.get(url,headers=header)
            data=data.content.decode('gbk')
            #print(data)
            path='
  • =re.compile(path,re.M) url_=path.findall(data) #print(url_) view_url=[] urlx='http://pic.netbian.com' for i in url_: url_l=urlx+i view_url.append(url_l) #print(view_url) path_2='=re.compile(path_2) number=0 pics_url=[] for i in view_url: data_=requests.get(i,header) data_2=data_.content.decode('gbk') pic_=path_2.findall(data_2)[0] pic_url=urlx+pic_ pics_url.append(pic_url) if not os.path.exists(images_path): os.makedirs(images_path) data_p_=requests.get(pic_url,header) data_p=data_p_.content path_image_one=images_path+'/'+str(number)+'.jpg' number+=1 with open(path_image_one,'wb') as f: f.write(data_p) f.close() except Exception as e: print(e) #print(pics_url) #get_iamges() def get_words(): try: path='D:/Confession/words' if not os.path.exists(path): os.makedirs(path) url_w='https://baijiahao.baidu.com/s?id=1634005464753918917&wfr=spider&for=pc' data_w=requests.get(url_w,header) data_w=data_w.content.decode('utf-8') path_w_r='..(.*?).?' path_w_r=re.compile(path_w_r) words=path_w_r.findall(data_w) del words[-1] del words[-1] save_path=path+'/'+'word.love' with open(save_path,'w',encoding='utf-8') as f: f.write(str(words)) f.close() except Exception as e: print(e) if __name__=='__main__': get_iamges() get_words()
  • ``如上所示他还爬取了情话,当然你也可以自己写,存入D:\Confession\words\word.love。注意这里是写入list

    图片处理

    Image_c 的功能
    首先代码如下:

    from PIL import Image, ImageDraw, ImageFont,ImageSequence
    
    import win32api
    import win32con
    import win32gui
    import os
    
    
    
    
    
    def add_word(image, text, color=None):
        try:
            font=ImageFont.truetype("simsun.ttc", 30)
            r_image = image.convert('RGBA')
            text_lay = Image.new('RGBA', r_image.size, (255, 255, 255, 0))
            image_draw = ImageDraw.Draw(text_lay)
            text_x_, text_y_ = image_draw.textsize(text, font=font)
            text_xy = ((r_image.size[0] - text_x_) / 2, (r_image.size[1] - text_y_) / 2)
            image_draw.text(text_xy, text, color, font=font)
            image_ok=Image.alpha_composite(r_image,text_lay)
            #image_ok.show()
            return image_ok
        except Exception  as e:
            print(e)
    
    
    def watermark_on_gif(in_gif, out_gif, text='test'):
        """给gif添加水印,由于图像处理问题部分图像处理后会程灰黑色"""
    
        frames = []
        font = ImageFont.truetype('simsun.ttc', 44)
    
    
        im = Image.open(in_gif)
    
        water_im = Image.new("RGBA", im.size,(255, 255, 255, 0))
    
        draw = ImageDraw.Draw(water_im)
        text_x_, text_y_ = draw.textsize(text, font=font)
        text_xy = ((im.size[0] - text_x_) / 2, (im.size[1] - text_y_) / 2)
        draw.text(text_xy, text,font=font)
    
        for frame in ImageSequence.Iterator(im):
    
            frame = frame.convert("RGBA")
    
            frame.paste(water_im, None,water_im)
    
            frames.append(frame)
    
        newgif = frames[0]
    
            # quality参数为质量,time为每幅图像播放的毫秒时间
    
        newgif.save(out_gif, save_all=True,
                        append_images=frames[1:], quality=300, time=100)
        im.close()
    
    
    
    def setWallpaperFromBMP(imagepath):
            k = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
            win32api.RegSetValueEx(k, "WallpaperStyle", 0, win32con.REG_SZ, "2") #2拉伸适应桌面,0桌面居中
            win32api.RegSetValueEx(k, "TileWallpaper", 0, win32con.REG_SZ, "0")
            win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,imagepath, 1+2)
    
    def setWallPaper(imagePath,name):
            """
            Given a path to an image, convert it to bmp and set it as wallpaper
            """
            StoreFolder=r'D:\Confession\image_add_w'
            if  not os.path.exists(r'D:\Confession\image_add_w'):
                os.makedirs(StoreFolder)
            bmpImage = Image.open(imagePath)
            newPath = StoreFolder + '\\'+str(name)+'.bmp'
            bmpImage.save(newPath, "BMP")
            setWallpaperFromBMP(newPath)
    if __name__=='__main__':
    
        setWallPaper(r'D:\Confession\image\0.jpg',0)
        im_test=Image.open(r'D:\Confession\image\0.jpg')
        im_t=add_word(im_test,'''sdad\nsadasdas''')
        #im_t.show()
        #im_t.save('1.png','png')
    
    
        watermark_on_gif(r'D:\Confession\image\1.gif',r'D:\Confession\image\use.gif','XIA MENG I COMING')
    这里有两个关于图像处理的,和一个设置壁纸的函数。
    其中
    
    ```python
    
    def watermark_on_gif(in_gif, out_gif, text='test'):
        """给gif添加水印,由于图像处理问题部分图像处理后会程灰黑色"""
    
        frames = []
        font = ImageFont.truetype('simsun.ttc', 44)
    
    
        im = Image.open(in_gif)
    
        water_im = Image.new("RGBA", im.size,(255, 255, 255, 0))
    
        draw = ImageDraw.Draw(water_im)
        text_x_, text_y_ = draw.textsize(text, font=font)
        text_xy = ((im.size[0] - text_x_) / 2, (im.size[1] - text_y_) / 2)
        draw.text(text_xy, text,font=font)
    
        for frame in ImageSequence.Iterator(im):
    
            frame = frame.convert("RGBA")
    
            frame.paste(water_im, None,water_im)
    
            frames.append(frame)
    
        newgif = frames[0]
    
            # quality参数为质量,time为每幅图像播放的毫秒时间
    
        newgif.save(out_gif, save_all=True,
                        append_images=frames[1:], quality=300, time=100)
        im.close()
    
    
    

    用于处理gif动图,当然有一些瑕疵。而这个函数的主要目的是为了处理gif图片加入水印,之后在tkinter的窗口显示。
    (处理侯的gif)

    窗口处理

    现在万事俱备,但是如果只是单纯的换壁纸没啥意思,所以我们在来一个动态窗口,用tkinter播放gif动图。
    Fold_win函数。代码如下:

    import  tkinter as tk
    import threading
    
    
    def root_show(x_,y_,width,height,path,part):
        try:
            root =part
            screen_width=root.winfo_screenwidth()
            screen_height=root.winfo_screenheight()
            x=int((screen_width-width)/x_)
            y=int((screen_height-height)/y_)
            root.geometry(str(width)+'x'+str(height)+'+'+(str(x))+'+'+(str(y)))
    
            root.overrideredirect(True)
            #播放gif动态图
            unmdex=25#设置帧数
            frames=[tk.PhotoImage(file=path,format='gif -index %i' %(i)) for i in range(unmdex)]
            def update(id_x):
                frame=frames[id_x]
                id_x+=1
                label_1.configure(image=frame)
                root.after(100,update,id_x%unmdex)
            def down():
                root.quit()
    
    
            label_1=tk.Label(root)
            label_1.pack()
            root.after(0,update,0)
            root.after(10000,down)
    
            root.mainloop()
        except Exception as e:
            print(e)
    if __name__=='__main__':
    
        try:
            def first():
                root_show(4,2,300,300,'image/01.gif',tk.Tk())
            def secend():
                root_show(2, 2,350, 100, 'image/02.gif', tk.Toplevel())
                #在tkinter中只允许一个窗口的创建另一个窗口必须位frame或者置顶窗口
    
    
            Trade=[]#创建线程
            t_f=threading.Thread(target=first)
            Trade.append(t_f)
            t_s=threading.Thread(target=secend)
            Trade.append(t_s)
            for t in Trade:
                t.setDaemon(True)
                t.start()
            t_f.join()
            t_s.join()
        except Exception as e:
            print(e)
    
    

    这里,你们可能注意到了单独运行该模块可以同时运行两个窗口,这里本来是想要同时形成一个爱心矩阵播放动图来着的,但是这里比较麻烦,就算了,有兴趣的话你们可以试试。
    教你一招520Python表白(图片,爬虫 处理)!!!_第3张图片
    (这里没有调好窗口位置)

    主控程序

    也就是main函数,来,继续上代码。

    import set_p_w ,image_c,Fold_win
    from PIL import Image
    import time
    import tkinter as tk
    import playsound
    import os
    
    import threading
    def star_inital():
        try:
            sign_mark_0=r'D:\Confession\image\use.gif'
    
            sign_mark_1=r'D:\Confession\words'
            def do_fist():
                if not os.path.exists(sign_mark_0):
    
                    image_c.watermark_on_gif(r'D:\Confession\image\1.gif',r'D:\Confession\image\use.gif','XIA MENG I COMING!')
    
            def do_secend():
                if not os.path.exists(sign_mark_1):
    
    
    
                    set_p_w.get_iamges()
            def do_third():
                if not os.path.exists(sign_mark_1):
                    set_p_w.get_iamges()
    
            Tade=[]
    
            t_1=threading.Thread(target=do_fist)
            Tade.append(t_1)
            t_2=threading.Thread(target=do_secend)
            Tade.append(t_2)
            t_3=threading.Thread(target=do_third)
            Tade.append(t_3)
    
            for t in Tade:
                t.setDaemon(True)
                t.start()
            t_1.join()
            t_2.join()
            t_3.join()
        except Exception as e:
            print(e)
    
    def word_read():
    
        with open(r'D:\Confession\words\word.love','r',encoding='utf-8') as w:
            word_=w.read()
            safe={}
            word_=eval(word_,safe)
            w.close()
        #print(word_)
        bad_word='
        word=[]
    
        for wo_ in word_:
            if bad_word in wo_ :
                wo_=wo_.replace(bad_word,' ')
                wo_=wo_.replace(',','\n')
                wo_=wo_+'\n BY_HUTEROX(可删去)'
    
                word.append(wo_)
            else:
                wo_ = wo_.replace(',', '\n')
                #print(wo_)
                wo_ = wo_ + '\n BY_HUTEROX(可删去)'
    
                word.append(wo_)
        #print(word)
        return word
    
    
    star_inital()
    '''完成初始化这里请注意 D:\Confession\image\1.gif 需要自己额外下载,其余的可以通过爬虫自动下载'''
    
    
    
    
    def show():
    
        pic_n=0
        path_u=r'D:\Confession\image_add_w\mark_image.png'
        word=word_read()
        for text in word:
    
            path = 'D:\\Confession\\image\\' + str(pic_n) + '.jpg'
            pic_n+=1
            im_test = Image.open(path)
            im_t = image_c.add_word(im_test, text)
            im_t.save(path_u)
            image_c.setWallPaper(path_u,0)
            time.sleep(4)#参数可调
    
        Fold_win.root_show(2, 2,600, 600,r'D:\Confession\image\use.gif',tk.Tk())
        time.sleep(10)
    
    
    
    def play_sound():
        path=r'D:\Confession\music\music.mp3'
        playsound.playsound(path)
    
    #play_sound()
    def go():
        Tade_=[]
        tx_1=threading.Thread(target=show)
        Tade_.append(tx_1)
        tx_2=threading.Thread(target=play_sound)
        Tade_.append(tx_2)
        for x in Tade_:
            x.setDaemon(True)
            x.start()
        tx_1.join()
        #tx_2.join()二选一
    
    go()
    
    
    
    

    这里要提醒一下,就是star_inital()函数,它的作用就是初始化(本来是定义了一个类的,比较懒写了个函数。)把相应的要使用的媒体资源加载好。但是有时候会出问题。所以你可以先把其他的模块运行一遍,再跑一遍主函数。
    这里还有一个MP3文件要注意一下。
    教你一招520Python表白(图片,爬虫 处理)!!!_第4张图片
    这玩意,也就是背景音乐。哦对了,你还可以自己再写一个计时,先让主程序运行,然后程序计时,等你女票来了刚刚好运行效果。(PS:本人严格遵守《中学生行为规范》)

    SUMMARY:

    时间有限,水平有限,如有不足多多指教!
    码源地址:
    链接:https://pan.baidu.com/s/1X9pstnTI3X3qUZeERXILiQ
    提取码:i0o2

    你可能感兴趣的:(python,爬虫,番外杂谈,‘表白’计划)