大家好,我是小刀!
这篇文章灵感源于最近发生的事,信息量都很大,然后突然就想看看历史的今天有发生过什么大事件,最后就写了个查看今日历史的小工具,下面就开始实战!
所需要用到的库:
import PySimpleGUI as sg
import stylecloud
from IPython.display import Image
import requests
from lxml import etree
安装可用pip命令进行安装:
pip install 库名
界面包含日期输入、开始查询按钮、事件展示、词云展示功能。日期输入、开始查询按钮、事件展示是在主界面,词云展示是在子界面,所以在创建窗体时,应该创建两个列表布局。
在词云展示界面,用的是PySimpleGUI库中的Image
方法,通过它可以创建一个图片展示区域。
# 主题设置
sg.theme('LightBrown3')
layout = [[
# 查询以及查询结果输出界面
sg.Column([
[sg.Text('请输入月:', font=("微软雅黑", 12)),
sg.Combo(values='', font=("微软雅黑", 10), auto_size_text=True,
size=(13, 20), key='keys'),
sg.Text('请输入日:', font=("微软雅黑", 12)),
sg.Combo(values='', font=("微软雅黑", 10), auto_size_text=True,
size=(13, 20), key='value'),
sg.Button('开始查询', font=("微软雅黑", 12))],
[sg.Text('事件展示:', justification='center')],
[sg.Output(size=(60, 20), font=("微软雅黑", 10))],
]),
# 给两个布局加一条线
sg.VSeperator(),
# 词云展示界面,界面大小和图片差不多即可
sg.Column([
[sg.Image(size=(450, 20), key="image")]
]),
]]
# 创建窗口
window = sg.Window('今日历史', layout, font=("微软雅黑", 12), default_element_size=(120, 40))
# 事件循环
while True:
# 关闭
event, values = window.read()
if event in (None, 'Exit'):
break
# 查询
if event == '开始查询':
if values['value'] and values['keys']:
yeu = values['keys']
day = values['value']
# 传入爬虫函数
Datainput(yeu, day)
else:
print('月或者日未填充!')
sg.popup('月或者日未填充!')
window.close()
生成的界面:
在对比几个网站后,最终选定以下网站:
https://today.help.bj.cn/
在上图中的红色框内容选择任一一天,该网址链接将会变为:
https://today.help.bj.cn/8/3/
可以发现,该链接后面增加了日期,后面只需要更改日期即可得到该日期下的网页内容。
对于如何解析网页相关操作,这里就不一一讲解了。但需要注意的是,如果在前期需要打印网页源代码的时候,会发生编码错误:
UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position 20672: illegal multibyte sequence
源于网页源代码中不止存在一种编码格式的内容,打印上无法识别,从而发生错误。当然,如果你直接打印我们需要的内容,他是不会报错的。编码错误解决方法是进入以下代码:
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030') # 改变标准输出的默认编码
本文用xpath语法进行解析网页,爬虫完整代码:
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
def Datainput(yeus, day):
resposen = requests.get(f'https://today.help.bj.cn/{yeus}/{day}/')
html = etree.HTML(resposen.text)
ul = html.xpath('//*[@id="container"]')
for li in ul:
day_title = li.xpath('./li[1]/h1/text()')
years = li.xpath('./li/div[1]/text()')
event_title = li.xpath('./li/div[2]/div/a/@title')
# 输出内容,center方法会在内容前面和后面,根据第一个数量参数生成第二个参数
print('=' * 48,
''.join(_title).center(90, " "),
'=' * 48
)
for i, e in zip(years, event_title):
print(str(i.center(20, " ")), e)
img_ci(event_title) # 传入词云函数
词云是通过stylecloud
库进行绘制的,通过里面的gen_stylecloud
方法,简单的设置下参数,就可以很简单的绘制出一张词云图了。因为我们的目的只是通过简单的展示下事件,关于其它一些停词在这里就不设置了。
def img_ci(event_title):
stylecloud.gen_stylecloud(text=' '.join(event_title), collocations=False,
font_path=r'C:\Windows\Fonts\msyh.ttc', # 字体
icon_name='fab fa-qq', # 蒙版
size=(450, 450), # 词云图大小
output_name='词云.png')
Image(filename='词云.png')
# 把生成的词云传入词云展示区域展示,通过size控制大小
window["image"].Update(filename='./词云.png', size=(450, 450))
词云的蒙版可以从以下链接查找更换:
https://fontawesome.dashgame.com/
最终效果展示:
以上就是本文的全部内容了,完整代码已在文中,如果你喜欢或者对你有帮助,请给我点个赞和在看吧!
本文分享自 Python与Excel之交 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!