zl程序教程

您现在的位置是:首页 >  其他

当前栏目

012:tkinter+爬虫设计对联软件

2023-03-15 22:05:06 时间

今天用Python设计一个小的对联软件!

其中运用到tkinter模块:

  • tkinter是Python下面向tk的图形界面接口库,可以方便地进行图形界面设计和交互操作编程。可以应用在Windows和Macintosh系统里,实现本地窗口风格。

先看下我们的软件效果图:

  • 首先,程序的界面设计还是利用tkinter来进行设计。
  • 通过tkinter的Entry类来输入我们的上联,然后通过button按钮,来启动程序进行设计。
  • button键之所以能够完成后续的运行,是因为其绑定了我们的后续的操作函数(也就是代码中的get_xialian函数)。
  • 通过绑定的函数实现了爬虫的抓取和对联的保存。

界面设计代码如下: if __name__ == '__main__':

root = Tk()
root.title("对联设计")
root.geometry("1200x500")
root.geometry("+100+150")

# 做成背景的装饰
pic1 = Image.open('1.png').resize((1200, 500))#加载图片并调整大小至窗口大小
pic = ImageTk.PhotoImage(pic1)
render = Label(root, image=pic, compound=tk.CENTER, justify=tk.LEFT)
render.place(x=0, y=0)

#标签 and 输入框
label = Label(root, text='上联(10字以内)', font=('微软雅黑', 20), fg='black')
label.grid(row=0,column=0,sticky=W)
entry = Entry(root, font=('宋体', 25),width = 15)
entry.grid(row=0, column=1,sticky=W)

#按钮
button = Button(root,text='设计下联', font=('微软雅黑', 20), command=get_xialian)
button.grid(row=1, column=0, sticky=W,pady=10)

root.mainloop()

界面设计完成了,而且绑定的函数也已经确定,接下来就是如何利用绑定的函数,来实现我们的后续操作,也就是爬虫抓取和保存。 首先对网页的分析,打开对联设计网页,并进入开发者模式,可以很轻松的找到我们需要的目标,如下图所示:

查看其请求的url,如下所示:

http://mduilian.388g.com/c.php?in=%E6%98%A5%E9%A3%8E%E9%80%81%E6%9A%96&len=0000&time=Thu%20Jan%2031%202019%2018:23:16%20GMT×tamp=1548930196082

这个url非常的复杂,需要我们仔细的进行分析:

  • 首先我们可以看出url有四个部分需要我们进行输入,然后细细分析发现,其in是我们输入的上联
  • time和timestamp顾名思义是时间和时间戳
  • 而len的意义是输入的字数,以0的个数来代替

有同学可能问,这哪里有时间和输入?分明都是些字母符号。这是因为这里的时间和输入都是经过url编码后的格式,我们可以通过urllib中的unquote函数来检查。稍微总结一下,上面的url比较负责,包含了url编码的输入,还有特定编码格式的时间,还有时间戳以及让人费解的len。

了解了url的结构组织,我们就可以很轻松的模拟浏览器进行访问,返回我们需要的内容。但是在后续又出现了乱码的问题,对于乱码的问题,我们将爬取到的数据采用“utf-8”编码进行解决。而针对于json库不能解析,我们采用正则表达式的方式,匹配“下联”,并将“下联”返回。

代码如下:

def Get_couplet(text):
    if text:
        patten = re.compile('''"XialianCandidates":["(.*?)"+]''', re.S)
        data2 = re.findall(patten, text)
        return data2
    else:
        return ["发生错误,请重新设计!"]



def get_xialian():
    shanglian  = entry.get()
    xialians = Get_couplet(Get_text(shanglian))
    scr1 = scrolledtext.ScrolledText(root, width=10, height=10, font=("隶书", 18))#设置滚动窗口的参数
    scr1.place(x=10, y=150)  # 滚动文本框在页面的位置
    scr1.insert(END, '上联:		')
    scr2 = scrolledtext.ScrolledText(root, width=10, height=10, font=("隶书", 18))  # 设置滚动窗口的参数
    scr2.place(x=1050, y=150)  # 滚动文本框在页面的位置
    scr2.insert(END, '下联:
')

    for Xialian in xialians:
        xialians = Xialian.split(',')
        for xialian in xialians:
            scr1.insert(END,shanglian+'	
')
            scr2.insert(END,xialian.replace('"','')+'
')

最后将得到的数据保存在根目录下,当对联保存完毕后,程序会弹出对话框,提醒对联已经完成,并到本地进行查看,运行效果如下图所示。

完整代码如下:

import requests
from urllib.parse import urlencode,quote,unquote
import time
import re

def Get_text(shanglian):
    GMT_FORMAT = '%a, %b %d %Y %H:%M:%S GMT'
    date = time.strftime(GMT_FORMAT,time.gmtime())
    url = 'http://mduilian.388g.com/c.php?in={0}&len={1}&time={2}+0800%20×tamp={3}'.format(quote(shanglian),
                                                                                                len(shanglian)*'0',quote(date),int(time.time()))
    headers = {
        'User-Agent':'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Mobile Safari/537.36',
        'Referer':'http://mduilian.388g.com/',
        'Host':'mduilian.388g.com',
        'Cookie':'PHPSESSID=llcj5u13als5fdqm3ps3pcbp47; __jsluid=0bb3b698bd1bcfe76b1190eada3bada8; BDTUJIAID=f47eb00df7502b6e56e052efda83cc57; Hm_lvt_b0a06229d110088000f04b20c9024b7d=1548900294,1548911084,1548911171,1548911511; Hm_lpvt_b0a06229d110088000f04b20c9024b7d=1548911511; Hm_lvt_696881765bc4548d58a559b742b5b6d0=1548900295,1548911084,1548911171,1548911511; Hm_lpvt_696881765bc4548d58a559b742b5b6d0=1548911511; Hm_lvt_3c8ecbfa472e76b0340d7a701a04197e=1548900300,1548911090,1548911177,1548911517; Hm_lpvt_3c8ecbfa472e76b0340d7a701a04197e=1548911517',
        'Accept-Encoding': 'gzip, deflate',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'Connection': 'keep-alive'
    }
    # print(url)
    # print(unquote(url))
    response = requests.get(url,headers=headers,timeout=50)
    response.encoding = 'utf-8'
    # print(response.text)
    return response.text


def Get_couplet(text):
    if text:
        patten = re.compile('''"XialianCandidates":["(.*?)"+]''', re.S)
        data2 = re.findall(patten, text)
        return data2
    else:
        return ["发生错误,请重新设计!"]



def get_xialian():
    shanglian  = entry.get()
    xialians = Get_couplet(Get_text(shanglian))
    scr1 = scrolledtext.ScrolledText(root, width=10, height=10, font=("隶书", 18))#设置滚动窗口的参数
    scr1.place(x=10, y=150)  # 滚动文本框在页面的位置
    scr1.insert(END, '上联:		')
    scr2 = scrolledtext.ScrolledText(root, width=10, height=10, font=("隶书", 18))  # 设置滚动窗口的参数
    scr2.place(x=1050, y=150)  # 滚动文本框在页面的位置
    scr2.insert(END, '下联:
')

    for Xialian in xialians:
        xialians = Xialian.split(',')
        for xialian in xialians:
            scr1.insert(END,shanglian+'	
')
            scr2.insert(END,xialian.replace('"','')+'
')


from tkinter import *
import tkinter as tk
from PIL import Image, ImageTk
from tkinter import scrolledtext

if __name__ == '__main__':
    root = Tk()
    root.title("LX设计")
    root.geometry("1200x500")
    root.geometry("+100+150")

    # 做成背景的装饰
    pic1 = Image.open('1.png').resize((1200, 500))#加载图片并调整大小至窗口大小
    pic = ImageTk.PhotoImage(pic1)
    render = Label(root, image=pic, compound=tk.CENTER, justify=tk.LEFT)
    render.place(x=0, y=0)

    #标签 and 输入框
    label = Label(root, text='上联(10字以内)', font=('微软雅黑', 20), fg='black')
    label.grid(row=0,column=0,sticky=W)
    entry = Entry(root, font=('宋体', 25),width = 15)
    entry.grid(row=0, column=1,sticky=W)

    #按钮
    button = Button(root,text='设计下联', font=('微软雅黑', 20), command=get_xialian)
    button.grid(row=1, column=0, sticky=W,pady=10)

    root.mainloop()